diff --git a/Cargo.lock b/Cargo.lock index a5d4a372..2269e2aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1712,9 +1712,9 @@ dependencies = [ [[package]] name = "latestmap" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d4b66051ad858040146bbcf6734e84724f04d7522ca2152775d6af858fd1da7" +checksum = "41f41a95c005e25c4d48b8cba61e11c5701241326db35307c3f88d43cd89734f" [[package]] name = "lazy_static" @@ -4717,6 +4717,7 @@ dependencies = [ "self_update", "serde", "serde_json", + "tempfile", "tokio", "tokio-util", "tower", diff --git a/extensions/beancount/Cargo.toml b/extensions/beancount/Cargo.toml index b6840d5c..f75487cb 100644 --- a/extensions/beancount/Cargo.toml +++ b/extensions/beancount/Cargo.toml @@ -16,7 +16,7 @@ log = { workspace = true } chrono = { version = "0.4", features = ["serde"] } bigdecimal = { workspace = true } snailquote = "0.3" -latestmap = "0.1" +latestmap = "0.2" once_cell = "1.19" [dev-dependencies] diff --git a/extensions/beancount/src/lib.rs b/extensions/beancount/src/lib.rs index 71ae6bd2..816d42d4 100644 --- a/extensions/beancount/src/lib.rs +++ b/extensions/beancount/src/lib.rs @@ -66,8 +66,15 @@ impl DataType for Beancount { } BeancountOnlyDirective::Balance(balance) => { let date = balance.date.naive_date(); - let pad_account = pad_info.get_latest(&date).and_then(|it| it.get(&balance.account.content)); - + let latest_pad_info = pad_info.pop_latest(&date); + let pad_account = match latest_pad_info { + Some((pad_key, mut pad_map)) => { + let target_pad_account = pad_map.remove(&balance.account.content); + pad_info.insert(pad_key, pad_map); + target_pad_account + } + _ => None, + }; if let Some(pad_account) = pad_account { // balance pad ret.push(Spanned { diff --git a/integration-tests/pad_info_should_be_used_once_beancount/main.bean b/integration-tests/pad_info_should_be_used_once_beancount/main.bean new file mode 100644 index 00000000..b67057a2 --- /dev/null +++ b/integration-tests/pad_info_should_be_used_once_beancount/main.bean @@ -0,0 +1,9 @@ +1970-01-01 commodity CNY + +1970-01-01 open Assets:A CNY +1970-01-01 open Equity:OpenBalance CNY + +2017-12-01 pad Assets:A Equity:OpenBalance + +2017-12-01 balance Assets:A 0.10 CNY +2017-12-02 balance Assets:A 0.10 CNY diff --git a/integration-tests/pad_info_should_be_used_once_beancount/validations.json b/integration-tests/pad_info_should_be_used_once_beancount/validations.json new file mode 100644 index 00000000..d7c465cc --- /dev/null +++ b/integration-tests/pad_info_should_be_used_once_beancount/validations.json @@ -0,0 +1,20 @@ +[ + { + "uri": "/api/store", + "validations": [ + [ + "$.data.errors.length()", + 0 + ], + [ + "$.data.transactions[*][?(@.sequence==1)].flag", + "BalancePad" + ], + [ + "$.data.transactions[*][?(@.sequence==2)].flag", + "BalanceCheck" + ] + ] + } +] + diff --git a/zhang-cli/Cargo.toml b/zhang-cli/Cargo.toml index ea2a1d9a..02cf5e93 100644 --- a/zhang-cli/Cargo.toml +++ b/zhang-cli/Cargo.toml @@ -44,3 +44,4 @@ tower = "0.4" mime = "0.3" http-body-util = "0.1" walkdir = "2" +tempfile = "3.8.0" \ No newline at end of file diff --git a/zhang-cli/src/main.rs b/zhang-cli/src/main.rs index a33b5853..90116f9a 100644 --- a/zhang-cli/src/main.rs +++ b/zhang-cli/src/main.rs @@ -191,7 +191,6 @@ async fn main() { #[cfg(test)] mod test { - use std::env::temp_dir; use std::io::{stdout, Write}; use std::sync::Arc; @@ -202,6 +201,7 @@ mod test { use jsonpath_rust::JsonPathQuery; use serde::Deserialize; use serde_json::Value; + use tempfile::tempdir; use tokio::sync::{mpsc, RwLock}; use tower::util::ServiceExt; use zhang_core::ledger::Ledger; @@ -239,7 +239,8 @@ mod test { } let original_test_source_folder = path.path(); pprintln!(" \x1b[0;32mIntegration Test\x1b[0;0m: {}", original_test_source_folder.display()); - let test_temp_folder = temp_dir(); + let tempdir = tempdir().unwrap(); + let test_temp_folder = tempdir.path(); for entry in walkdir::WalkDir::new(&original_test_source_folder).into_iter().filter_map(|e| e.ok()) { if entry.path().eq(&original_test_source_folder) { @@ -266,11 +267,10 @@ mod test { pprintln!(" \x1b[0;32mTesting\x1b[0;0m: {}", &validation.uri); let is_zhang_test = test_temp_folder.join("main.zhang").exists(); - let data_source = OpendalDataSource::from_env( FileSystem::Fs, &mut ServerOpts { - path: test_temp_folder.clone(), + path: test_temp_folder.to_path_buf(), endpoint: if is_zhang_test { "main.zhang".to_owned() } else { "main.bean".to_owned() }, addr: "".to_string(), port: 0, @@ -282,7 +282,7 @@ mod test { .await; let data_source = Arc::new(data_source); let ledger = Ledger::async_load( - test_temp_folder.clone(), + test_temp_folder.to_path_buf(), if is_zhang_test { "main.zhang".to_owned() } else { "main.bean".to_owned() }, data_source.clone(), )