asset workspace progress

This commit is contained in:
bQUARKz 2026-03-16 07:29:26 +00:00
parent 2d923455f5
commit bb2c33a952
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
71 changed files with 309 additions and 156 deletions

View File

@ -0,0 +1,98 @@
# PR-19 API Surface Audit, Model Separation, and Public Read DTOs
Domain Owner: `docs/packer`
Cross-Domain Impact: `docs/studio`
## Briefing
The current packer API still exposes some read payload types that are simultaneously acting as public transport objects and internal implementation models.
This is acceptable during early convergence, but it weakens the boundary between `prometeu-packer-api` and `prometeu-packer-v1`.
The next cleanup step is to make the API explicit about three different categories:
- domain contracts,
- request/response messages,
- public read DTOs.
At the same time, the internal implementation models used by `prometeu-packer-v1` should stop leaking through the API as if they were stable public models.
## Objective
Separate internal `v1` read models from public API read DTOs while preserving:
- request/response messages as immutable messages,
- domain contracts as domain contracts,
- exceptions as part of the public API,
- and Studio compatibility through explicit mapper-based conversion inside `prometeu-packer-v1`.
## Dependencies
- [`./PR-15-snapshot-backed-asset-query-services.md`](./PR-15-snapshot-backed-asset-query-services.md)
- [`./PR-16-write-lane-command-completion-and-used-write-services.md`](./PR-16-write-lane-command-completion-and-used-write-services.md)
- [`./PR-17-studio-runtime-adapter-and-assets-workspace-consumption.md`](./PR-17-studio-runtime-adapter-and-assets-workspace-consumption.md)
- [`./PR-18-legacy-service-retirement-and-regression-hardening.md`](./PR-18-legacy-service-retirement-and-regression-hardening.md)
## Scope
- audit the current public packer API against real external consumption
- preserve public exceptions in the API even when only `v1` currently throws them
- preserve request/response records as request/response messages rather than renaming them as generic DTOs
- move the current mixed model/transport read types out of the API and into `prometeu-packer-v1`
- introduce public read DTOs in the API for the information Studio actually consumes
- add explicit mapper classes in `prometeu-packer-v1` to convert internal models into API DTOs
- keep the active service wave limited to `initWorkspace`, `listAssets`, `getAssetDetails`, and `createAsset`
## Non-Goals
- no new packer capabilities
- no write API redesign
- no doctor or build/pack reintroduction
- no reconcile observer work
- no semantic change to asset identity, registry ownership, or snapshot authority
## Execution Method
1. Classify the current API surface into:
- public domain contracts,
- public request/response messages,
- public read DTOs,
- internal implementation models.
2. Keep domain contracts in `prometeu-packer-api` without `DTO` suffixes.
3. Keep request/response types in `prometeu-packer-api` as immutable message records with `Request` and `Response` naming.
4. Move the current mixed read shapes now exposed as `PackerAssetSummary`, `PackerAssetDetails`, and `PackerAssetIdentity` into `prometeu-packer-v1` as internal models.
5. Introduce explicit public DTOs in the API for runtime-backed read payloads, such as:
- `PackerAssetSummaryDTO`
- `PackerAssetDetailsDTO`
- `PackerAssetIdentityDTO`
- `PackerCodecConfigurationFieldDTO`
- and `PackerDiagnosticDTO` if diagnostics remain part of public responses.
6. Add explicit mapper classes in `prometeu-packer-v1` to convert internal models into API DTOs before responses cross the module boundary.
7. Update response messages to carry the new DTO types instead of leaking `v1` models through the API.
8. Update Studio consumers to read from the new DTO types while preserving the same user-facing behavior.
## Acceptance Criteria
- the API surface is explicitly partitioned between domain contracts, request/response messages, and read DTOs
- request/response messages remain immutable message records and are not renamed as generic DTOs
- public exceptions remain in the API
- internal `v1` models are no longer exposed as if they were public API models
- Studio depends only on API contracts and DTOs, not on `v1` model semantics
- conversion from `v1` internal models to public API DTOs happens through explicit mapper code
- no behavior regression is introduced in `initWorkspace`, `listAssets`, `getAssetDetails`, or `createAsset`
## Validation
- compile-time audit proving `prometeu-studio` and `prometeu-app` consume only API contracts
- packer regression tests for read and write flows
- Studio regression tests for asset list, asset details, and add asset flows
- targeted tests for mapper coverage between internal models and public API DTOs
## Affected Artifacts
- `prometeu-packer/prometeu-packer-api/src/main/java/p/packer/**`
- `prometeu-packer/prometeu-packer-v1/src/main/java/p/packer/**`
- `prometeu-packer/prometeu-packer-v1/src/test/java/p/packer/**`
- `prometeu-studio/src/main/java/p/studio/**`
- `prometeu-studio/src/test/java/p/studio/**`

