Skip to content

Commit 1e409ed

Browse files
authored
feat: If DeclarativeRecipe only has already-initialized recipes, don't require initialization (#4267)
1 parent cfd15b6 commit 1e409ed

File tree

2 files changed

+74
-16
lines changed

2 files changed

+74
-16
lines changed

rewrite-core/src/main/java/org/openrewrite/config/DeclarativeRecipe.java

+12-5
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ public String getDescription() {
150150
public TreeVisitor<?, ExecutionContext> getVisitor() {
151151
return new TreeVisitor<Tree, ExecutionContext>() {
152152
TreeVisitor<?, ExecutionContext> p = precondition.get();
153+
153154
@Override
154155
public boolean isAcceptable(SourceFile sourceFile, ExecutionContext ctx) {
155156
return p.isAcceptable(sourceFile, ctx);
@@ -314,11 +315,17 @@ public void addValidation(Validated<Object> validated) {
314315

315316
@Override
316317
public Validated<Object> validate() {
317-
return Validated.<Object>test("initialization",
318-
"initialize(..) must be called on DeclarativeRecipe prior to use.",
319-
this, r -> initValidation != null)
320-
.and(validation)
321-
.and(initValidation);
318+
Validated<Object> validated = Validated.none();
319+
320+
if (!uninitializedRecipes.isEmpty() && uninitializedRecipes.size() != recipeList.size()) {
321+
validated = validated.and(Validated.invalid("initialization", recipeList, "DeclarativeRecipe must not contain uninitialized recipes. Be sure to call .initialize() on DeclarativeRecipe."));
322+
}
323+
if (!uninitializedPreconditions.isEmpty() && uninitializedPreconditions.size() != preconditions.size()) {
324+
validated = validated.and(Validated.invalid("initialization", preconditions, "DeclarativeRecipe must not contain uninitialized preconditions. Be sure to call .initialize() on DeclarativeRecipe."));
325+
}
326+
327+
return validated.and(validation)
328+
.and(initValidation == null ? Validated.none() : initValidation);
322329
}
323330

324331
@Value

rewrite-core/src/test/java/org/openrewrite/config/DeclarativeRecipeTest.java

+62-11
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,57 @@ public PlainText visitText(PlainText text, ExecutionContext ctx) {
7171
);
7272
}
7373

74+
@Test
75+
void uninitializedFailsValidation() {
76+
DeclarativeRecipe dr = new DeclarativeRecipe("test", "test", "test", null,
77+
null, null, true, null);
78+
dr.addUninitializedPrecondition(
79+
toRecipe(() -> new PlainTextVisitor<>() {
80+
@Override
81+
public PlainText visitText(PlainText text, ExecutionContext ctx) {
82+
if ("1".equals(text.getText())) {
83+
return SearchResult.found(text);
84+
}
85+
return text;
86+
}
87+
})
88+
);
89+
dr.addUninitialized(
90+
new ChangeText("2")
91+
);
92+
dr.addUninitialized(
93+
new ChangeText("3")
94+
);
95+
Validated<Object> validation = dr.validate();
96+
assertThat(validation.isValid()).isFalse();
97+
assertThat(validation.failures().size()).isEqualTo(2);
98+
assertThat(validation.failures().get(0).getProperty()).isEqualTo("initialization");
99+
}
100+
101+
@Test
102+
void uninitializedWithInitializedRecipesPassesValidation() {
103+
DeclarativeRecipe dr = new DeclarativeRecipe("test", "test", "test", null,
104+
null, null, true, null);
105+
dr.setPreconditions(
106+
List.of(
107+
toRecipe(() -> new PlainTextVisitor<>() {
108+
@Override
109+
public PlainText visitText(PlainText text, ExecutionContext ctx) {
110+
if ("1".equals(text.getText())) {
111+
return SearchResult.found(text);
112+
}
113+
return text;
114+
}
115+
}))
116+
);
117+
dr.setRecipeList(List.of(
118+
new ChangeText("2"),
119+
new ChangeText("3")
120+
));
121+
Validated<Object> validation = dr.validate();
122+
assertThat(validation.isValid()).isTrue();
123+
}
124+
74125
@Test
75126
void yamlPrecondition() {
76127
rewriteRun(
@@ -96,17 +147,17 @@ void yamlPrecondition() {
96147
void yamlPreconditionWithScanningRecipe() {
97148
rewriteRun(
98149
spec -> spec.recipeFromYaml("""
99-
---
100-
type: specs.openrewrite.org/v1beta/recipe
101-
name: org.openrewrite.PreconditionTest
102-
preconditions:
103-
- org.openrewrite.text.Find:
104-
find: 1
105-
recipeList:
106-
- org.openrewrite.text.CreateTextFile:
107-
relativeFileName: test.txt
108-
fileContents: "test"
109-
""", "org.openrewrite.PreconditionTest")
150+
---
151+
type: specs.openrewrite.org/v1beta/recipe
152+
name: org.openrewrite.PreconditionTest
153+
preconditions:
154+
- org.openrewrite.text.Find:
155+
find: 1
156+
recipeList:
157+
- org.openrewrite.text.CreateTextFile:
158+
relativeFileName: test.txt
159+
fileContents: "test"
160+
""", "org.openrewrite.PreconditionTest")
110161
.afterRecipe(run -> {
111162
assertThat(run.getChangeset().getAllResults()).anySatisfy(
112163
s -> {

0 commit comments

Comments
 (0)