fix(csv): unwrap temporal force-text values
This commit is contained in:
3 files changed
+135
-1
No files matched your search
@@ -4016,10 +4016,12 @@ fn has_numeric_leading_zero(value: &str) -> bool {
|
||||
}
|
||||
|
||||
fn is_likely_date(value: &str) -> bool {
|
||||
let value = crate::temporal_format::strip_csv_force_text_wrapper(value);
|
||||
["%Y-%m-%d", "%Y/%m/%d"].iter().any(|format| NaiveDate::parse_from_str(value, format).is_ok())
|
||||
}
|
||||
|
||||
fn is_likely_timestamp(value: &str) -> bool {
|
||||
let value = crate::temporal_format::strip_csv_force_text_wrapper(value);
|
||||
if DateTime::parse_from_rfc3339(value).is_ok() {
|
||||
return true;
|
||||
}
|
||||
@@ -9481,6 +9483,10 @@ mod tests {
|
||||
assert_eq!(xlsx_cell_value(&duration_cell), serde_json::json!("60:00:00"));
|
||||
assert_eq!(infer_value_type(&date_value), Some(ImportInferredType::Timestamp));
|
||||
assert_eq!(infer_value_type(&time_value), Some(ImportInferredType::Decimal));
|
||||
assert_eq!(
|
||||
infer_value_type(&serde_json::json!("=\"2026-06-24 02:00:07\"")),
|
||||
Some(ImportInferredType::Timestamp)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -148,6 +148,7 @@ fn parse_epoch_temporal(value: &str) -> Option<NaiveDateTime> {
|
||||
}
|
||||
|
||||
fn parse_temporal(value: &str, preferred_pattern: Option<&str>) -> Option<ParsedTemporal> {
|
||||
let value = strip_csv_force_text_wrapper(value);
|
||||
preferred_pattern
|
||||
.filter(|pattern| !pattern.trim().is_empty())
|
||||
.and_then(|pattern| parse_with_pattern(value, pattern))
|
||||
@@ -224,6 +225,10 @@ fn active_temporal_pattern(pattern: Option<&str>) -> Option<&str> {
|
||||
pattern.filter(|pattern| !pattern.trim().is_empty())
|
||||
}
|
||||
|
||||
pub(crate) fn strip_csv_force_text_wrapper(value: &str) -> &str {
|
||||
value.strip_prefix("=\"").and_then(|value| value.strip_suffix('"')).unwrap_or(value)
|
||||
}
|
||||
|
||||
pub fn format_temporal_export_row_cow<'a>(
|
||||
row: &'a [Value],
|
||||
column_types: &[Option<String>],
|
||||
@@ -633,6 +638,15 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn import_normalization_unwraps_csv_force_text_temporal_values() {
|
||||
assert_eq!(
|
||||
normalize_temporal_import_value(&json!("=\"2026-06-24 02:00:07\""), Some("DATETIME"), None),
|
||||
json!("2026-06-24 02:00:07")
|
||||
);
|
||||
assert_eq!(normalize_temporal_import_value(&json!("=\"2026-06-24\""), Some("DATE"), None), json!("2026-06-24"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn preserves_raw_export_values_when_pattern_requires_missing_fields() {
|
||||
assert_eq!(
|
||||
|
||||
Reference in new issue
Block a user