fix(import): a header-only or measureless file keeps its identity and a view of its own (improvise-lpzu, improvise-8jk6.13, improvise-8jk6.12)

ImportPipeline::from_merge seeds the File items and every file's columns
from Merged::sources, so a header-only CSV keeps its File item and its
columns (unseen columns are proposed as Labels, as an all-null column
is). A file with no measure column gets a records view filtered to it
instead of paging onto another file's hidden measure. Four per-file-view
rules the review found untested now each have a test that fails when
the rule is broken.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VdfEGXA7aJ6ftMsCc9PJze
This commit is contained in:
Claude (agent-lpzu)
2026-09-24 21:47:11 -07:00
committed by Edward Langley
parent 005b7a769a
commit c43ee72402
7 changed files with 295 additions and 17 deletions
+11 -3
View File
@@ -19,15 +19,16 @@ fn reloaded_folder_import() -> App {
"maat/coupling.csv",
"entity,coupled,degree,average-revs\nsrc/a.rs,src/b.rs,80,5\nsrc/b.rs,src/c.rs,40,3\n",
),
("maat/soc.csv", "entity,soc\n"),
];
for (path, body) in files {
fs.write(std::path::Path::new(path), body.as_bytes())
.unwrap();
}
let merged = merge_csvs_from(&fs, &files.map(|(p, _)| p)).unwrap();
let mut pipeline = ImportPipeline::new(serde_json::Value::Array(merged.records));
pipeline.sources = merged.sources;
let (wb, _) = pipeline.build_model_with_warnings().unwrap();
let (wb, _) = ImportPipeline::from_merge(merged)
.build_model_with_warnings()
.unwrap();
App::new(parse_md(&format_md(&wb)).unwrap(), None)
}
@@ -54,4 +55,11 @@ fn a_saved_per_file_view_projects_only_its_file() {
.collect();
assert_eq!(drawn, texts, "{view}");
}
// A header-only file: its item exists, and its view has nothing editable.
let soc = grid_in(&app, "soc", whole);
let file = soc.page_coords.iter().find(|p| p.cat == "File").unwrap();
assert_eq!(file.selected, "soc");
assert!(soc.records, "a file with no measure opens in records mode");
assert_eq!(soc.extent.rows, 0, "{soc:?}");
}