Skip to content

Commit 2ff0aa9

Browse files
Merge pull request #62 from soma-smart/fix/v1.7.2-improvements
Prepare v1.7.2: fix file naming, improve error messages
2 parents 77e99b8 + 1799902 commit 2ff0aa9

14 files changed

Lines changed: 172 additions & 29 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "fakelake"
3-
version = "1.7.0"
3+
version = "1.7.2"
44
edition = "2021"
55
rust-version = "1.90.0"
66

src/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ impl Column {
126126
let provider: Box<dyn Provider> =
127127
match ProviderBuilder::get_corresponding_provider(provider, column) {
128128
Ok(value) => CorruptedProvider::new_from_yaml(column, value),
129-
Err(e) => return Err(FakeLakeError::BadYAMLFormat(e.to_string())),
129+
Err(e) => return Err(e),
130130
};
131131

132132
let column = Column {

src/errors.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ use std::io;
44
#[derive(Debug)]
55
pub enum FakeLakeError {
66
BadYAMLFormat(String),
7+
UnknownProvider {
8+
provider: String,
9+
available: &'static [&'static str],
10+
},
711
IOError(io::Error),
812
CSVError(csv::Error),
913
JSONError(serde_json::Error),
@@ -14,8 +18,25 @@ pub enum FakeLakeError {
1418
#[cfg(not(tarpaulin_include))]
1519
impl fmt::Display for FakeLakeError {
1620
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
17-
// For now, use the debug derived version
18-
write!(f, "{:?}", self)
21+
match self {
22+
FakeLakeError::BadYAMLFormat(msg) => write!(f, "{}", msg),
23+
FakeLakeError::UnknownProvider {
24+
provider,
25+
available,
26+
} => {
27+
write!(
28+
f,
29+
"Unknown provider: {}. Expected one of: {}",
30+
provider,
31+
available.join(", ")
32+
)
33+
}
34+
FakeLakeError::IOError(err) => write!(f, "IO error: {}", err),
35+
FakeLakeError::CSVError(err) => write!(f, "CSV error: {}", err),
36+
FakeLakeError::JSONError(err) => write!(f, "JSON error: {}", err),
37+
FakeLakeError::ParquetError(err) => write!(f, "Parquet error: {}", err),
38+
FakeLakeError::ArrowError(err) => write!(f, "Arrow error: {}", err),
39+
}
1940
}
2041
}
2142

src/generate/output_format.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,18 @@ pub trait OutputFormat {
3030
);
3131
}
3232

33+
let extension = self.get_extension();
34+
3335
for f in 0..files {
3436
let file_name = if files == 1 {
3537
default_file_name.clone()
3638
} else {
37-
format!("{}_{}", default_file_name, f)
39+
match default_file_name.strip_suffix(extension) {
40+
Some(stem) if !extension.is_empty() => {
41+
format!("{}_{}{}", stem, f, extension)
42+
}
43+
_ => format!("{}_{}", default_file_name, f),
44+
}
3845
};
3946

4047
let file_seed = rng::derive_seed(root_seed, rng::DOMAIN_FILE, &[f as u64]);

src/providers/constant/builder.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
use yaml_rust::Yaml;
22

3-
use crate::{errors::FakeLakeError, providers::provider::Provider};
3+
use crate::errors::FakeLakeError;
4+
use crate::providers::provider::{unknown_provider, Provider};
45

56
use super::{external, string};
67

8+
const AVAILABLE: &[&str] = &["constant.string", "constant.external"];
9+
710
pub fn get_corresponding_provider(
811
mut provider_split: std::str::Split<'_, char>,
912
column: &Yaml,
1013
) -> Result<Box<dyn Provider>, FakeLakeError> {
1114
match provider_split.next() {
1215
Some("string") => Ok(string::new_from_yaml(column)),
1316
Some("external") => Ok(external::new_from_yaml(column)),
14-
_ => Err(FakeLakeError::BadYAMLFormat("".to_string())),
17+
other => Err(unknown_provider("constant", other, AVAILABLE)),
1518
}
1619
}
1720

src/providers/increment/builder.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
use crate::errors::FakeLakeError;
2-
use crate::providers::provider::Provider;
2+
use crate::providers::provider::{unknown_provider, Provider};
33

44
use super::integer;
55

66
use yaml_rust::Yaml;
77

8+
const AVAILABLE: &[&str] = &["increment.integer"];
9+
810
pub fn get_corresponding_provider(
911
mut provider_split: std::str::Split<'_, char>,
1012
column: &Yaml,
1113
) -> Result<Box<dyn Provider>, FakeLakeError> {
1214
match provider_split.next() {
1315
Some("integer") => Ok(integer::new_from_yaml(column)),
14-
_ => Err(FakeLakeError::BadYAMLFormat("".to_string())),
16+
other => Err(unknown_provider("increment", other, AVAILABLE)),
1517
}
1618
}
1719

src/providers/person/builder.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
use crate::errors::FakeLakeError;
22
use crate::providers::constant::external;
3-
use crate::providers::provider::Provider;
3+
use crate::providers::provider::{unknown_provider, Provider};
44

55
use super::email;
66

77
use once_cell::sync::Lazy;
88
use yaml_rust::Yaml;
99

10+
const AVAILABLE: &[&str] = &["person.email", "person.fname", "person.lname"];
11+
1012
static FIRST_NAMES: Lazy<Vec<String>> = Lazy::new(|| {
1113
let raw_first_names = include_str!("../../../static/first_name_fr.txt");
1214
raw_first_names.lines().map(|v| v.to_string()).collect()
@@ -25,7 +27,7 @@ pub fn get_corresponding_provider(
2527
Some("email") => Ok(email::new_from_yaml(column)),
2628
Some("fname") => Ok(external::new(FIRST_NAMES.to_vec())),
2729
Some("lname") => Ok(external::new(LAST_NAMES.to_vec())),
28-
_ => Err(FakeLakeError::BadYAMLFormat("".to_string())),
30+
other => Err(unknown_provider("person", other, AVAILABLE)),
2931
}
3032
}
3133

src/providers/provider.rs

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,30 @@ impl ProviderBuilder {
106106
Some("random") => {
107107
providers::random::builder::get_corresponding_provider(provider_split, column)
108108
}
109-
_ => Err(unknown_provider(provider)),
109+
other => Err(unknown_provider(
110+
"",
111+
other,
112+
&["constant.*", "increment.*", "person.*", "random.*"],
113+
)),
110114
}
111115
}
112116
}
113117

114-
pub fn unknown_provider(wrong_provider: &str) -> FakeLakeError {
115-
FakeLakeError::BadYAMLFormat(format!("Unknown provider: {}", wrong_provider))
118+
pub fn unknown_provider(
119+
prefix: &str,
120+
segment: Option<&str>,
121+
available: &'static [&'static str],
122+
) -> FakeLakeError {
123+
let provider = match (prefix, segment) {
124+
("", Some(s)) => s.to_string(),
125+
("", None) => "<missing>".to_string(),
126+
(p, Some(s)) => format!("{}.{}", p, s),
127+
(p, None) => format!("{}.<missing>", p),
128+
};
129+
FakeLakeError::UnknownProvider {
130+
provider,
131+
available,
132+
}
116133
}
117134

118135
#[cfg(test)]
@@ -195,6 +212,36 @@ mod tests {
195212
}
196213
}
197214

