From 64e65dcd447caec01eca3efbf6e89c0854c47492 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Tue, 17 Mar 2026 18:31:00 +0000 Subject: [PATCH] asset metadata form added for tiles and sound --- .../services/PackerAssetDetailsService.java | 38 ++- .../services/PackerOutputContractCatalog.java | 35 +- .../PackerAssetDetailsServiceTest.java | 17 + test-projects/main/.studio/activities.json | 300 +++++++++--------- test-projects/main/assets/bigode/asset.json | 7 +- 5 files changed, 232 insertions(+), 165 deletions(-) diff --git a/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerAssetDetailsService.java b/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerAssetDetailsService.java index 0b1ade6d..d8be1968 100644 --- a/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerAssetDetailsService.java +++ b/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerAssetDetailsService.java @@ -73,7 +73,7 @@ public final class PackerAssetDetailsService { declaration.outputCodec(), outputContract.availableCodecs(), outputContract.codecConfigurationFieldsByCodec(), - metadataFields(declaration.outputMetadata()), + metadataFields(outputContract.metadataFields(), declaration.outputMetadata()), resolveInputs(resolved.assetRoot(), declaration.inputsByRole()), diagnostics); return new GetAssetDetailsResult( @@ -132,16 +132,32 @@ public final class PackerAssetDetailsService { return Map.copyOf(resolved); } - private List metadataFields(Map outputMetadata) { - return outputMetadata.entrySet().stream() - .map(entry -> new PackerCodecConfigurationField( - entry.getKey(), - entry.getKey(), - PackerCodecConfigurationFieldType.TEXT, - entry.getValue(), - false, - List.of())) - .toList(); + private List metadataFields( + List definitions, + Map outputMetadata) { + final Map valuesByKey = new LinkedHashMap<>(outputMetadata); + final List fields = new ArrayList<>(); + + for (PackerCodecConfigurationField definition : definitions) { + final String value = valuesByKey.getOrDefault(definition.key(), definition.value()); + fields.add(new PackerCodecConfigurationField( + definition.key(), + definition.label(), + definition.fieldType(), + value, + definition.required(), + definition.options())); + valuesByKey.remove(definition.key()); + } + + valuesByKey.forEach((key, value) -> fields.add(new PackerCodecConfigurationField( + key, + key, + PackerCodecConfigurationFieldType.TEXT, + value, + false, + List.of()))); + return List.copyOf(fields); } private List identityMismatchDiagnostics( diff --git a/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerOutputContractCatalog.java b/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerOutputContractCatalog.java index d632607e..758f59b5 100644 --- a/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerOutputContractCatalog.java +++ b/prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/services/PackerOutputContractCatalog.java @@ -2,6 +2,7 @@ package p.packer.services; import p.packer.messages.assets.OutputCodecCatalog; import p.packer.messages.assets.OutputFormatCatalog; +import p.packer.messages.assets.PackerCodecConfigurationFieldType; import p.packer.models.PackerCodecConfigurationField; import java.util.*; @@ -18,7 +19,8 @@ final class PackerOutputContractCatalog { codec -> codec, codec -> fieldsFor(outputFormat, codec), (left, right) -> left, - java.util.LinkedHashMap::new))); + java.util.LinkedHashMap::new)), + metadataFieldsFor(outputFormat)); } static List availableCodecsFor(OutputFormatCatalog outputFormat, OutputCodecCatalog selectedCodec) { @@ -50,8 +52,37 @@ final class PackerOutputContractCatalog { return List.of(); } + private static List metadataFieldsFor(OutputFormatCatalog outputFormat) { + return switch (outputFormat) { + case TILES_INDEXED_V1 -> List.of(new PackerCodecConfigurationField( + "tile_size", + "TileSize", + PackerCodecConfigurationFieldType.ENUM, + "16", + true, + List.of("8", "16", "32"))); + case SOUND_BANK_V1, AUDIO_PCM_V1 -> List.of( + new PackerCodecConfigurationField( + "sample_rate", + "Frame Rate", + PackerCodecConfigurationFieldType.ENUM, + "44100", + true, + List.of("11025", "22050", "44100", "48000")), + new PackerCodecConfigurationField( + "channels", + "Channels", + PackerCodecConfigurationFieldType.ENUM, + "1", + true, + List.of("1", "2"))); + default -> List.of(); + }; + } + record OutputContractDefinition( List availableCodecs, - Map> codecConfigurationFieldsByCodec) { + Map> codecConfigurationFieldsByCodec, + List metadataFields) { } } diff --git a/prometeu-packer/prometeu-packer-v1/src/test/java/p/packer/services/PackerAssetDetailsServiceTest.java b/prometeu-packer/prometeu-packer-v1/src/test/java/p/packer/services/PackerAssetDetailsServiceTest.java index 0d2d8d24..0ecd0456 100644 --- a/prometeu-packer/prometeu-packer-v1/src/test/java/p/packer/services/PackerAssetDetailsServiceTest.java +++ b/prometeu-packer/prometeu-packer-v1/src/test/java/p/packer/services/PackerAssetDetailsServiceTest.java @@ -83,6 +83,23 @@ final class PackerAssetDetailsServiceTest { field -> field.value()))); } + @Test + void exposesAudioMetadataDefaultsFromOutputContract() throws Exception { + final Path projectRoot = copyFixture("workspaces/orphan-valid", tempDir.resolve("orphan-audio-defaults")); + final PackerAssetDetailsService service = service(); + + final var result = service.getAssetDetails(new GetAssetDetailsRequest( + project(projectRoot), + AssetReference.forRelativeAssetRoot("orphans/ui_sounds"))); + + assertEquals(PackerOperationStatus.SUCCESS, result.status()); + assertEquals( + Map.of("sample_rate", "44100", "channels", "1"), + result.details().metadataFields().stream().collect(java.util.stream.Collectors.toMap( + field -> field.key(), + field -> field.value()))); + } + @Test void returnsInvalidDetailsForInvalidDeclaration() throws Exception { final Path projectRoot = copyFixture("workspaces/invalid-missing-fields", tempDir.resolve("invalid")); diff --git a/test-projects/main/.studio/activities.json b/test-projects/main/.studio/activities.json index b61e764e..8dc6bed0 100644 --- a/test-projects/main/.studio/activities.json +++ b/test-projects/main/.studio/activities.json @@ -798,6 +798,156 @@ "message" : "Asset scan started", "severity" : "INFO", "sticky" : false +}, { + "source" : "Assets", + "message" : "8 assets loaded", + "severity" : "SUCCESS", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: test", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: bla", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: one-more-atlas", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: ui_atlas", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: one-more-atlas", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: bbb2", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: ui_atlas", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: Bigode", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Asset scan started", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "8 assets loaded", + "severity" : "SUCCESS", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: test", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: bla", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: one-more-atlas", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: ui_atlas", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: one-more-atlas", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: bbb2", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: ui_atlas", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: Bigode", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Asset scan started", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "8 assets loaded", + "severity" : "SUCCESS", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: test", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: bla", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: one-more-atlas", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: ui_atlas", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: one-more-atlas", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: bbb2", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: ui_atlas", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Discovered asset: Bigode", + "severity" : "INFO", + "sticky" : false +}, { + "source" : "Assets", + "message" : "Asset scan started", + "severity" : "INFO", + "sticky" : false }, { "source" : "Assets", "message" : "Asset moved: bbb2 -> recovered/bbb2", @@ -2348,154 +2498,4 @@ "message" : "Discovered asset: test", "severity" : "INFO", "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: one-more-atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: ui_atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: bla", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: one-more-atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: ui_atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: Bigode", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Asset scan started", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "7 assets loaded", - "severity" : "SUCCESS", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: test", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: one-more-atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: ui_atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: bla", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: one-more-atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: ui_atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: Bigode", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Asset scan started", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "7 assets loaded", - "severity" : "SUCCESS", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: test", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: one-more-atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: ui_atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: bla", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: one-more-atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: ui_atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: Bigode", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Asset scan started", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "7 assets loaded", - "severity" : "SUCCESS", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: test", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: one-more-atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: ui_atlas", - "severity" : "INFO", - "sticky" : false -}, { - "source" : "Assets", - "message" : "Discovered asset: bla", - "severity" : "INFO", - "sticky" : false } ] \ No newline at end of file diff --git a/test-projects/main/assets/bigode/asset.json b/test-projects/main/assets/bigode/asset.json index b89a3c2d..aa2d7ef7 100644 --- a/test-projects/main/assets/bigode/asset.json +++ b/test-projects/main/assets/bigode/asset.json @@ -7,9 +7,12 @@ "output" : { "format" : "TILES/indexed_v1", "codec" : "NONE", - "codec_configuration" : { } + "codec_configuration" : { }, + "metadata" : { + "tile_size" : "16" + } }, "preload" : { - "enabled" : false + "enabled" : true } } \ No newline at end of file