mirror of
https://github.com/storytold/deckcraft.git
synced 2026-10-24 10:37:03 -06:00
Rename SlideCraft to DeckCraft: crates, apps, binaries, app id, file extension (.deckcraft; .slidecraft files still open), packaging, docs; ROADMAP alpha and parity estimates
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
49278565ea
commit
ae9d525bce
+1
-1
@@ -34,7 +34,7 @@ const ASSET_EXT: &[&str] = &[
|
||||
"idml",
|
||||
"aco",
|
||||
"abr",
|
||||
"slidecraft",
|
||||
"deckcraft",
|
||||
"pptx",
|
||||
"potx",
|
||||
"ppsx",
|
||||
|
||||
+1
-1
@@ -95,7 +95,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn committed_icon_is_valid() {
|
||||
let path = crate::root().join("assets/app-icon/slidecraft.ico");
|
||||
let path = crate::root().join("assets/app-icon/deckcraft.ico");
|
||||
let Ok(ico) = std::fs::read(&path) else { return };
|
||||
assert_eq!(&ico[..4], &[0, 0, 1, 0]);
|
||||
let n = u16::from_le_bytes([ico[4], ico[5]]) as usize;
|
||||
|
||||
+29
-29
@@ -30,7 +30,7 @@ impl Class {
|
||||
}
|
||||
}
|
||||
|
||||
/// The layering table. Names are package names without the `slidecraft-`
|
||||
/// The layering table. Names are package names without the `deckcraft-`
|
||||
/// prefix.
|
||||
pub const TABLE: &[(&str, Class)] = &[
|
||||
("geom", Class::Layer(0)),
|
||||
@@ -60,7 +60,7 @@ pub const TABLE: &[(&str, Class)] = &[
|
||||
("mcp", Class::Layer(6)),
|
||||
("testkit", Class::Testkit),
|
||||
// L7 apps and tooling
|
||||
("slidecraft", Class::Exempt),
|
||||
("deckcraft", Class::Exempt),
|
||||
("cli", Class::Exempt),
|
||||
("web", Class::Exempt),
|
||||
("xtask", Class::Exempt),
|
||||
@@ -89,7 +89,7 @@ pub const UI_CRATES: &[&str] = &["egui", "eframe", "winit", "egui_kittest", "rfd
|
||||
pub const UI_MIN_LAYER: u8 = 6;
|
||||
|
||||
pub fn short_name(pkg: &str) -> &str {
|
||||
pkg.strip_prefix("slidecraft-").unwrap_or(pkg)
|
||||
pkg.strip_prefix("deckcraft-").unwrap_or(pkg)
|
||||
}
|
||||
|
||||
pub fn classify(pkg: &str) -> Option<Class> {
|
||||
@@ -147,7 +147,7 @@ impl std::fmt::Display for Violation {
|
||||
write!(f, "{krate}: standalone crate must not depend on workspace crate {dep}")
|
||||
}
|
||||
Violation::TestkitAsNormalDep { krate } => {
|
||||
write!(f, "{krate}: slidecraft-testkit may only be a dev-dependency")
|
||||
write!(f, "{krate}: deckcraft-testkit may only be a dev-dependency")
|
||||
}
|
||||
Violation::UiBelowL6 { krate, dep, layer } => {
|
||||
write!(f, "{krate} (L{layer}) depends on UI crate `{dep}`; UI toolkits are only allowed in L6+")
|
||||
@@ -256,75 +256,75 @@ mod tests {
|
||||
#[test]
|
||||
fn clean_downward_graph_passes() {
|
||||
let g = [
|
||||
c("slidecraft-geom", &[("kurbo", Normal, false)]),
|
||||
c("slidecraft-model", &[("slidecraft-geom", Normal, true)]),
|
||||
c("slidecraft-engine", &[("slidecraft-model", Normal, true), ("slidecraft-testkit", Dev, true)]),
|
||||
c("slidecraft-ui-egui", &[("slidecraft-engine", Normal, true), ("egui", Normal, false)]),
|
||||
c("slidecraft-cli", &[("slidecraft-ui-egui", Normal, true)]),
|
||||
c("deckcraft-geom", &[("kurbo", Normal, false)]),
|
||||
c("deckcraft-model", &[("deckcraft-geom", Normal, true)]),
|
||||
c("deckcraft-engine", &[("deckcraft-model", Normal, true), ("deckcraft-testkit", Dev, true)]),
|
||||
c("deckcraft-ui-egui", &[("deckcraft-engine", Normal, true), ("egui", Normal, false)]),
|
||||
c("deckcraft-cli", &[("deckcraft-ui-egui", Normal, true)]),
|
||||
];
|
||||
assert!(check(&g).is_empty(), "{:?}", check(&g));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn upward_dependency_flagged() {
|
||||
let v = check(&[c("slidecraft-model", &[("slidecraft-engine", Normal, true)])]);
|
||||
let v = check(&[c("deckcraft-model", &[("deckcraft-engine", Normal, true)])]);
|
||||
assert!(matches!(v[..], [Violation::Upward { from: 1, to: 5, .. }]));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sideways_dependency_flagged() {
|
||||
let v = check(&[c("slidecraft-text", &[("slidecraft-anim", Normal, true)])]);
|
||||
let v = check(&[c("deckcraft-text", &[("deckcraft-anim", Normal, true)])]);
|
||||
assert!(matches!(v[..], [Violation::Upward { from: 2, to: 2, .. }]));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn l0_foundations_are_independent() {
|
||||
let v = check(&[c("slidecraft-geom", &[("slidecraft-color", Normal, true)])]);
|
||||
let v = check(&[c("deckcraft-geom", &[("deckcraft-color", Normal, true)])]);
|
||||
assert!(matches!(v[..], [Violation::Upward { from: 0, to: 0, .. }]));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn self_dev_dependency_ignored() {
|
||||
assert!(check(&[c("slidecraft-model", &[("slidecraft-model", Dev, true)])]).is_empty());
|
||||
assert!(check(&[c("deckcraft-model", &[("deckcraft-model", Dev, true)])]).is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn upward_dev_dependency_flagged() {
|
||||
let v = check(&[c("slidecraft-geom", &[("slidecraft-model", Dev, true)])]);
|
||||
let v = check(&[c("deckcraft-geom", &[("deckcraft-model", Dev, true)])]);
|
||||
assert!(matches!(v[..], [Violation::Upward { kind: Dev, .. }]));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ui_crates_below_l6_flagged() {
|
||||
for dep in ["egui", "eframe", "winit", "egui_kittest", "rfd", "bevy_ecs", "bevy"] {
|
||||
let v = check(&[c("slidecraft-engine", &[(dep, Normal, false)])]);
|
||||
let v = check(&[c("deckcraft-engine", &[(dep, Normal, false)])]);
|
||||
assert!(matches!(v[..], [Violation::UiBelowL6 { layer: 5, .. }]), "{dep}");
|
||||
}
|
||||
assert!(check(&[c("slidecraft-engine", &[("egui_extras_not", Normal, false)])]).is_empty());
|
||||
assert!(check(&[c("slidecraft-mcp", &[("winit", Normal, false)])]).is_empty());
|
||||
assert!(check(&[c("deckcraft-engine", &[("egui_extras_not", Normal, false)])]).is_empty());
|
||||
assert!(check(&[c("deckcraft-mcp", &[("winit", Normal, false)])]).is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unregistered_crate_is_error() {
|
||||
let v = check(&[c("slidecraft-mystery", &[])]);
|
||||
assert!(matches!(&v[..], [Violation::Unregistered { krate }] if krate == "slidecraft-mystery"));
|
||||
let v = check(&[c("deckcraft-mystery", &[])]);
|
||||
assert!(matches!(&v[..], [Violation::Unregistered { krate }] if krate == "deckcraft-mystery"));
|
||||
assert!(v[0].to_string().contains("register"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn testkit_only_as_dev_dependency() {
|
||||
let v = check(&[c("slidecraft-render", &[("slidecraft-testkit", Normal, true)])]);
|
||||
let v = check(&[c("deckcraft-render", &[("deckcraft-testkit", Normal, true)])]);
|
||||
assert!(matches!(v[..], [Violation::TestkitAsNormalDep { .. }]));
|
||||
assert!(check(&[c("slidecraft-render", &[("slidecraft-testkit", Dev, true)])]).is_empty());
|
||||
assert!(check(&[c("deckcraft-render", &[("deckcraft-testkit", Dev, true)])]).is_empty());
|
||||
// testkit itself may use anything up to L5 but not L6 crates.
|
||||
assert!(check(&[c("slidecraft-testkit", &[("slidecraft-engine", Normal, true)])]).is_empty());
|
||||
assert!(!check(&[c("slidecraft-testkit", &[("slidecraft-ui-egui", Normal, true)])]).is_empty());
|
||||
assert!(check(&[c("deckcraft-testkit", &[("deckcraft-engine", Normal, true)])]).is_empty());
|
||||
assert!(!check(&[c("deckcraft-testkit", &[("deckcraft-ui-egui", Normal, true)])]).is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn apps_and_xtask_exempt() {
|
||||
for app in ["slidecraft", "slidecraft-cli", "slidecraft-web", "xtask"] {
|
||||
assert!(check(&[c(app, &[("egui", Normal, false), ("slidecraft-ui-egui", Normal, true)])]).is_empty());
|
||||
for app in ["deckcraft", "deckcraft-cli", "deckcraft-web", "xtask"] {
|
||||
assert!(check(&[c(app, &[("egui", Normal, false), ("deckcraft-ui-egui", Normal, true)])]).is_empty());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -332,17 +332,17 @@ mod tests {
|
||||
fn metadata_parsing() {
|
||||
let meta: Value = serde_json::from_str(
|
||||
r#"{"packages":[
|
||||
{"name":"slidecraft-model","dependencies":[
|
||||
{"name":"slidecraft-geom","kind":null,"path":"/x/crates/geom"},
|
||||
{"name":"deckcraft-model","dependencies":[
|
||||
{"name":"deckcraft-geom","kind":null,"path":"/x/crates/geom"},
|
||||
{"name":"serde","kind":null},
|
||||
{"name":"proptest","kind":"dev"}]},
|
||||
{"name":"slidecraft-geom","dependencies":[]}
|
||||
{"name":"deckcraft-geom","dependencies":[]}
|
||||
]}"#,
|
||||
)
|
||||
.unwrap();
|
||||
let g = from_metadata(&meta).unwrap();
|
||||
assert_eq!(g.len(), 2);
|
||||
let doc = g.iter().find(|c| c.name == "slidecraft-model").unwrap();
|
||||
let doc = g.iter().find(|c| c.name == "deckcraft-model").unwrap();
|
||||
assert!(doc.deps[0].workspace && !doc.deps[1].workspace);
|
||||
assert_eq!(doc.deps[2].kind, Dev);
|
||||
assert!(check(&g).is_empty());
|
||||
|
||||
Reference in New Issue
Block a user