From 9daa6f1d38042f44d2d58902dcb45f0f5cebf3c1 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Wed, 5 Aug 2026 09:20:09 +0200 Subject: [PATCH] Make subpackage recursion explicit in the JavaFaker and Fest renames Both of these `ChangePackage` rules omit `recursive` while depending on it, so types in subpackages of `oldPackageName` were never migrated. Verified against the published artifacts: javafaker 1.0.2 -> datafaker 2.4.2 com.github.javafaker.idnumbers -> net.datafaker.idnumbers com.github.javafaker.service -> net.datafaker.service com.github.javafaker.service.files -> net.datafaker.service.files fest-assert-core 2.0M10 -> assertj-core 3.26.3 org.fest.assertions.api.filter -> org.assertj.core.api.filter Every subpackage maps exactly under prefix substitution, so recursion is both safe and required here. The existing tests could not catch this. `ChangePackage.recursive` is `@Nullable` with no documented default, and a null was read as non-recursive by the recipe's preconditions but as recursive by its visitor, so a subpackage type was renamed only for files that also referenced a type sitting directly in `oldPackageName` -- which the existing fixtures all do. The two new tests import only a subpackage type and fail without this change. --- .../resources/META-INF/rewrite/assertj.yml | 1 + .../resources/META-INF/rewrite/datafaker.yml | 1 + .../testing/assertj/FestToAssertJTest.java | 21 +++++++++++++++++++ .../datafaker/JavaFakerToDataFakerTest.java | 21 +++++++++++++++++++ 4 files changed, 44 insertions(+) diff --git a/src/main/resources/META-INF/rewrite/assertj.yml b/src/main/resources/META-INF/rewrite/assertj.yml index b8be8c5c7..daa4c087b 100644 --- a/src/main/resources/META-INF/rewrite/assertj.yml +++ b/src/main/resources/META-INF/rewrite/assertj.yml @@ -581,6 +581,7 @@ recipeList: - org.openrewrite.java.ChangePackage: oldPackageName: org.fest.assertions.api newPackageName: org.assertj.core.api + recursive: true - org.openrewrite.java.ChangeType: oldFullyQualifiedTypeName: org.fest.assertions.core.Condition newFullyQualifiedTypeName: org.assertj.core.api.Condition diff --git a/src/main/resources/META-INF/rewrite/datafaker.yml b/src/main/resources/META-INF/rewrite/datafaker.yml index f6349e625..0f4c40c40 100644 --- a/src/main/resources/META-INF/rewrite/datafaker.yml +++ b/src/main/resources/META-INF/rewrite/datafaker.yml @@ -34,6 +34,7 @@ recipeList: - org.openrewrite.java.ChangePackage: oldPackageName: com.github.javafaker newPackageName: net.datafaker + recursive: true - org.openrewrite.java.dependencies.ChangeDependency: oldGroupId: com.github.javafaker oldArtifactId: javafaker diff --git a/src/test/java/org/openrewrite/java/testing/assertj/FestToAssertJTest.java b/src/test/java/org/openrewrite/java/testing/assertj/FestToAssertJTest.java index a41ef60dd..cece5cf03 100644 --- a/src/test/java/org/openrewrite/java/testing/assertj/FestToAssertJTest.java +++ b/src/test/java/org/openrewrite/java/testing/assertj/FestToAssertJTest.java @@ -211,4 +211,25 @@ void test(Object object1, Object object2) { ) ); } + + @Test + void typeInSubpackage() { + //language=java + rewriteRun( + java( + """ + import org.fest.assertions.api.filter.Filters; + class A { + Class type = Filters.class; + } + """, + """ + import org.assertj.core.api.filter.Filters; + class A { + Class type = Filters.class; + } + """ + ) + ); + } } diff --git a/src/test/java/org/openrewrite/java/testing/datafaker/JavaFakerToDataFakerTest.java b/src/test/java/org/openrewrite/java/testing/datafaker/JavaFakerToDataFakerTest.java index cae74fd62..1f102db06 100644 --- a/src/test/java/org/openrewrite/java/testing/datafaker/JavaFakerToDataFakerTest.java +++ b/src/test/java/org/openrewrite/java/testing/datafaker/JavaFakerToDataFakerTest.java @@ -66,4 +66,25 @@ void method() { ) ); } + + @Test + void typeInSubpackage() { + rewriteRun( + //language=java + java( + """ + import com.github.javafaker.service.RandomService; + class A { + RandomService random = new RandomService(); + } + """, + """ + import net.datafaker.service.RandomService; + class A { + RandomService random = new RandomService(); + } + """ + ) + ); + } }