View File

@ -78,6 +78,7 @@ The current production track for the standalone `prometeu-packer` project is:
16. [`PR-16-write-lane-command-completion-and-used-write-services.md`](./PR-16-write-lane-command-completion-and-used-write-services.md)
17. [`PR-17-studio-runtime-adapter-and-assets-workspace-consumption.md`](./PR-17-studio-runtime-adapter-and-assets-workspace-consumption.md)
18. [`PR-18-legacy-service-retirement-and-regression-hardening.md`](./PR-18-legacy-service-retirement-and-regression-hardening.md)
19. [`PR-19-api-surface-audit-model-separation-and-public-read-dtos.md`](./PR-19-api-surface-audit-model-separation-and-public-read-dtos.md)
Current wave discipline from `PR-11` onward:
@ -88,4 +89,4 @@ Current wave discipline from `PR-11` onward:
Recommended dependency chain:
`PR-01 -> PR-02 -> PR-03 -> PR-04 -> PR-05 -> PR-06 -> PR-07 -> PR-08 -> PR-09 -> PR-10 -> PR-11 -> PR-12 -> PR-13 -> PR-14 -> PR-15 -> PR-16 -> PR-17 -> PR-18`
`PR-01 -> PR-02 -> PR-03 -> PR-04 -> PR-05 -> PR-06 -> PR-07 -> PR-08 -> PR-09 -> PR-10 -> PR-11 -> PR-12 -> PR-13 -> PR-14 -> PR-15 -> PR-16 -> PR-17 -> PR-18 -> PR-19`

View File

@ -1,6 +1,6 @@
package p.packer.assets;
package p.packer.dtos;
import p.packer.diagnostics.PackerDiagnosticDTO;
import p.packer.messages.assets.OutputCodecCatalog;
import java.nio.file.Path;
import java.util.List;

View File

@ -1,4 +1,4 @@
package p.packer.assets;
package p.packer.dtos;
import java.nio.file.Path;
import java.util.Objects;

View File

@ -1,4 +1,9 @@
package p.packer.assets;
package p.packer.dtos;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.assets.PackerBuildParticipation;
import java.util.Objects;

View File

@ -1,4 +1,6 @@
package p.packer.assets;
package p.packer.dtos;
import p.packer.messages.assets.PackerCodecConfigurationFieldType;
import java.util.List;
import java.util.Objects;

View File

@ -1,4 +1,7 @@
package p.packer.diagnostics;
package p.packer.dtos;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import java.nio.file.Path;
import java.util.Objects;

View File

@ -1,9 +1,8 @@
package p.packer.messages;
import p.packer.PackerProjectContext;
import p.packer.assets.AssetFamilyCatalog;
import p.packer.assets.OutputCodecCatalog;
import p.packer.assets.OutputFormatCatalog;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import java.util.Objects;

View File

