prepare first attempt on the builder pipeline

This commit is contained in:
bQUARKz 2026-02-23 10:26:41 +00:00
parent f61200f8ef
commit e8afc8ea0d
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
47 changed files with 271 additions and 139 deletions

View File

@ -1,6 +1,6 @@
package p.studio.compiler; package p.studio.compiler;
import p.studio.compiler.model.FrontendSpec; import p.studio.compiler.models.FrontendSpec;
import p.studio.utilities.structures.ReadOnlySet; import p.studio.utilities.structures.ReadOnlySet;
public class PBSDefinitions { public class PBSDefinitions {

View File

@ -4,4 +4,6 @@ plugins {
dependencies { dependencies {
api(project(":prometeu-infra")) api(project(":prometeu-infra"))
implementation(project(":prometeu-compiler:prometeu-deps"))
implementation(project(":prometeu-compiler:prometeu-compiler-core"))
} }

View File

@ -0,0 +1,10 @@
package p.studio.compiler.messages;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class BuilderPipelineConfig {
private String rootProjectPath;
}

View File

@ -0,0 +1,27 @@
package p.studio.compiler.models;
import lombok.Getter;
import lombok.Setter;
import p.studio.compiler.messages.BuilderPipelineConfig;
import p.studio.utilities.logs.LogAggregator;
public class BuilderPipelineContext {
@Getter
private final BuilderPipelineConfig config;
@Getter
private final LogAggregator logs;
@Getter
@Setter
private ResolvedWorkspace resolvedWorkspace;
private BuilderPipelineContext(
final BuilderPipelineConfig config,
final LogAggregator logs) {
this.config = config;
this.logs = logs;
}
public static BuilderPipelineContext seed(BuilderPipelineConfig config, LogAggregator logAggregator) {
return new BuilderPipelineContext(config, logAggregator);
}
}

View File

@ -0,0 +1,55 @@
package p.studio.compiler.workspaces;
import lombok.extern.slf4j.Slf4j;
import p.studio.compiler.exceptions.BuildException;
import p.studio.compiler.messages.BuilderPipelineConfig;
import p.studio.compiler.models.BuilderPipelineContext;
import p.studio.compiler.workspaces.stages.DepsPipelineStage;
import p.studio.utilities.logs.LogAggregator;
import p.studio.utilities.structures.ReadOnlyCollection;
import java.util.List;
@Slf4j
public class BuilderPipelineService {
public final static BuilderPipelineService INSTANCE;
static {
final var stages = List.<PipelineStage>of(
new DepsPipelineStage()
);
INSTANCE = new BuilderPipelineService(stages);
}
private final List<PipelineStage> stages;
BuilderPipelineService(List<PipelineStage> stages) {
this.stages = stages;
}
public void run(
final BuilderPipelineConfig config,
final LogAggregator logs) {
final var ctx = BuilderPipelineContext.seed(config, logs);
for (final var builderPipelineStage : stages) {
final var issues = builderPipelineStage.run(ctx);
var error = false;
if (ReadOnlyCollection.isNotEmpty(issues)) {
for (final var issue : issues) {
if (issue.isError()) {
error = true;
logs.using(log).error(issue.getMessage(), issue.getException());
continue;
}
logs.using(log).warn(issue.getMessage());
}
}
if (error) {
throw new BuildException("issues found on pipeline stage: " + builderPipelineStage.getClass().getSimpleName());
}
}
logs.using(log).info("builder pipeline completed successfully");
}
}

View File

@ -0,0 +1,9 @@
package p.studio.compiler.workspaces;
import p.studio.compiler.messages.BuildingIssue;
import p.studio.compiler.models.BuilderPipelineContext;
import p.studio.utilities.structures.ReadOnlyCollection;
public interface PipelineStage {
ReadOnlyCollection<BuildingIssue> run(BuilderPipelineContext ctx);
}

View File

@ -0,0 +1,37 @@
package p.studio.compiler.workspaces.stages;
import p.studio.compiler.messages.BuildingIssue;
import p.studio.compiler.messages.DependencyConfig;
import p.studio.compiler.models.BuilderPipelineContext;
import p.studio.compiler.workspaces.DependencyService;
import p.studio.compiler.workspaces.PipelineStage;
import p.studio.utilities.structures.ReadOnlyCollection;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class DepsPipelineStage implements PipelineStage {
@Override
public ReadOnlyCollection<BuildingIssue> run(final BuilderPipelineContext ctx) {
final Path rootCanonPath;
try {
rootCanonPath = Paths.get(ctx.getConfig().getRootProjectPath()).toRealPath();
} catch (IOException e) {
return ReadOnlyCollection.wrap(List.of(BuildingIssue
.builder()
.error(true)
.message("[DEPS]: root directory no found: " + ctx.getConfig().getRootProjectPath())
.build()));
}
final var cfg = new DependencyConfig(false, rootCanonPath);
final var resolvedWorkspace = DependencyService.INSTANCE.run(cfg, ctx.getLogs());
for (final var pId : resolvedWorkspace.stack().projects()) {
final var pd = resolvedWorkspace.graph().projects().get(pId.getIndex());
ctx.getLogs().info("Project [ " + pd.getName() + " ] read");
}
ctx.setResolvedWorkspace(resolvedWorkspace);
return ReadOnlyCollection.empty();
}
}

View File

@ -1,4 +1,4 @@
package p.studio.compiler.model; package p.studio.compiler.messages;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;

View File

@ -1,4 +1,4 @@
package p.studio.compiler.model; package p.studio.compiler.models;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;

View File

@ -0,0 +1,9 @@
package p.studio.compiler.messages;
import java.nio.file.Path;
import java.util.List;
public record DependencyConfig(
boolean explain,
Path cacheDir) {
}

View File

@ -1,10 +0,0 @@
package p.studio.compiler.model;
import java.nio.file.Path;
import java.util.List;
public record DependencyPipelineConfig(
boolean explain,
Path cacheDir,
List<Path> registryDirs) {
}

View File

@ -1,9 +1,7 @@
package p.studio.compiler.model; package p.studio.compiler.models;
import p.studio.compiler.source.identifiers.ProjectId; import p.studio.compiler.source.identifiers.ProjectId;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import java.util.List;
public record BuildStack(ReadOnlyList<ProjectId> projects) { public record BuildStack(ReadOnlyList<ProjectId> projects) {
} }

View File

@ -1,6 +1,6 @@
package p.studio.compiler.workspaces; package p.studio.compiler.models;
import p.studio.compiler.model.*; import p.studio.compiler.messages.DependencyConfig;
import p.studio.compiler.source.identifiers.ProjectId; import p.studio.compiler.source.identifiers.ProjectId;
import p.studio.compiler.exceptions.BuildException; import p.studio.compiler.exceptions.BuildException;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
@ -8,8 +8,8 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.*; import java.util.*;
public final class DependencyPipelineContext { public final class DependencyContext {
private final DependencyPipelineConfig config; private final DependencyConfig config;
// Internal state mirroring Rust ResolverState // Internal state mirroring Rust ResolverState
public Path mainProjectRootPathCanon; public Path mainProjectRootPathCanon;
@ -27,15 +27,15 @@ public final class DependencyPipelineContext {
public ProjectId root; public ProjectId root;
public BuildStack stack; public BuildStack stack;
private DependencyPipelineContext(DependencyPipelineConfig config) { private DependencyContext(DependencyConfig config) {
this.config = config; this.config = config;
} }
public static DependencyPipelineContext seed(DependencyPipelineConfig config) { public static DependencyContext seed(DependencyConfig config) {
return new DependencyPipelineContext(config); return new DependencyContext(config);
} }
public DependencyPipelineConfig config() { public DependencyConfig config() {
return config; return config;
} }

View File

@ -1,4 +1,4 @@
package p.studio.compiler.model; package p.studio.compiler.models;
public record LoadedFile(String uri, String text) { public record LoadedFile(String uri, String text) {
} }

View File

@ -1,4 +1,4 @@
package p.studio.compiler.model; package p.studio.compiler.models;
import java.util.List; import java.util.List;

View File

@ -1,4 +1,4 @@
package p.studio.compiler.model; package p.studio.compiler.models;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
@ -6,7 +6,6 @@ import p.studio.compiler.source.identifiers.ProjectId;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List;
@Builder @Builder
@Getter @Getter

View File

@ -1,9 +1,8 @@
package p.studio.compiler.workspaces; package p.studio.compiler.models;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import p.studio.compiler.model.FrontendSpec;
import p.studio.compiler.model.PrometeuManifest;
import java.nio.file.Path; import java.nio.file.Path;
@Builder @Builder

View File

@ -1,9 +1,9 @@
package p.studio.compiler.workspaces; package p.studio.compiler.models;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import p.studio.compiler.model.FrontendSpec;
import p.studio.compiler.source.identifiers.ProjectId; import p.studio.compiler.source.identifiers.ProjectId;
import p.studio.compiler.workspaces.DependencyReference;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import java.nio.file.Path; import java.nio.file.Path;

View File

@ -1,4 +1,4 @@
package p.studio.compiler.model; package p.studio.compiler.models;
import p.studio.compiler.source.identifiers.ProjectId; import p.studio.compiler.source.identifiers.ProjectId;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;

View File

@ -1,4 +1,4 @@
package p.studio.compiler.model; package p.studio.compiler.models;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes;

View File

@ -1,4 +1,4 @@
package p.studio.compiler.model; package p.studio.compiler.models;
import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;

View File

@ -1,4 +1,4 @@
package p.studio.compiler.model; package p.studio.compiler.models;
import p.studio.compiler.source.identifiers.ProjectId; import p.studio.compiler.source.identifiers.ProjectId;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;

View File

@ -1,4 +1,4 @@
package p.studio.compiler.model; package p.studio.compiler.models;
import p.studio.compiler.source.identifiers.ProjectId; import p.studio.compiler.source.identifiers.ProjectId;

View File

@ -1,4 +1,4 @@
package p.studio.compiler.model; package p.studio.compiler.models;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;

View File

@ -0,0 +1,9 @@
package p.studio.compiler.workspaces;
import p.studio.compiler.messages.BuildingIssue;
import p.studio.compiler.models.DependencyContext;
import p.studio.utilities.structures.ReadOnlyCollection;
public interface DependencyPhase {
ReadOnlyCollection<BuildingIssue> run(DependencyContext state);
}

View File

@ -1,8 +0,0 @@
package p.studio.compiler.workspaces;
import p.studio.compiler.model.BuildingIssue;
import p.studio.utilities.structures.ReadOnlyCollection;
public interface DependencyPipelinePhase {
ReadOnlyCollection<BuildingIssue> run(DependencyPipelineContext state);
}

View File

@ -2,8 +2,9 @@ package p.studio.compiler.workspaces;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import p.studio.compiler.exceptions.BuildException; import p.studio.compiler.exceptions.BuildException;
import p.studio.compiler.model.DependencyPipelineConfig; import p.studio.compiler.messages.DependencyConfig;
import p.studio.compiler.model.ResolvedWorkspace; import p.studio.compiler.models.DependencyContext;
import p.studio.compiler.models.ResolvedWorkspace;
import p.studio.compiler.workspaces.phases.*; import p.studio.compiler.workspaces.phases.*;
import p.studio.utilities.logs.LogAggregator; import p.studio.utilities.logs.LogAggregator;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
@ -11,8 +12,8 @@ import p.studio.utilities.structures.ReadOnlyCollection;
import java.util.List; import java.util.List;
@Slf4j @Slf4j
public final class DependencyPipelineService { public final class DependencyService {
public final static DependencyPipelineService INSTANCE; public final static DependencyService INSTANCE;
static { static {
final var phases = List.of( final var phases = List.of(
@ -24,22 +25,22 @@ public final class DependencyPipelineService {
new StackPhase(), new StackPhase(),
new PolicyPhase() new PolicyPhase()
); );
INSTANCE = new DependencyPipelineService(phases); INSTANCE = new DependencyService(phases);
} }
private final List<DependencyPipelinePhase> phases; private final List<DependencyPhase> phases;
DependencyPipelineService(List<DependencyPipelinePhase> phases) { DependencyService(List<DependencyPhase> phases) {
this.phases = phases; this.phases = phases;
} }
public ResolvedWorkspace run( public ResolvedWorkspace run(
final DependencyPipelineConfig config, final DependencyConfig config,
final LogAggregator logs) { final LogAggregator logs) {
final var ctx = DependencyPipelineContext.seed(config); final var ctx = DependencyContext.seed(config);
for (final var dependencyPipelinePhase : phases) { for (final var dependencyPhase : phases) {
final var issues = dependencyPipelinePhase.run(ctx); final var issues = dependencyPhase.run(ctx);
var error = false; var error = false;
if (ReadOnlyCollection.isNotEmpty(issues)) { if (ReadOnlyCollection.isNotEmpty(issues)) {
for (final var issue : issues) { for (final var issue : issues) {
@ -52,11 +53,11 @@ public final class DependencyPipelineService {
} }
} }
if (error) { if (error) {
throw new BuildException("issues found during dependency pipeline phase: " + dependencyPipelinePhase.getClass().getSimpleName()); throw new BuildException("[DEPS]: issues found during dependency phase: " + dependencyPhase.getClass().getSimpleName());
} }
} }
logs.using(log).info("dependency pipeline completed successfully, going to resolve workspace"); logs.using(log).info("[DEPS]: dependency completed successfully");
return ctx.toResolvedWorkspace(); return ctx.toResolvedWorkspace();
} }

View File

@ -2,11 +2,11 @@ package p.studio.compiler.workspaces.phases;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import p.studio.compiler.FrontendRegistryService; import p.studio.compiler.FrontendRegistryService;
import p.studio.compiler.model.BuildingIssue; import p.studio.compiler.messages.BuildingIssue;
import p.studio.compiler.model.PrometeuManifest; import p.studio.compiler.models.PrometeuManifest;
import p.studio.compiler.workspaces.DependencyPipelinePhase; import p.studio.compiler.workspaces.DependencyPhase;
import p.studio.compiler.workspaces.DependencyPipelineContext; import p.studio.compiler.models.DependencyContext;
import p.studio.compiler.workspaces.ProjectInfo; import p.studio.compiler.models.ProjectInfo;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
import java.io.IOException; import java.io.IOException;
@ -16,11 +16,11 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class DiscoverPhase implements DependencyPipelinePhase { public class DiscoverPhase implements DependencyPhase {
private final ObjectMapper mapper = new ObjectMapper(); private final ObjectMapper mapper = new ObjectMapper();
@Override @Override
public ReadOnlyCollection<BuildingIssue> run(final DependencyPipelineContext ctx) { public ReadOnlyCollection<BuildingIssue> run(final DependencyContext ctx) {
final List<BuildingIssue> issues = new ArrayList<>(); final List<BuildingIssue> issues = new ArrayList<>();
while (!ctx.pending.isEmpty()) { while (!ctx.pending.isEmpty()) {
final var rootPathCanon = ctx.pending.pollFirst(); final var rootPathCanon = ctx.pending.pollFirst();

View File

@ -1,6 +1,7 @@
package p.studio.compiler.workspaces.phases; package p.studio.compiler.workspaces.phases;
import p.studio.compiler.model.BuildingIssue; import p.studio.compiler.messages.BuildingIssue;
import p.studio.compiler.models.DependencyContext;
import p.studio.compiler.workspaces.*; import p.studio.compiler.workspaces.*;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
@ -8,9 +9,9 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
public final class LocalizePhase implements DependencyPipelinePhase { public final class LocalizePhase implements DependencyPhase {
@Override @Override
public ReadOnlyCollection<BuildingIssue> run(final DependencyPipelineContext state) { public ReadOnlyCollection<BuildingIssue> run(final DependencyContext state) {
final List<BuildingIssue> issues = new ArrayList<>(); final List<BuildingIssue> issues = new ArrayList<>();
for (int i = 0; i < state.projectNodes.size(); i++) { for (int i = 0; i < state.projectNodes.size(); i++) {
final var fromProjectNode = state.projectNodes.get(i); final var fromProjectNode = state.projectNodes.get(i);

View File

@ -1,7 +1,7 @@
package p.studio.compiler.workspaces.phases; package p.studio.compiler.workspaces.phases;
import p.studio.compiler.model.BuildingIssue; import p.studio.compiler.messages.BuildingIssue;
import p.studio.compiler.model.PrometeuManifest; import p.studio.compiler.models.*;
import p.studio.compiler.source.identifiers.ProjectId; import p.studio.compiler.source.identifiers.ProjectId;
import p.studio.compiler.workspaces.*; import p.studio.compiler.workspaces.*;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
@ -11,9 +11,9 @@ import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.*; import java.util.*;
public final class MaterializePhase implements DependencyPipelinePhase { public final class MaterializePhase implements DependencyPhase {
@Override @Override
public ReadOnlyCollection<BuildingIssue> run(final DependencyPipelineContext ctx) { public ReadOnlyCollection<BuildingIssue> run(final DependencyContext ctx) {
// start all over again, we will re-populate the project nodes and edges based on the project infos // start all over again, we will re-populate the project nodes and edges based on the project infos
ctx.projectNodes.clear(); ctx.projectNodes.clear();
ctx.projectIdByDirectoryRoot.clear(); ctx.projectIdByDirectoryRoot.clear();

View File

@ -1,16 +1,16 @@
package p.studio.compiler.workspaces.phases; package p.studio.compiler.workspaces.phases;
import p.studio.compiler.model.BuildingIssue; import p.studio.compiler.messages.BuildingIssue;
import p.studio.compiler.workspaces.DependencyPipelinePhase; import p.studio.compiler.workspaces.DependencyPhase;
import p.studio.compiler.workspaces.DependencyPipelineContext; import p.studio.compiler.models.DependencyContext;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public final class PolicyPhase implements DependencyPipelinePhase { public final class PolicyPhase implements DependencyPhase {
@Override @Override
public ReadOnlyCollection<BuildingIssue> run(DependencyPipelineContext state) { public ReadOnlyCollection<BuildingIssue> run(DependencyContext state) {
final List<BuildingIssue> issues = new ArrayList<>(); final List<BuildingIssue> issues = new ArrayList<>();
// No-op for now; in Rust this applies source policies // No-op for now; in Rust this applies source policies
return ReadOnlyCollection.wrap(issues); return ReadOnlyCollection.wrap(issues);

View File

@ -1,17 +1,17 @@
package p.studio.compiler.workspaces.phases; package p.studio.compiler.workspaces.phases;
import p.studio.compiler.model.BuildingIssue; import p.studio.compiler.messages.BuildingIssue;
import p.studio.compiler.workspaces.DependencyPipelinePhase; import p.studio.compiler.workspaces.DependencyPhase;
import p.studio.compiler.workspaces.DependencyPipelineContext; import p.studio.compiler.models.DependencyContext;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public final class SeedPhase implements DependencyPipelinePhase { public final class SeedPhase implements DependencyPhase {
@Override @Override
public ReadOnlyCollection<BuildingIssue> run(final DependencyPipelineContext ctx) { public ReadOnlyCollection<BuildingIssue> run(final DependencyContext ctx) {
final List<BuildingIssue> issues = new ArrayList<>(); final List<BuildingIssue> issues = new ArrayList<>();
try { try {
ctx.mainProjectRootPathCanon = ctx.config().cacheDir().toRealPath(); ctx.mainProjectRootPathCanon = ctx.config().cacheDir().toRealPath();

View File

@ -1,10 +1,10 @@
package p.studio.compiler.workspaces.phases; package p.studio.compiler.workspaces.phases;
import p.studio.compiler.model.BuildStack; import p.studio.compiler.models.BuildStack;
import p.studio.compiler.model.BuildingIssue; import p.studio.compiler.messages.BuildingIssue;
import p.studio.compiler.source.identifiers.ProjectId; import p.studio.compiler.source.identifiers.ProjectId;
import p.studio.compiler.workspaces.DependencyPipelineContext; import p.studio.compiler.models.DependencyContext;
import p.studio.compiler.workspaces.DependencyPipelinePhase; import p.studio.compiler.workspaces.DependencyPhase;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
@ -15,12 +15,12 @@ import java.util.List;
import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.joining;
public final class StackPhase implements DependencyPipelinePhase { public final class StackPhase implements DependencyPhase {
/** /**
* Implements topological sort; detects dependency cycles; sets build stack * Implements topological sort; detects dependency cycles; sets build stack
*/ */
@Override @Override
public ReadOnlyCollection<BuildingIssue> run(DependencyPipelineContext ctx) { public ReadOnlyCollection<BuildingIssue> run(DependencyContext ctx) {
final int n = ctx.projectNodes.size(); final int n = ctx.projectNodes.size();
final int[] indeg = new int[n]; final int[] indeg = new int[n];
for (int from = 0; from < n; from++) { for (int from = 0; from < n; from++) {

View File

@ -1,15 +1,15 @@
package p.studio.compiler.workspaces.phases; package p.studio.compiler.workspaces.phases;
import p.studio.compiler.model.BuildingIssue; import p.studio.compiler.messages.BuildingIssue;
import p.studio.compiler.workspaces.DependencyPipelineContext; import p.studio.compiler.models.DependencyContext;
import p.studio.compiler.workspaces.DependencyPipelinePhase; import p.studio.compiler.workspaces.DependencyPhase;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
import java.util.List; import java.util.List;
public final class ValidatePhase implements DependencyPipelinePhase { public final class ValidatePhase implements DependencyPhase {
@Override @Override
public ReadOnlyCollection<BuildingIssue> run(DependencyPipelineContext state) { public ReadOnlyCollection<BuildingIssue> run(DependencyContext state) {
if (state.root == null) { if (state.root == null) {
final var issue = BuildingIssue final var issue = BuildingIssue
.builder() .builder()

View File

@ -2,8 +2,8 @@ package p.studio.compiler.workspaces;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import p.studio.compiler.model.DependencyPipelineConfig; import p.studio.compiler.messages.DependencyConfig;
import p.studio.compiler.model.ResolvedWorkspace; import p.studio.compiler.models.ResolvedWorkspace;
import p.studio.compiler.workspaces.phases.*; import p.studio.compiler.workspaces.phases.*;
import java.io.IOException; import java.io.IOException;
@ -13,7 +13,7 @@ import java.util.List;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
class DependencyPipelineServiceTest { class DependencyServiceTest {
@Test @Test
void canonical_pipeline_e2e(@TempDir Path tempDir) throws IOException { void canonical_pipeline_e2e(@TempDir Path tempDir) throws IOException {
@ -26,7 +26,7 @@ class DependencyPipelineServiceTest {
writeManifest(root, "root-proj", "0.1.0", new String[]{"depA"}); writeManifest(root, "root-proj", "0.1.0", new String[]{"depA"});
writeManifest(depA, "dep-a", "0.1.0", new String[]{}); writeManifest(depA, "dep-a", "0.1.0", new String[]{});
final var cfg = new DependencyPipelineConfig(false, root, List.of()); final var cfg = new DependencyConfig(false, root, List.of());
final var phases = List.of( final var phases = List.of(
new SeedPhase(), new SeedPhase(),
new DiscoverPhase(), new DiscoverPhase(),
@ -37,7 +37,7 @@ class DependencyPipelineServiceTest {
new PolicyPhase() new PolicyPhase()
); );
final var service = new DependencyPipelineService(phases); final var service = new DependencyService(phases);
final ResolvedWorkspace ws = service.run(cfg); final ResolvedWorkspace ws = service.run(cfg);
assertNotNull(ws); assertNotNull(ws);

View File

@ -2,7 +2,8 @@ package p.studio.compiler.workspaces;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import p.studio.compiler.model.DependencyPipelineConfig; import p.studio.compiler.messages.DependencyConfig;
import p.studio.compiler.models.DependencyContext;
import p.studio.compiler.workspaces.phases.DiscoverPhase; import p.studio.compiler.workspaces.phases.DiscoverPhase;
import p.studio.compiler.workspaces.phases.SeedPhase; import p.studio.compiler.workspaces.phases.SeedPhase;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
@ -25,8 +26,8 @@ class DiscoverPhaseTest {
writeManifest(root, "root-proj", "0.1.0", new String[]{"depA"}, null); writeManifest(root, "root-proj", "0.1.0", new String[]{"depA"}, null);
writeManifest(depA, "dep-a", "0.1.0", new String[]{}, null); writeManifest(depA, "dep-a", "0.1.0", new String[]{}, null);
final var cfg = new DependencyPipelineConfig(false, root, java.util.List.of()); final var cfg = new DependencyConfig(false, root, java.util.List.of());
final var ctx = DependencyPipelineContext.seed(cfg); final var ctx = DependencyContext.seed(cfg);
assertTrue(ReadOnlyCollection.isEmpty(new SeedPhase().run(ctx))); assertTrue(ReadOnlyCollection.isEmpty(new SeedPhase().run(ctx)));
final var issues = new DiscoverPhase().run(ctx); final var issues = new DiscoverPhase().run(ctx);

View File

@ -2,7 +2,8 @@ package p.studio.compiler.workspaces;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import p.studio.compiler.model.DependencyPipelineConfig; import p.studio.compiler.messages.DependencyConfig;
import p.studio.compiler.models.DependencyContext;
import p.studio.compiler.workspaces.phases.*; import p.studio.compiler.workspaces.phases.*;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
@ -25,8 +26,8 @@ class LocalizePhaseTest {
writeManifest(root, "root-proj", "0.1.0", new String[]{"depA"}); writeManifest(root, "root-proj", "0.1.0", new String[]{"depA"});
writeManifest(depA, "dep-a", "0.1.0", new String[]{}); writeManifest(depA, "dep-a", "0.1.0", new String[]{});
final var cfg = new DependencyPipelineConfig(false, root, java.util.List.of()); final var cfg = new DependencyConfig(false, root, java.util.List.of());
final var ctx = DependencyPipelineContext.seed(cfg); final var ctx = DependencyContext.seed(cfg);
assertTrue(ReadOnlyCollection.isEmpty(new SeedPhase().run(ctx))); assertTrue(ReadOnlyCollection.isEmpty(new SeedPhase().run(ctx)));
assertTrue(ReadOnlyCollection.isEmpty(new DiscoverPhase().run(ctx))); assertTrue(ReadOnlyCollection.isEmpty(new DiscoverPhase().run(ctx)));
assertTrue(ReadOnlyCollection.isEmpty(new MaterializePhase().run(ctx))); assertTrue(ReadOnlyCollection.isEmpty(new MaterializePhase().run(ctx)));

View File

@ -2,7 +2,8 @@ package p.studio.compiler.workspaces;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import p.studio.compiler.model.DependencyPipelineConfig; import p.studio.compiler.messages.DependencyConfig;
import p.studio.compiler.models.DependencyContext;
import p.studio.compiler.workspaces.phases.DiscoverPhase; import p.studio.compiler.workspaces.phases.DiscoverPhase;
import p.studio.compiler.workspaces.phases.MaterializePhase; import p.studio.compiler.workspaces.phases.MaterializePhase;
import p.studio.compiler.workspaces.phases.SeedPhase; import p.studio.compiler.workspaces.phases.SeedPhase;
@ -27,8 +28,8 @@ class MaterializePhaseTest {
writeManifest(root, "root-proj", "0.1.0", new String[]{"depA"}); writeManifest(root, "root-proj", "0.1.0", new String[]{"depA"});
writeManifest(depA, "dep-a", "0.1.0", new String[]{}); writeManifest(depA, "dep-a", "0.1.0", new String[]{});
final var cfg = new DependencyPipelineConfig(false, root, java.util.List.of()); final var cfg = new DependencyConfig(false, root, java.util.List.of());
final var ctx = DependencyPipelineContext.seed(cfg); final var ctx = DependencyContext.seed(cfg);
assertTrue(ReadOnlyCollection.isEmpty(new SeedPhase().run(ctx))); assertTrue(ReadOnlyCollection.isEmpty(new SeedPhase().run(ctx)));
assertTrue(ReadOnlyCollection.isEmpty(new DiscoverPhase().run(ctx))); assertTrue(ReadOnlyCollection.isEmpty(new DiscoverPhase().run(ctx)));

View File

@ -2,7 +2,8 @@ package p.studio.compiler.workspaces;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import p.studio.compiler.model.DependencyPipelineConfig; import p.studio.compiler.messages.DependencyConfig;
import p.studio.compiler.models.DependencyContext;
import p.studio.compiler.workspaces.phases.SeedPhase; import p.studio.compiler.workspaces.phases.SeedPhase;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
@ -14,8 +15,8 @@ class SeedPhaseTest {
@Test @Test
void seed_initializes_root_and_pending(@TempDir Path tempDir) throws Exception { void seed_initializes_root_and_pending(@TempDir Path tempDir) throws Exception {
final var cfg = new DependencyPipelineConfig(false, tempDir, java.util.List.of()); final var cfg = new DependencyConfig(false, tempDir, java.util.List.of());
final var ctx = DependencyPipelineContext.seed(cfg); final var ctx = DependencyContext.seed(cfg);
final var issues = new SeedPhase().run(ctx); final var issues = new SeedPhase().run(ctx);
assertTrue(ReadOnlyCollection.isEmpty(issues), "Nenhum issue esperado na SeedPhase"); assertTrue(ReadOnlyCollection.isEmpty(issues), "Nenhum issue esperado na SeedPhase");

View File

@ -2,7 +2,8 @@ package p.studio.compiler.workspaces;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import p.studio.compiler.model.DependencyPipelineConfig; import p.studio.compiler.messages.DependencyConfig;
import p.studio.compiler.models.DependencyContext;
import p.studio.compiler.workspaces.phases.*; import p.studio.compiler.workspaces.phases.*;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
@ -25,8 +26,8 @@ class StackPhaseTest {
writeManifest(root, "root-proj", "0.1.0", new String[]{"depA"}); writeManifest(root, "root-proj", "0.1.0", new String[]{"depA"});
writeManifest(depA, "dep-a", "0.1.0", new String[]{}); writeManifest(depA, "dep-a", "0.1.0", new String[]{});
final var cfg = new DependencyPipelineConfig(false, root, java.util.List.of()); final var cfg = new DependencyConfig(false, root, java.util.List.of());
final var ctx = DependencyPipelineContext.seed(cfg); final var ctx = DependencyContext.seed(cfg);
assertTrue(ReadOnlyCollection.isEmpty(new SeedPhase().run(ctx))); assertTrue(ReadOnlyCollection.isEmpty(new SeedPhase().run(ctx)));
assertTrue(ReadOnlyCollection.isEmpty(new DiscoverPhase().run(ctx))); assertTrue(ReadOnlyCollection.isEmpty(new DiscoverPhase().run(ctx)));
assertTrue(ReadOnlyCollection.isEmpty(new MaterializePhase().run(ctx))); assertTrue(ReadOnlyCollection.isEmpty(new MaterializePhase().run(ctx)));

View File

@ -2,7 +2,8 @@ package p.studio.compiler.workspaces;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import p.studio.compiler.model.DependencyPipelineConfig; import p.studio.compiler.messages.DependencyConfig;
import p.studio.compiler.models.DependencyContext;
import p.studio.compiler.workspaces.phases.*; import p.studio.compiler.workspaces.phases.*;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
@ -25,8 +26,8 @@ class ValidateAndPolicyPhasesTest {
writeManifest(root, "root-proj", "0.1.0", new String[]{"depA"}); writeManifest(root, "root-proj", "0.1.0", new String[]{"depA"});
writeManifest(depA, "dep-a", "0.1.0", new String[]{}); writeManifest(depA, "dep-a", "0.1.0", new String[]{});
final var cfg = new DependencyPipelineConfig(false, root, java.util.List.of()); final var cfg = new DependencyConfig(false, root, java.util.List.of());
final var ctx = DependencyPipelineContext.seed(cfg); final var ctx = DependencyContext.seed(cfg);
assertTrue(ReadOnlyCollection.isEmpty(new SeedPhase().run(ctx))); assertTrue(ReadOnlyCollection.isEmpty(new SeedPhase().run(ctx)));
assertTrue(ReadOnlyCollection.isEmpty(new DiscoverPhase().run(ctx))); assertTrue(ReadOnlyCollection.isEmpty(new DiscoverPhase().run(ctx)));
assertTrue(ReadOnlyCollection.isEmpty(new MaterializePhase().run(ctx))); assertTrue(ReadOnlyCollection.isEmpty(new MaterializePhase().run(ctx)));
@ -38,8 +39,8 @@ class ValidateAndPolicyPhasesTest {
@Test @Test
void policy_is_noop(@TempDir Path tempDir) { void policy_is_noop(@TempDir Path tempDir) {
final var cfg = new DependencyPipelineConfig(false, tempDir, java.util.List.of()); final var cfg = new DependencyConfig(false, tempDir, java.util.List.of());
final var ctx = DependencyPipelineContext.seed(cfg); final var ctx = DependencyContext.seed(cfg);
final var issues = new PolicyPhase().run(ctx); final var issues = new PolicyPhase().run(ctx);
assertTrue(ReadOnlyCollection.isEmpty(issues), "PolicyPhase atualmente é no-op"); assertTrue(ReadOnlyCollection.isEmpty(issues), "PolicyPhase atualmente é no-op");
} }

View File

@ -1,6 +1,6 @@
package p.studio.compiler; package p.studio.compiler;
import p.studio.compiler.model.FrontendSpec; import p.studio.compiler.models.FrontendSpec;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;

View File

@ -6,7 +6,7 @@ plugins {
dependencies { dependencies {
implementation(project(":prometeu-infra")) implementation(project(":prometeu-infra"))
implementation(project(":prometeu-compiler:prometeu-compiler-core")) implementation(project(":prometeu-compiler:prometeu-compiler-core"))
implementation(project(":prometeu-compiler:prometeu-deps")) implementation(project(":prometeu-compiler:prometeu-build-pipeline"))
implementation(libs.javafx.controls) implementation(libs.javafx.controls)
implementation(libs.javafx.fxml) implementation(libs.javafx.fxml)
implementation(libs.richtextfx) implementation(libs.richtextfx)

View File

@ -6,16 +6,13 @@ import javafx.scene.control.*;
import javafx.scene.layout.BorderPane; import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane; import javafx.scene.layout.StackPane;
import p.studio.Container; import p.studio.Container;
import p.studio.compiler.model.DependencyPipelineConfig; import p.studio.compiler.messages.BuilderPipelineConfig;
import p.studio.compiler.workspaces.DependencyPipelineService; import p.studio.compiler.workspaces.BuilderPipelineService;
import p.studio.utilities.i18n.I18n; import p.studio.utilities.i18n.I18n;
import p.studio.utilities.logs.LogAggregator; import p.studio.utilities.logs.LogAggregator;
import p.studio.workspaces.Workspace; import p.studio.workspaces.Workspace;
import p.studio.workspaces.WorkspaceId; import p.studio.workspaces.WorkspaceId;
import java.nio.file.Paths;
import java.util.List;
public class BuilderWorkspace implements Workspace { public class BuilderWorkspace implements Workspace {
private final BorderPane root = new BorderPane(); private final BorderPane root = new BorderPane();
private final TextArea logs = new TextArea(); private final TextArea logs = new TextArea();
@ -53,13 +50,10 @@ public class BuilderWorkspace implements Workspace {
private ToolBar buildToolBar() { private ToolBar buildToolBar() {
buildButton.textProperty().bind(Container.i18n().bind(I18n.WORKSPACE_BUILDER_BUTTON_RUN)); buildButton.textProperty().bind(Container.i18n().bind(I18n.WORKSPACE_BUILDER_BUTTON_RUN));
buildButton.setOnAction(e -> { buildButton.setOnAction(e -> {
final var rootPath = Paths.get("../test-projects/main").toAbsolutePath();
final var cfg = new DependencyPipelineConfig(false, rootPath, List.of());
final var logAggregator = LogAggregator.with(logs::appendText); final var logAggregator = LogAggregator.with(logs::appendText);
final var resolvedWorkspace = DependencyPipelineService.INSTANCE.run(cfg, logAggregator); final var config = new BuilderPipelineConfig();
for (final var p : resolvedWorkspace.graph().projects()) { config.setRootProjectPath("../test-projects/main");
logs.appendText("Project [ " + p.getName() + " ] read\n"); BuilderPipelineService.INSTANCE.run(config, logAggregator);
}
}); });
return new ToolBar(buildButton); return new ToolBar(buildButton);
} }

View File

@ -8,9 +8,6 @@
}, },
{ {
"path": "../sdk" "path": "../sdk"
},
{
"path": "../main"
} }
] ]
} }

View File

@ -3,9 +3,6 @@
"version": "1.0.0", "version": "1.0.0",
"language": "pbs", "language": "pbs",
"dependencies": [ "dependencies": [
{
"path": "../dep1"
},
{ {
"path": "../sdk" "path": "../sdk"
} }