From 790312a5b03aef3cc588e18d913b57e2887896a5 Mon Sep 17 00:00:00 2001 From: astrid Date: Mon, 15 Dec 2025 20:26:25 +0100 Subject: [PATCH] fix: lack of .model.json support --- ...__tests__build__model_json_name_input.snap | 23 ++++++++++++++++++ .../default.project.json | 11 +++++++++ .../model_json_name_input/src/Bar.model.json | 5 ++++ ...syncback_util__model_json_name-stdout.snap | 6 +++++ ...__model_json_name-src__foo.model.json.snap | 9 +++++++ .../input-project/default.project.json | 11 +++++++++ .../input-project/src/foo.model.json | 5 ++++ .../syncback-tests/model_json_name/input.rbxl | Bin 0 -> 310 bytes src/snapshot_middleware/json_model.rs | 20 ++++++--------- tests/tests/build.rs | 1 + tests/tests/syncback.rs | 2 ++ 11 files changed, 80 insertions(+), 13 deletions(-) create mode 100644 rojo-test/build-test-snapshots/end_to_end__tests__build__model_json_name_input.snap create mode 100644 rojo-test/build-tests/model_json_name_input/default.project.json create mode 100644 rojo-test/build-tests/model_json_name_input/src/Bar.model.json create mode 100644 rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__model_json_name-stdout.snap create mode 100644 rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__model_json_name-src__foo.model.json.snap create mode 100644 rojo-test/syncback-tests/model_json_name/input-project/default.project.json create mode 100644 rojo-test/syncback-tests/model_json_name/input-project/src/foo.model.json create mode 100644 rojo-test/syncback-tests/model_json_name/input.rbxl diff --git a/rojo-test/build-test-snapshots/end_to_end__tests__build__model_json_name_input.snap b/rojo-test/build-test-snapshots/end_to_end__tests__build__model_json_name_input.snap new file mode 100644 index 00000000..018fcd34 --- /dev/null +++ b/rojo-test/build-test-snapshots/end_to_end__tests__build__model_json_name_input.snap @@ -0,0 +1,23 @@ +--- +source: tests/tests/build.rs +assertion_line: 109 +expression: contents +--- + + + + model_json_name_input + + + + Workspace + false + + + + /Bar + + + + + diff --git a/rojo-test/build-tests/model_json_name_input/default.project.json b/rojo-test/build-tests/model_json_name_input/default.project.json new file mode 100644 index 00000000..6c01ae9e --- /dev/null +++ b/rojo-test/build-tests/model_json_name_input/default.project.json @@ -0,0 +1,11 @@ +{ + "name": "model_json_name_input", + "tree": { + "$className": "DataModel", + "Workspace": { + "$className": "Workspace", + "$path": "src" + } + } +} + diff --git a/rojo-test/build-tests/model_json_name_input/src/Bar.model.json b/rojo-test/build-tests/model_json_name_input/src/Bar.model.json new file mode 100644 index 00000000..4fef832e --- /dev/null +++ b/rojo-test/build-tests/model_json_name_input/src/Bar.model.json @@ -0,0 +1,5 @@ +{ + "name": "/Bar", + "className": "StringValue" +} + diff --git a/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__model_json_name-stdout.snap b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__model_json_name-stdout.snap new file mode 100644 index 00000000..c8e32ca7 --- /dev/null +++ b/rojo-test/syncback-test-snapshots/end_to_end__rojo_test__syncback_util__model_json_name-stdout.snap @@ -0,0 +1,6 @@ +--- +source: tests/rojo_test/syncback_util.rs +assertion_line: 101 +expression: "String::from_utf8_lossy(&output.stdout)" +--- + diff --git a/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__model_json_name-src__foo.model.json.snap b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__model_json_name-src__foo.model.json.snap new file mode 100644 index 00000000..ad4017dd --- /dev/null +++ b/rojo-test/syncback-test-snapshots/end_to_end__tests__syncback__model_json_name-src__foo.model.json.snap @@ -0,0 +1,9 @@ +--- +source: tests/tests/syncback.rs +assertion_line: 31 +expression: src/foo.model.json +--- +{ + "name": "/Bar", + "className": "StringValue" +} diff --git a/rojo-test/syncback-tests/model_json_name/input-project/default.project.json b/rojo-test/syncback-tests/model_json_name/input-project/default.project.json new file mode 100644 index 00000000..8eaa84a8 --- /dev/null +++ b/rojo-test/syncback-tests/model_json_name/input-project/default.project.json @@ -0,0 +1,11 @@ +{ + "name": "model_json_name", + "tree": { + "$className": "DataModel", + "Workspace": { + "$className": "Workspace", + "$path": "src" + } + } +} + diff --git a/rojo-test/syncback-tests/model_json_name/input-project/src/foo.model.json b/rojo-test/syncback-tests/model_json_name/input-project/src/foo.model.json new file mode 100644 index 00000000..4fef832e --- /dev/null +++ b/rojo-test/syncback-tests/model_json_name/input-project/src/foo.model.json @@ -0,0 +1,5 @@ +{ + "name": "/Bar", + "className": "StringValue" +} + diff --git a/rojo-test/syncback-tests/model_json_name/input.rbxl b/rojo-test/syncback-tests/model_json_name/input.rbxl new file mode 100644 index 0000000000000000000000000000000000000000..9c8f15100c385367747f981e911c47875d473822 GIT binary patch literal 310 zcmcC1%1_G4uTbp#&&wsn#lXPC0Kq^C3_SgUL*#%g87Th)FNnbn#K9#+nR)49i8-aI z42)1&kZM^VTN=v$zyp%u1mf`gqU_>=#N<>)s9Gk*fFS<>aiEkaOfegX!2-m7iMgqa zAcnqEVi8Cg$aX0p27wRUAQRxqPz(pDl?Td#+yDX}_&{off!HrKHKjNpvn;>FH#5B` uu_QA;kBK25$S*_yC<$|cDbV|j3==?M00d0Tu6{0H7RU||u+fKvmK^{=_%Bre literal 0 HcmV?d00001 diff --git a/src/snapshot_middleware/json_model.rs b/src/snapshot_middleware/json_model.rs index 185ab9ee..e7b929b5 100644 --- a/src/snapshot_middleware/json_model.rs +++ b/src/snapshot_middleware/json_model.rs @@ -35,19 +35,12 @@ pub fn snapshot_json_model( format!("File is not a valid JSON model: {}", path.display()) })?; - if let Some(top_level_name) = &instance.name { - let new_name = format!("{}.model.json", top_level_name); + // If the JSON has a name property, preserve it in metadata for syncback + let specified_name = instance.name.clone(); - log::warn!( - "Model at path {} had a top-level Name field. \ - This field has been ignored since Rojo 6.0.\n\ - Consider removing this field and renaming the file to {}.", - new_name, - path.display() - ); - } - - instance.name = Some(name.to_owned()); + // Use the name from JSON if present, otherwise fall back to filename-derived name + let instance_name = specified_name.clone().unwrap_or_else(|| name.to_owned()); + instance.name = Some(instance_name); let id = instance.id.take().map(RojoRef::new); let schema = instance.schema.take(); @@ -62,7 +55,8 @@ pub fn snapshot_json_model( .relevant_paths(vec![path.to_path_buf()]) .context(context) .specified_id(id) - .schema(schema); + .schema(schema) + .specified_name(specified_name); Ok(Some(snapshot)) } diff --git a/tests/tests/build.rs b/tests/tests/build.rs index db3cdcc8..8776d7ef 100644 --- a/tests/tests/build.rs +++ b/tests/tests/build.rs @@ -56,6 +56,7 @@ gen_build_tests! { server_in_folder, server_init, slugified_name_roundtrip, + model_json_name_input, txt, txt_in_folder, unresolved_values, diff --git a/tests/tests/syncback.rs b/tests/tests/syncback.rs index c21824ce..e2b1f6f5 100644 --- a/tests/tests/syncback.rs +++ b/tests/tests/syncback.rs @@ -89,4 +89,6 @@ syncback_tests! { // Ensures that instances with names containing illegal characters get slugified filenames // and preserve their original names in meta.json slugified_name => ["src/_Script/init.meta.json", "src/_Script/init.server.luau", "src/_Folder/init.meta.json"], + // Ensures that .model.json files preserve the name property + model_json_name => ["src/foo.model.json"], }