From bd17aed1699873e5b0b66bf2dc7ee27a3f67ccf9 Mon Sep 17 00:00:00 2001 From: Edward Langley Date: Wed, 15 Apr 2026 23:05:17 -0700 Subject: [PATCH] refactor(io): scaffold empty improvise-io sub-crate Lay groundwork for Phase 3 of the workspace split (improvise-8zh): a new `crates/improvise-io/` sub-crate that will house the persistence and import layers once the files move in the next commit. Only scaffolding here: - New `crates/improvise-io/Cargo.toml` declares deps on improvise-core, improvise-formula, and the external crates persistence+import already use: anyhow, chrono, csv, flate2, indexmap, pest, pest_derive, serde, serde_json. Dev-deps: pest_meta, proptest, tempfile. - New `crates/improvise-io/src/lib.rs` re-exports the core modules under their conventional names (`format`, `model`, `view`, `workbook`, `formula`) so in the next commit the moved code's `crate::model::*`, `crate::view::*`, `crate::workbook::*`, `crate::format::*`, and `crate::formula::*` paths resolve unchanged. - Root `Cargo.toml` adds the new crate to workspace members and the main crate's `[dependencies]`, ready to receive the move. No source files change yet; cargo check --workspace still compiles as before. Co-Authored-By: Claude Opus 4.6 (1M context) --- Cargo.lock | 21 +++++++++++++++++++++ Cargo.toml | 3 ++- crates/improvise-io/Cargo.toml | 25 +++++++++++++++++++++++++ crates/improvise-io/src/lib.rs | 15 +++++++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 crates/improvise-io/Cargo.toml create mode 100644 crates/improvise-io/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 4860c20..996bf33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -739,6 +739,7 @@ dependencies = [ "flate2", "improvise-core", "improvise-formula", + "improvise-io", "indexmap", "pest", "pest_derive", @@ -775,6 +776,26 @@ dependencies = [ "serde", ] +[[package]] +name = "improvise-io" +version = "0.1.0-rc2" +dependencies = [ + "anyhow", + "chrono", + "csv", + "flate2", + "improvise-core", + "improvise-formula", + "indexmap", + "pest", + "pest_derive", + "pest_meta", + "proptest", + "serde", + "serde_json", + "tempfile", +] + [[package]] name = "indexmap" version = "2.14.0" diff --git a/Cargo.toml b/Cargo.toml index 55b98d2..e90d07f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = [".", "crates/improvise-formula", "crates/improvise-core"] +members = [".", "crates/improvise-formula", "crates/improvise-core", "crates/improvise-io"] [package] name = "improvise" @@ -20,6 +20,7 @@ path = "src/main.rs" [dependencies] improvise-core = { path = "crates/improvise-core" } improvise-formula = { path = "crates/improvise-formula" } +improvise-io = { path = "crates/improvise-io" } ratatui = "0.30" crossterm = "0.29" serde = { version = "1", features = ["derive"] } diff --git a/crates/improvise-io/Cargo.toml b/crates/improvise-io/Cargo.toml new file mode 100644 index 0000000..6366fa1 --- /dev/null +++ b/crates/improvise-io/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "improvise-io" +version = "0.1.0-rc2" +edition = "2024" +description = "Persistence and import for improvise (.improv format, CSV, JSON wizard)" +license = "Apache-2.0" +repository = "https://github.com/fiddlerwoaroof/improvise" + +[dependencies] +improvise-core = { path = "../improvise-core" } +improvise-formula = { path = "../improvise-formula" } +anyhow = "1" +chrono = { version = "0.4", features = ["serde"] } +csv = "1" +flate2 = "1" +indexmap = { version = "2", features = ["serde"] } +pest = "2.8.6" +pest_derive = "2.8.6" +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +[dev-dependencies] +pest_meta = "2.8.6" +proptest = "1" +tempfile = "3" diff --git a/crates/improvise-io/src/lib.rs b/crates/improvise-io/src/lib.rs new file mode 100644 index 0000000..9bdd4fb --- /dev/null +++ b/crates/improvise-io/src/lib.rs @@ -0,0 +1,15 @@ +//! I/O layer for `improvise`: `.improv` persistence (parse/format, save/load, +//! CSV export) and import (CSV/JSON wizard, field analyzer). +//! +//! Depends on `improvise-core` for the data model (`Model`, `View`, +//! `Workbook`, `CellKey`, `CellValue`, `GridLayout`, `Axis`, `Group`) and on +//! `improvise-formula` for formula parsing. Has no awareness of UI or +//! commands — builds standalone via `cargo build -p improvise-io`. +//! +//! Re-exports the core modules under their conventional names so code in +//! this crate can keep using `crate::model::*`, `crate::view::*`, +//! `crate::workbook::*`, `crate::format::*`, and `crate::formula::*` paths. +//! +//! Scaffolded empty in this commit; the modules land in the next commit. +pub use improvise_core::{format, model, view, workbook}; +pub use improvise_formula as formula;