215+
#[test]
216+
fn given_valid_provider_case_insensitive_should_return_provider() {
217+
let provider_names = [
218+
"Constant.String",
219+
"CONSTANT.STRING",
220+
"Increment.Integer",
221+
"INCREMENT.INTEGER",
222+
"Person.Email",
223+
"PERSON.EMAIL",
224+
"Random.String.Alphanumeric",
225+
"RANDOM.STRING.ALPHANUMERIC",
226+
"Random.Number.I32",
227+
"RANDOM.NUMBER.F64",
228+
"Random.Date.Date",
229+
"RANDOM.DATE.DATETIME",
230+
];
231+
for provider_name in provider_names {
232+
let yaml_str = format!("name: name{}provider: {}", '\n', provider_name);
233+
let column = &YamlLoader::load_from_str(yaml_str.as_str()).unwrap()[0];
234+
235+
match ProviderBuilder::get_corresponding_provider(provider_name, column) {
236+
Ok(_) => (),
237+
_ => panic!(
238+
"Provider '{}' should be resolved case-insensitively",
239+
provider_name
240+
),
241+
}
242+
}
243+
}
244+
198245
#[test]
199246
fn given_wrong_provider_should_return_error() {
200247
let provider_name = "not_a_provider";

src/providers/random/builder.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
use crate::errors::FakeLakeError;
2-
use crate::providers::provider::Provider;
2+
use crate::providers::provider::{unknown_provider, Provider};
33

44
use super::{bool, date, number, string};
55

66
use yaml_rust::Yaml;
77

8+
const AVAILABLE: &[&str] = &[
9+
"random.bool",
10+
"random.date.*",
11+
"random.number.*",
12+
"random.string.*",
13+
];
14+
815
pub fn get_corresponding_provider(
916
mut provider_split: std::str::Split<'_, char>,
1017
column: &Yaml,
@@ -14,7 +21,7 @@ pub fn get_corresponding_provider(
1421
Some("date") => date::builder::get_corresponding_provider(provider_split, column),
1522
Some("number") => number::builder::get_corresponding_provider(provider_split, column),
1623
Some("string") => string::builder::get_corresponding_provider(provider_split, column),
17-
_ => Err(FakeLakeError::BadYAMLFormat("".to_string())),
24+
other => Err(unknown_provider("random", other, AVAILABLE)),
1825
}
1926
}
2027

0 commit comments

Comments
 (0)