implements packer PR-01 bootstrap
This commit is contained in:
parent
839c7d244f
commit
a8fa659762
7
prometeu-packer/build.gradle.kts
Normal file
7
prometeu-packer/build.gradle.kts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
plugins {
|
||||||
|
id("gradle.java-library-conventions")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(":prometeu-infra"))
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
package p.packer.api;
|
||||||
|
|
||||||
|
public enum PackerOperationClass {
|
||||||
|
READ_ONLY,
|
||||||
|
REGISTRY_MUTATION,
|
||||||
|
WORKSPACE_MUTATION
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
package p.packer.api;
|
||||||
|
|
||||||
|
public enum PackerOperationStatus {
|
||||||
|
SUCCESS,
|
||||||
|
PARTIAL,
|
||||||
|
FAILED
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
package p.packer.api;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record PackerProjectContext(
|
||||||
|
String projectId,
|
||||||
|
Path rootPath) {
|
||||||
|
|
||||||
|
public PackerProjectContext {
|
||||||
|
projectId = Objects.requireNonNull(projectId, "projectId").trim();
|
||||||
|
rootPath = Objects.requireNonNull(rootPath, "rootPath").toAbsolutePath().normalize();
|
||||||
|
if (projectId.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("projectId must not be blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
package p.packer.api.assets;
|
||||||
|
|
||||||
|
import p.packer.api.diagnostics.PackerDiagnostic;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record PackerAssetDetails(
|
||||||
|
PackerAssetSummary summary,
|
||||||
|
String outputFormat,
|
||||||
|
String outputCodec,
|
||||||
|
Map<String, List<Path>> inputsByRole,
|
||||||
|
List<PackerDiagnostic> diagnostics) {
|
||||||
|
|
||||||
|
public PackerAssetDetails {
|
||||||
|
Objects.requireNonNull(summary, "summary");
|
||||||
|
outputFormat = Objects.requireNonNullElse(outputFormat, "unknown").trim();
|
||||||
|
outputCodec = Objects.requireNonNullElse(outputCodec, "unknown").trim();
|
||||||
|
inputsByRole = Map.copyOf(Objects.requireNonNull(inputsByRole, "inputsByRole"));
|
||||||
|
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
package p.packer.api.assets;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record PackerAssetIdentity(
|
||||||
|
Integer assetId,
|
||||||
|
String assetUuid,
|
||||||
|
String assetName,
|
||||||
|
Path assetRoot) {
|
||||||
|
|
||||||
|
public PackerAssetIdentity {
|
||||||
|
assetUuid = assetUuid == null ? null : assetUuid.trim();
|
||||||
|
assetName = Objects.requireNonNull(assetName, "assetName").trim();
|
||||||
|
assetRoot = Objects.requireNonNull(assetRoot, "assetRoot").toAbsolutePath().normalize();
|
||||||
|
if (assetName.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("assetName must not be blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
package p.packer.api.assets;
|
||||||
|
|
||||||
|
public enum PackerAssetState {
|
||||||
|
MANAGED,
|
||||||
|
ORPHAN,
|
||||||
|
INVALID
|
||||||
|
}
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
package p.packer.api.assets;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record PackerAssetSummary(
|
||||||
|
PackerAssetIdentity identity,
|
||||||
|
PackerAssetState state,
|
||||||
|
String assetFamily,
|
||||||
|
boolean preloadEnabled,
|
||||||
|
boolean hasDiagnostics) {
|
||||||
|
|
||||||
|
public PackerAssetSummary {
|
||||||
|
Objects.requireNonNull(identity, "identity");
|
||||||
|
Objects.requireNonNull(state, "state");
|
||||||
|
assetFamily = Objects.requireNonNullElse(assetFamily, "unknown").trim();
|
||||||
|
if (assetFamily.isBlank()) {
|
||||||
|
assetFamily = "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
package p.packer.api.diagnostics;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record PackerDiagnostic(
|
||||||
|
PackerDiagnosticSeverity severity,
|
||||||
|
PackerDiagnosticCategory category,
|
||||||
|
String message,
|
||||||
|
Path evidencePath,
|
||||||
|
boolean blocking) {
|
||||||
|
|
||||||
|
public PackerDiagnostic {
|
||||||
|
Objects.requireNonNull(severity, "severity");
|
||||||
|
Objects.requireNonNull(category, "category");
|
||||||
|
message = Objects.requireNonNull(message, "message").trim();
|
||||||
|
evidencePath = evidencePath == null ? null : evidencePath.toAbsolutePath().normalize();
|
||||||
|
if (message.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("message must not be blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
package p.packer.api.diagnostics;
|
||||||
|
|
||||||
|
public enum PackerDiagnosticCategory {
|
||||||
|
STRUCTURAL,
|
||||||
|
HYGIENE,
|
||||||
|
VERSIONING,
|
||||||
|
MIGRATION,
|
||||||
|
BUILD
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
package p.packer.api.diagnostics;
|
||||||
|
|
||||||
|
public enum PackerDiagnosticSeverity {
|
||||||
|
INFO,
|
||||||
|
WARNING,
|
||||||
|
ERROR
|
||||||
|
}
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
package p.packer.api.doctor;
|
||||||
|
|
||||||
|
public enum PackerDoctorMode {
|
||||||
|
MANAGED_WORLD,
|
||||||
|
EXPANDED_WORKSPACE
|
||||||
|
}
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
package p.packer.api.doctor;
|
||||||
|
|
||||||
|
import p.packer.api.PackerProjectContext;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record PackerDoctorRequest(
|
||||||
|
PackerProjectContext project,
|
||||||
|
PackerDoctorMode mode,
|
||||||
|
boolean includeSafeFixes) {
|
||||||
|
|
||||||
|
public PackerDoctorRequest {
|
||||||
|
Objects.requireNonNull(project, "project");
|
||||||
|
Objects.requireNonNull(mode, "mode");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
package p.packer.api.doctor;
|
||||||
|
|
||||||
|
import p.packer.api.PackerOperationStatus;
|
||||||
|
import p.packer.api.diagnostics.PackerDiagnostic;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record PackerDoctorResult(
|
||||||
|
PackerOperationStatus status,
|
||||||
|
String summary,
|
||||||
|
List<PackerDiagnostic> diagnostics,
|
||||||
|
List<String> safeFixes) {
|
||||||
|
|
||||||
|
public PackerDoctorResult {
|
||||||
|
Objects.requireNonNull(status, "status");
|
||||||
|
summary = Objects.requireNonNull(summary, "summary").trim();
|
||||||
|
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));
|
||||||
|
safeFixes = List.copyOf(Objects.requireNonNull(safeFixes, "safeFixes"));
|
||||||
|
if (summary.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("summary must not be blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
package p.packer.api.doctor;
|
||||||
|
|
||||||
|
import p.packer.api.PackerOperationClass;
|
||||||
|
|
||||||
|
public interface PackerDoctorService {
|
||||||
|
PackerOperationClass operationClass();
|
||||||
|
|
||||||
|
PackerDoctorResult doctor(PackerDoctorRequest request);
|
||||||
|
}
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
package p.packer.api.events;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record PackerEvent(
|
||||||
|
String projectId,
|
||||||
|
String operationId,
|
||||||
|
long sequence,
|
||||||
|
PackerEventKind kind,
|
||||||
|
Instant timestamp,
|
||||||
|
String summary,
|
||||||
|
PackerProgress progress,
|
||||||
|
List<String> affectedAssets) {
|
||||||
|
|
||||||
|
public PackerEvent {
|
||||||
|
projectId = Objects.requireNonNull(projectId, "projectId").trim();
|
||||||
|
operationId = Objects.requireNonNull(operationId, "operationId").trim();
|
||||||
|
Objects.requireNonNull(kind, "kind");
|
||||||
|
timestamp = Objects.requireNonNull(timestamp, "timestamp");
|
||||||
|
summary = Objects.requireNonNull(summary, "summary").trim();
|
||||||
|
affectedAssets = List.copyOf(Objects.requireNonNull(affectedAssets, "affectedAssets"));
|
||||||
|
if (projectId.isBlank() || operationId.isBlank() || summary.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("projectId, operationId, and summary must not be blank");
|
||||||
|
}
|
||||||
|
if (sequence < 0L) {
|
||||||
|
throw new IllegalArgumentException("sequence must not be negative");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
package p.packer.api.events;
|
||||||
|
|
||||||
|
public enum PackerEventKind {
|
||||||
|
ASSET_DISCOVERED,
|
||||||
|
ASSET_CHANGED,
|
||||||
|
DIAGNOSTICS_UPDATED,
|
||||||
|
BUILD_STARTED,
|
||||||
|
BUILD_FINISHED,
|
||||||
|
CACHE_HIT,
|
||||||
|
CACHE_MISS,
|
||||||
|
PREVIEW_READY,
|
||||||
|
ACTION_APPLIED,
|
||||||
|
ACTION_FAILED,
|
||||||
|
PROGRESS_UPDATED
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
package p.packer.api.events;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface PackerEventSink {
|
||||||
|
void publish(PackerEvent event);
|
||||||
|
|
||||||
|
static PackerEventSink noop() {
|
||||||
|
return ignored -> {
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
package p.packer.api.events;
|
||||||
|
|
||||||
|
public record PackerProgress(
|
||||||
|
double value,
|
||||||
|
boolean indeterminate) {
|
||||||
|
|
||||||
|
public PackerProgress {
|
||||||
|
if (!indeterminate && (value < 0.0 || value > 1.0)) {
|
||||||
|
throw new IllegalArgumentException("value must be between 0.0 and 1.0 when determinate");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
package p.packer.api.mutations;
|
||||||
|
|
||||||
|
import p.packer.api.PackerOperationStatus;
|
||||||
|
import p.packer.api.diagnostics.PackerDiagnostic;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record PackerMutationPreview(
|
||||||
|
PackerOperationStatus status,
|
||||||
|
String summary,
|
||||||
|
String operationId,
|
||||||
|
PackerMutationRequest request,
|
||||||
|
List<PackerProposedAction> proposedActions,
|
||||||
|
List<PackerDiagnostic> diagnostics,
|
||||||
|
List<String> blockers,
|
||||||
|
boolean highRisk) {
|
||||||
|
|
||||||
|
public PackerMutationPreview {
|
||||||
|
Objects.requireNonNull(status, "status");
|
||||||
|
summary = Objects.requireNonNull(summary, "summary").trim();
|
||||||
|
operationId = Objects.requireNonNull(operationId, "operationId").trim();
|
||||||
|
Objects.requireNonNull(request, "request");
|
||||||
|
proposedActions = List.copyOf(Objects.requireNonNull(proposedActions, "proposedActions"));
|
||||||
|
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));
|
||||||
|
blockers = List.copyOf(Objects.requireNonNull(blockers, "blockers"));
|
||||||
|
if (summary.isBlank() || operationId.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("summary and operationId must not be blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean canApply() {
|
||||||
|
return blockers.isEmpty();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package p.packer.api.mutations;
|
||||||
|
|
||||||
|
import p.packer.api.PackerProjectContext;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record PackerMutationRequest(
|
||||||
|
PackerProjectContext project,
|
||||||
|
PackerMutationType type,
|
||||||
|
String assetReference,
|
||||||
|
Path targetRoot) {
|
||||||
|
|
||||||
|
public PackerMutationRequest {
|
||||||
|
Objects.requireNonNull(project, "project");
|
||||||
|
Objects.requireNonNull(type, "type");
|
||||||
|
assetReference = Objects.requireNonNull(assetReference, "assetReference").trim();
|
||||||
|
targetRoot = targetRoot == null ? null : targetRoot.toAbsolutePath().normalize();
|
||||||
|
if (assetReference.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("assetReference must not be blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
package p.packer.api.mutations;
|
||||||
|
|
||||||
|
import p.packer.api.PackerOperationStatus;
|
||||||
|
import p.packer.api.diagnostics.PackerDiagnostic;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record PackerMutationResult(
|
||||||
|
PackerOperationStatus status,
|
||||||
|
String summary,
|
||||||
|
String operationId,
|
||||||
|
List<PackerProposedAction> appliedActions,
|
||||||
|
List<PackerDiagnostic> diagnostics) {
|
||||||
|
|
||||||
|
public PackerMutationResult {
|
||||||
|
Objects.requireNonNull(status, "status");
|
||||||
|
summary = Objects.requireNonNull(summary, "summary").trim();
|
||||||
|
operationId = Objects.requireNonNull(operationId, "operationId").trim();
|
||||||
|
appliedActions = List.copyOf(Objects.requireNonNull(appliedActions, "appliedActions"));
|
||||||
|
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));
|
||||||
|
if (summary.isBlank() || operationId.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("summary and operationId must not be blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
package p.packer.api.mutations;
|
||||||
|
|
||||||
|
import p.packer.api.PackerOperationClass;
|
||||||
|
|
||||||
|
public interface PackerMutationService {
|
||||||
|
PackerOperationClass operationClass();
|
||||||
|
|
||||||
|
PackerMutationPreview preview(PackerMutationRequest request);
|
||||||
|
|
||||||
|
PackerMutationResult apply(PackerMutationPreview preview);
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
package p.packer.api.mutations;
|
||||||
|
|
||||||
|
public enum PackerMutationType {
|
||||||
|
REGISTER_ASSET,
|
||||||
|
ADOPT_ASSET,
|
||||||
|
FORGET_ASSET,
|
||||||
|
REMOVE_ASSET,
|
||||||
|
QUARANTINE_ASSET,
|
||||||
|
RELOCATE_ASSET
|
||||||
|
}
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
package p.packer.api.mutations;
|
||||||
|
|
||||||
|
import p.packer.api.PackerOperationClass;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record PackerProposedAction(
|
||||||
|
PackerOperationClass operationClass,
|
||||||
|
String verb,
|
||||||
|
String target) {
|
||||||
|
|
||||||
|
public PackerProposedAction {
|
||||||
|
Objects.requireNonNull(operationClass, "operationClass");
|
||||||
|
verb = Objects.requireNonNull(verb, "verb").trim();
|
||||||
|
target = Objects.requireNonNull(target, "target").trim();
|
||||||
|
if (verb.isBlank() || target.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("verb and target must not be blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
package p.packer.api.workspace;
|
||||||
|
|
||||||
|
import p.packer.api.PackerProjectContext;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record GetAssetDetailsRequest(
|
||||||
|
PackerProjectContext project,
|
||||||
|
String assetReference) {
|
||||||
|
|
||||||
|
public GetAssetDetailsRequest {
|
||||||
|
Objects.requireNonNull(project, "project");
|
||||||
|
assetReference = Objects.requireNonNull(assetReference, "assetReference").trim();
|
||||||
|
if (assetReference.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("assetReference must not be blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
package p.packer.api.workspace;
|
||||||
|
|
||||||
|
import p.packer.api.PackerOperationStatus;
|
||||||
|
import p.packer.api.assets.PackerAssetDetails;
|
||||||
|
import p.packer.api.diagnostics.PackerDiagnostic;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record GetAssetDetailsResult(
|
||||||
|
PackerOperationStatus status,
|
||||||
|
String summary,
|
||||||
|
PackerAssetDetails details,
|
||||||
|
List<PackerDiagnostic> diagnostics) {
|
||||||
|
|
||||||
|
public GetAssetDetailsResult {
|
||||||
|
Objects.requireNonNull(status, "status");
|
||||||
|
summary = Objects.requireNonNull(summary, "summary").trim();
|
||||||
|
Objects.requireNonNull(details, "details");
|
||||||
|
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));
|
||||||
|
if (summary.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("summary must not be blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
package p.packer.api.workspace;
|
||||||
|
|
||||||
|
import p.packer.api.PackerProjectContext;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record InitWorkspaceRequest(
|
||||||
|
PackerProjectContext project) {
|
||||||
|
|
||||||
|
public InitWorkspaceRequest {
|
||||||
|
Objects.requireNonNull(project, "project");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
package p.packer.api.workspace;
|
||||||
|
|
||||||
|
import p.packer.api.PackerOperationStatus;
|
||||||
|
import p.packer.api.diagnostics.PackerDiagnostic;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record InitWorkspaceResult(
|
||||||
|
PackerOperationStatus status,
|
||||||
|
String summary,
|
||||||
|
Path registryPath,
|
||||||
|
List<PackerDiagnostic> diagnostics) {
|
||||||
|
|
||||||
|
public InitWorkspaceResult {
|
||||||
|
Objects.requireNonNull(status, "status");
|
||||||
|
summary = Objects.requireNonNull(summary, "summary").trim();
|
||||||
|
registryPath = Objects.requireNonNull(registryPath, "registryPath").toAbsolutePath().normalize();
|
||||||
|
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));
|
||||||
|
if (summary.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("summary must not be blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
package p.packer.api.workspace;
|
||||||
|
|
||||||
|
import p.packer.api.PackerProjectContext;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record ListAssetsRequest(
|
||||||
|
PackerProjectContext project) {
|
||||||
|
|
||||||
|
public ListAssetsRequest {
|
||||||
|
Objects.requireNonNull(project, "project");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
package p.packer.api.workspace;
|
||||||
|
|
||||||
|
import p.packer.api.PackerOperationStatus;
|
||||||
|
import p.packer.api.assets.PackerAssetSummary;
|
||||||
|
import p.packer.api.diagnostics.PackerDiagnostic;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public record ListAssetsResult(
|
||||||
|
PackerOperationStatus status,
|
||||||
|
String summary,
|
||||||
|
List<PackerAssetSummary> assets,
|
||||||
|
List<PackerDiagnostic> diagnostics) {
|
||||||
|
|
||||||
|
public ListAssetsResult {
|
||||||
|
Objects.requireNonNull(status, "status");
|
||||||
|
summary = Objects.requireNonNull(summary, "summary").trim();
|
||||||
|
assets = List.copyOf(Objects.requireNonNull(assets, "assets"));
|
||||||
|
diagnostics = List.copyOf(Objects.requireNonNull(diagnostics, "diagnostics"));
|
||||||
|
if (summary.isBlank()) {
|
||||||
|
throw new IllegalArgumentException("summary must not be blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
package p.packer.api.workspace;
|
||||||
|
|
||||||
|
import p.packer.api.PackerOperationClass;
|
||||||
|
|
||||||
|
public interface PackerWorkspaceService {
|
||||||
|
PackerOperationClass operationClass();
|
||||||
|
|
||||||
|
InitWorkspaceResult initWorkspace(InitWorkspaceRequest request);
|
||||||
|
|
||||||
|
ListAssetsResult listAssets(ListAssetsRequest request);
|
||||||
|
|
||||||
|
GetAssetDetailsResult getAssetDetails(GetAssetDetailsRequest request);
|
||||||
|
}
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
package p.packer.testing;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
final class PackerFixtureCatalogTest {
|
||||||
|
@Test
|
||||||
|
void exposesWorkspaceFixturesForFuturePackerTests() {
|
||||||
|
final Path emptyWorkspace = PackerFixtureLocator.fixtureRoot("workspaces/empty");
|
||||||
|
final Path managedWorkspace = PackerFixtureLocator.fixtureRoot("workspaces/managed-basic");
|
||||||
|
|
||||||
|
assertTrue(Files.isDirectory(emptyWorkspace));
|
||||||
|
assertTrue(Files.isDirectory(managedWorkspace));
|
||||||
|
assertTrue(Files.isRegularFile(managedWorkspace.resolve("assets/.prometeu/index.json")));
|
||||||
|
assertTrue(Files.isRegularFile(managedWorkspace.resolve("assets/ui/atlas/asset.json")));
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
package p.packer.testing;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public final class PackerFixtureLocator {
|
||||||
|
private PackerFixtureLocator() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Path fixtureRoot(String relativePath) {
|
||||||
|
final String normalized = Objects.requireNonNull(relativePath, "relativePath").replace('\\', '/');
|
||||||
|
final URL resource = PackerFixtureLocator.class.getClassLoader().getResource("fixtures/" + normalized);
|
||||||
|
if (resource == null) {
|
||||||
|
throw new IllegalArgumentException("fixture not found: " + normalized);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return Path.of(resource.toURI()).toAbsolutePath().normalize();
|
||||||
|
} catch (Exception exception) {
|
||||||
|
throw new IllegalStateException("unable to resolve fixture: " + normalized, exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"schema_version": 1,
|
||||||
|
"next_asset_id": 2,
|
||||||
|
"assets": [
|
||||||
|
{
|
||||||
|
"asset_id": 1,
|
||||||
|
"asset_uuid": "fixture-uuid-1",
|
||||||
|
"root": "ui/atlas"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"schema_version": 1,
|
||||||
|
"name": "ui_atlas",
|
||||||
|
"type": "image_bank",
|
||||||
|
"inputs": {
|
||||||
|
"sprites": ["sprites/confirm.png"]
|
||||||
|
},
|
||||||
|
"output": {
|
||||||
|
"format": "TILES/indexed_v1",
|
||||||
|
"codec": "RAW"
|
||||||
|
},
|
||||||
|
"preload": {
|
||||||
|
"enabled": true
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -5,6 +5,7 @@ plugins {
|
|||||||
rootProject.name = "prometeu-studio"
|
rootProject.name = "prometeu-studio"
|
||||||
|
|
||||||
include("prometeu-infra")
|
include("prometeu-infra")
|
||||||
|
include("prometeu-packer")
|
||||||
|
|
||||||
include("prometeu-compiler:frontends:prometeu-frontend-pbs")
|
include("prometeu-compiler:frontends:prometeu-frontend-pbs")
|
||||||
include("prometeu-compiler:prometeu-compiler-core")
|
include("prometeu-compiler:prometeu-compiler-core")
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user