@ -1,8 +1,5 @@
package p.packer.messages;
import p.packer.PackerOperationStatus;
import p.packer.assets.AssetReference;
import java.nio.file.Path;
public record CreateAssetResult(

View File

@ -1,8 +1,5 @@
package p.packer.messages;
import p.packer.PackerProjectContext;
import p.packer.assets.AssetReference;
import java.util.Objects;
public record GetAssetDetailsRequest(

View File

@ -1,8 +1,7 @@
package p.packer.messages;
import p.packer.PackerOperationStatus;
import p.packer.assets.PackerAssetDetailsDTO;
import p.packer.diagnostics.PackerDiagnosticDTO;
import p.packer.dtos.PackerAssetDetailsDTO;
import p.packer.dtos.PackerDiagnosticDTO;
import java.util.List;
import java.util.Objects;

View File

@ -1,7 +1,5 @@
package p.packer.messages;
import p.packer.PackerProjectContext;
import java.util.Objects;
public record InitWorkspaceRequest(

View File

@ -1,7 +1,6 @@
package p.packer.messages;
import p.packer.PackerOperationStatus;
import p.packer.diagnostics.PackerDiagnosticDTO;
import p.packer.dtos.PackerDiagnosticDTO;
import java.nio.file.Path;
import java.util.List;

View File

@ -1,7 +1,5 @@
package p.packer.messages;
import p.packer.PackerProjectContext;
import java.util.Objects;
public record ListAssetsRequest(

View File

@ -1,8 +1,7 @@
package p.packer.messages;
import p.packer.PackerOperationStatus;
import p.packer.assets.PackerAssetSummaryDTO;
import p.packer.diagnostics.PackerDiagnosticDTO;
import p.packer.dtos.PackerAssetSummaryDTO;
import p.packer.dtos.PackerDiagnosticDTO;
import java.util.List;
import java.util.Objects;

View File

@ -1,4 +1,4 @@
package p.packer;
package p.packer.messages;
import java.nio.file.Path;
import java.util.Objects;

View File

@ -1,32 +1,25 @@
package p.packer.assets;
package p.packer.messages.assets;
import java.util.Locale;
public enum AssetFamilyCatalog {
IMAGE_BANK("image_bank", "Image Bank"),
PALETTE_BANK("palette_bank", "Palette Bank"),
SOUND_BANK("sound_bank", "Sound Bank"),
UNKNOWN("unknown", "Unknown");
IMAGE_BANK("image_bank"),
PALETTE_BANK("palette_bank"),
SOUND_BANK("sound_bank"),
UNKNOWN("unknown");
private final String manifestType;
private final String displayName;
AssetFamilyCatalog(String manifestType, String displayName) {
AssetFamilyCatalog(String manifestType) {
this.manifestType = manifestType;
this.displayName = displayName;
}
public String manifestType() {
return manifestType;
}
public String displayName() {
return displayName;
}
public boolean matchesQuery(String normalizedQuery) {
return manifestType.contains(normalizedQuery)
|| displayName.toLowerCase(Locale.ROOT).contains(normalizedQuery);
return manifestType.contains(normalizedQuery);
}
public static AssetFamilyCatalog fromManifestType(String manifestType) {

View File

@ -1,4 +1,4 @@
package p.packer.assets;
package p.packer.messages.assets;
import java.util.List;
import java.util.Locale;

View File

@ -1,4 +1,4 @@
package p.packer.assets;
package p.packer.messages.assets;
public enum PackerAssetState {
REGISTERED,

View File

@ -1,4 +1,4 @@
package p.packer.assets;
package p.packer.messages.assets;
public enum PackerBuildParticipation {
INCLUDED,

View File

@ -1,4 +1,4 @@
package p.packer.diagnostics;
package p.packer.messages.diagnostics;
public enum PackerDiagnosticCategory {
STRUCTURAL,

View File

@ -1,4 +1,4 @@
package p.packer.diagnostics;
package p.packer.messages.diagnostics;
public enum PackerDiagnosticSeverity {
INFO,

View File

@ -1,7 +1,7 @@
package p.packer.models;
import p.packer.assets.AssetFamilyCatalog;
import p.packer.assets.OutputCodecCatalog;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputCodecCatalog;
import java.util.List;
import java.util.Map;

View File

@ -1,6 +1,6 @@
package p.packer.models;
import p.packer.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputCodecCatalog;
import java.nio.file.Path;
import java.util.List;

View File

@ -1,9 +1,9 @@
package p.packer.models;
import p.packer.assets.AssetFamilyCatalog;
import p.packer.assets.AssetReference;
import p.packer.assets.PackerAssetState;
import p.packer.assets.PackerBuildParticipation;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.assets.PackerBuildParticipation;
import java.util.Objects;

View File

@ -1,6 +1,6 @@
package p.packer.models;
import p.packer.assets.PackerCodecConfigurationFieldType;
import p.packer.messages.assets.PackerCodecConfigurationFieldType;
import java.util.List;
import java.util.Objects;

View File

@ -1,7 +1,7 @@
package p.packer.models;
import p.packer.diagnostics.PackerDiagnosticCategory;
import p.packer.diagnostics.PackerDiagnosticSeverity;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import java.nio.file.Path;
import java.util.Objects;

View File

@ -3,7 +3,7 @@ package p.packer.services;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState;

View File

@ -1,15 +1,15 @@
package p.packer.services;
import com.fasterxml.jackson.databind.ObjectMapper;
import p.packer.PackerOperationStatus;
import p.packer.PackerProjectContext;
import p.packer.assets.AssetFamilyCatalog;
import p.packer.assets.AssetReference;
import p.packer.assets.OutputFormatCatalog;
import p.packer.assets.PackerAssetState;
import p.packer.assets.PackerBuildParticipation;
import p.packer.diagnostics.PackerDiagnosticCategory;
import p.packer.diagnostics.PackerDiagnosticSeverity;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.OutputFormatCatalog;
import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.events.PackerEventKind;
import p.packer.events.PackerEventSink;
import p.packer.events.PackerProgress;

View File

@ -2,10 +2,10 @@ package p.packer.services;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import p.packer.assets.AssetFamilyCatalog;
import p.packer.assets.OutputCodecCatalog;
import p.packer.diagnostics.PackerDiagnosticCategory;
import p.packer.diagnostics.PackerDiagnosticSeverity;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.models.PackerAssetDeclaration;
import p.packer.models.PackerAssetDeclarationParseResult;
import p.packer.models.PackerDiagnostic;

View File

@ -1,14 +1,14 @@
package p.packer.services;
import p.packer.PackerOperationStatus;
import p.packer.PackerProjectContext;
import p.packer.assets.AssetFamilyCatalog;
import p.packer.assets.AssetReference;
import p.packer.assets.OutputCodecCatalog;
import p.packer.assets.PackerAssetState;
import p.packer.assets.PackerBuildParticipation;
import p.packer.diagnostics.PackerDiagnosticCategory;
import p.packer.diagnostics.PackerDiagnosticSeverity;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.messages.GetAssetDetailsRequest;
import p.packer.messages.GetAssetDetailsResult;
import p.packer.models.PackerAssetDeclaration;

View File

@ -1,6 +1,6 @@
package p.packer.services;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState;

View File

@ -1,6 +1,6 @@
package p.packer.services;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import p.packer.events.PackerEvent;
import p.packer.events.PackerEventKind;
import p.packer.events.PackerEventSink;

View File

@ -1,7 +1,7 @@
package p.packer.services;
import p.packer.assets.OutputCodecCatalog;
import p.packer.assets.OutputFormatCatalog;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import p.packer.models.PackerCodecConfigurationField;
import java.util.LinkedHashSet;
import java.util.List;

View File

@ -1,6 +1,6 @@
package p.packer.services;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import p.packer.models.PackerRuntimeSnapshot;
import java.util.Objects;

View File

@ -1,6 +1,6 @@
package p.packer.services;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import java.io.Closeable;
import java.nio.file.Path;

View File

@ -1,10 +1,11 @@
package p.packer.services;
import p.packer.assets.PackerAssetDetailsDTO;
import p.packer.assets.PackerAssetIdentityDTO;
import p.packer.assets.PackerAssetSummaryDTO;
import p.packer.assets.PackerCodecConfigurationFieldDTO;
import p.packer.diagnostics.PackerDiagnosticDTO;
import p.packer.dtos.PackerAssetDetailsDTO;
import p.packer.dtos.PackerAssetIdentityDTO;
import p.packer.dtos.PackerAssetSummaryDTO;
import p.packer.dtos.PackerCodecConfigurationFieldDTO;
import p.packer.dtos.PackerDiagnosticDTO;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.models.PackerAssetDetails;
import p.packer.models.PackerAssetIdentity;
import p.packer.models.PackerAssetSummary;
@ -57,8 +58,8 @@ public final class PackerReadMessageMapper {
identity.assetRoot());
}
private static Map<p.packer.assets.OutputCodecCatalog, List<PackerCodecConfigurationFieldDTO>> toCodecConfigurationFieldsByCodecDTO(
Map<p.packer.assets.OutputCodecCatalog, List<PackerCodecConfigurationField>> fieldsByCodec) {
private static Map<OutputCodecCatalog, List<PackerCodecConfigurationFieldDTO>> toCodecConfigurationFieldsByCodecDTO(
Map<OutputCodecCatalog, List<PackerCodecConfigurationField>> fieldsByCodec) {
return fieldsByCodec.entrySet().stream().collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().stream().map(PackerReadMessageMapper::toCodecConfigurationFieldDTO).toList(),

View File

@ -1,6 +1,6 @@
package p.packer.services;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState;

View File

@ -1,6 +1,6 @@
package p.packer.services;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.InitWorkspaceRequest;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState;

View File

@ -1,6 +1,6 @@
package p.packer.services;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import java.nio.file.Path;
import java.util.Objects;

View File

@ -1,7 +1,7 @@
package p.packer.services;
import p.packer.PackerOperationStatus;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.InitWorkspaceRequest;
import p.packer.messages.InitWorkspaceResult;
import p.packer.models.PackerRegistryEntry;
@ -12,7 +12,7 @@ import java.util.List;
import java.util.Objects;
public final class PackerWorkspaceFoundation {
private final PackerRegistryRepository registryRepository;
private final FileSystemPackerRegistryRepository registryRepository;
private final PackerIdentityAllocator identityAllocator;
private final PackerRegistryLookup registryLookup;
@ -21,7 +21,7 @@ public final class PackerWorkspaceFoundation {
}
public PackerWorkspaceFoundation(
PackerRegistryRepository registryRepository,
FileSystemPackerRegistryRepository registryRepository,
PackerIdentityAllocator identityAllocator,
PackerRegistryLookup registryLookup) {
this.registryRepository = Objects.requireNonNull(registryRepository, "registryRepository");

View File

@ -1,6 +1,6 @@
package p.packer.services;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import java.nio.file.Path;
import java.util.Objects;

View File

@ -2,14 +2,14 @@ package p.packer.services;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import p.packer.PackerOperationStatus;
import p.packer.PackerProjectContext;
import p.packer.assets.AssetFamilyCatalog;
import p.packer.assets.OutputCodecCatalog;
import p.packer.assets.OutputFormatCatalog;
import p.packer.assets.AssetReference;
import p.packer.assets.PackerBuildParticipation;
import p.packer.assets.PackerAssetState;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.messages.assets.PackerAssetState;
import p.packer.events.PackerEvent;
import p.packer.events.PackerEventKind;
import p.packer.messages.CreateAssetRequest;

View File

@ -2,9 +2,9 @@ package p.packer.services;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import p.packer.assets.AssetFamilyCatalog;
import p.packer.assets.OutputCodecCatalog;
import p.packer.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.testing.PackerFixtureLocator;
import java.nio.file.Files;

View File

@ -2,12 +2,12 @@ package p.packer.services;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import p.packer.PackerOperationStatus;
import p.packer.PackerProjectContext;
import p.packer.assets.AssetReference;
import p.packer.assets.PackerBuildParticipation;
import p.packer.assets.OutputCodecCatalog;
import p.packer.assets.PackerAssetState;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.GetAssetDetailsRequest;
import p.packer.testing.PackerFixtureLocator;

View File

@ -3,7 +3,7 @@ package p.packer.services;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import java.nio.file.Path;
import java.util.List;

View File

@ -2,7 +2,7 @@ package p.packer.services;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import p.packer.testing.PackerFixtureLocator;
import java.nio.file.Files;

View File

@ -2,7 +2,7 @@ package p.packer.services;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.InitWorkspaceRequest;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState;

View File

@ -1,7 +1,7 @@
package p.studio.projects;
import org.apache.commons.lang3.StringUtils;
import p.packer.PackerProjectContext;
import p.packer.messages.PackerProjectContext;
import java.nio.file.Path;

View File

@ -132,6 +132,10 @@ public enum I18n {
ASSETS_LABEL_BUILD_PARTICIPATION("assets.label.buildParticipation"),
ASSETS_LABEL_ASSET_ID("assets.label.assetId"),
ASSETS_LABEL_TYPE("assets.label.type"),
ASSETS_TYPE_IMAGE_BANK("assets.type.imageBank"),
ASSETS_TYPE_PALETTE_BANK("assets.type.paletteBank"),
ASSETS_TYPE_SOUND_BANK("assets.type.soundBank"),
ASSETS_TYPE_UNKNOWN("assets.type.unknown"),
ASSETS_LABEL_LOCATION("assets.label.location"),
ASSETS_LABEL_BANK("assets.label.bank"),
ASSETS_LABEL_TARGET_LOCATION("assets.label.targetLocation"),

View File

@ -1,6 +1,6 @@
package p.studio.workspaces.assets;
import p.packer.assets.AssetReference;
import p.packer.messages.AssetReference;
import p.studio.workspaces.assets.messages.AssetWorkspaceAssetSummary;
import p.studio.workspaces.assets.messages.AssetWorkspaceStatus;

View File

@ -6,8 +6,8 @@ import javafx.scene.control.ScrollPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import p.packer.assets.AssetReference;
import p.packer.assets.PackerAssetDetailsDTO;
import p.packer.messages.AssetReference;
import p.packer.dtos.PackerAssetDetailsDTO;
import p.packer.messages.GetAssetDetailsRequest;
import p.studio.Container;
import p.studio.events.StudioWorkspaceEventBus;

View File

@ -6,7 +6,7 @@ import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import p.packer.assets.AssetFamilyCatalog;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.studio.Container;
import p.studio.projects.ProjectReference;
import p.studio.utilities.i18n.I18n;
@ -79,7 +79,12 @@ public final class AssetDetailsUiSupport {
}
public static String typeLabel(AssetFamilyCatalog assetFamily) {
return assetFamily.displayName();
return switch (assetFamily) {
case IMAGE_BANK -> Container.i18n().text(I18n.ASSETS_TYPE_IMAGE_BANK);
case PALETTE_BANK -> Container.i18n().text(I18n.ASSETS_TYPE_PALETTE_BANK);
case SOUND_BANK -> Container.i18n().text(I18n.ASSETS_TYPE_SOUND_BANK);
case UNKNOWN -> Container.i18n().text(I18n.ASSETS_TYPE_UNKNOWN);
};
}
public static String typeChipTone(AssetFamilyCatalog assetFamily) {

View File

@ -1,6 +1,6 @@
package p.studio.workspaces.assets.details;
import p.packer.assets.AssetReference;
import p.packer.messages.AssetReference;
import p.studio.workspaces.assets.messages.AssetWorkspaceAssetDetails;
import p.studio.workspaces.assets.messages.AssetWorkspaceDetailsStatus;
import p.studio.workspaces.assets.messages.AssetWorkspaceDetailsViewState;

View File

@ -1,6 +1,6 @@
package p.studio.workspaces.assets.details;
import p.packer.assets.PackerAssetSummaryDTO;
import p.packer.dtos.PackerAssetSummaryDTO;
import p.studio.workspaces.assets.messages.AssetWorkspaceAssetSummary;
import p.studio.workspaces.assets.messages.AssetWorkspaceAssetState;
import p.studio.workspaces.assets.messages.AssetWorkspaceBuildParticipation;

View File

@ -1,7 +1,7 @@
package p.studio.workspaces.assets.details.contract;
import p.packer.assets.AssetReference;
import p.packer.assets.OutputCodecCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.OutputCodecCatalog;
import p.studio.workspaces.assets.messages.AssetWorkspaceAssetDetails;
import java.util.LinkedHashMap;

View File

@ -10,8 +10,8 @@ import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import p.packer.assets.OutputCodecCatalog;
import p.packer.assets.PackerCodecConfigurationFieldDTO;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.dtos.PackerCodecConfigurationFieldDTO;
import p.studio.Container;
import p.studio.controls.forms.StudioFormActionBar;
import p.studio.controls.forms.StudioFormMode;

View File

@ -10,8 +10,8 @@ import javafx.scene.control.ToggleButton;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import p.packer.assets.AssetReference;
import p.packer.assets.PackerAssetSummaryDTO;
import p.packer.messages.AssetReference;
import p.packer.dtos.PackerAssetSummaryDTO;
import p.packer.messages.ListAssetsRequest;
import p.studio.Container;
import p.studio.events.StudioWorkspaceEventBus;

View File

@ -6,7 +6,7 @@ import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import p.packer.assets.AssetFamilyCatalog;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.studio.Container;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceSelectionRequestedEvent;
import p.studio.events.StudioWorkspaceEventBus;

View File

@ -1,7 +1,7 @@
package p.studio.workspaces.assets.messages;
import p.packer.assets.PackerCodecConfigurationFieldDTO;
import p.packer.assets.OutputCodecCatalog;
import p.packer.dtos.PackerCodecConfigurationFieldDTO;
import p.packer.messages.assets.OutputCodecCatalog;
import java.nio.file.Path;
import java.util.List;

View File

@ -1,7 +1,7 @@
package p.studio.workspaces.assets.messages;
import p.packer.assets.AssetFamilyCatalog;
import p.packer.assets.AssetReference;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.AssetReference;
import java.nio.file.Path;
import java.util.Objects;

View File

@ -1,6 +1,6 @@
package p.studio.workspaces.assets.messages;
import p.packer.assets.AssetReference;
import p.packer.messages.AssetReference;
import java.util.Objects;

View File

@ -1,6 +1,6 @@
package p.studio.workspaces.assets.messages.events;
import p.packer.assets.AssetReference;
import p.packer.messages.AssetReference;
import p.studio.events.StudioEvent;
public record StudioAssetsRefreshRequestedEvent(

View File

@ -1,6 +1,6 @@
package p.studio.workspaces.assets.messages.events;
import p.packer.assets.AssetReference;
import p.packer.messages.AssetReference;
import p.studio.events.StudioEvent;
import java.util.Objects;

View File

@ -17,16 +17,17 @@ import javafx.stage.DirectoryChooser;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.Window;
import p.packer.PackerOperationStatus;
import p.packer.assets.AssetFamilyCatalog;
import p.packer.assets.AssetReference;
import p.packer.assets.OutputCodecCatalog;
import p.packer.assets.OutputFormatCatalog;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import p.packer.messages.CreateAssetRequest;
import p.packer.messages.CreateAssetResult;
import p.studio.Container;
import p.studio.projects.ProjectReference;
import p.studio.utilities.i18n.I18n;
import p.studio.workspaces.assets.details.AssetDetailsUiSupport;
import java.io.File;
import java.io.IOException;
@ -122,14 +123,14 @@ public final class AddAssetWizard {
@Override
protected void updateItem(AssetFamilyCatalog item, boolean empty) {
super.updateItem(item, empty);
setText(empty || item == null ? null : item.displayName());
setText(empty || item == null ? null : AssetDetailsUiSupport.typeLabel(item));
}
});
assetFamilyCombo.setButtonCell(new javafx.scene.control.ListCell<>() {
@Override
protected void updateItem(AssetFamilyCatalog item, boolean empty) {
super.updateItem(item, empty);
setText(empty || item == null ? null : item.displayName());
setText(empty || item == null ? null : AssetDetailsUiSupport.typeLabel(item));
}
});
assetFamilyCombo.valueProperty().addListener((ignored, oldValue, newValue) -> {

View File

@ -122,6 +122,10 @@ assets.label.registration=Registration
assets.label.buildParticipation=Build Participation
assets.label.assetId=Asset ID
assets.label.type=Type
assets.type.imageBank=Image Bank
assets.type.paletteBank=Palette Bank
assets.type.soundBank=Sound Bank
assets.type.unknown=Unknown
assets.label.location=Location
assets.label.bank=Bank
assets.label.targetLocation=Target Location

View File

@ -98,6 +98,56 @@
"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: 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: Novo Asset",
"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" : "6 assets loaded",