Skip to content

Commit 598d7cd

Browse files
feature: ArchUnit 0.x to 1.x migration (#432)
* feature: ArchUnit 0.x to 1.x migration Resolves #431 * feat: add testcases for ArchUnit 0 to 1 migration * Minor test fixes * Upgrade any ArchUnit dependency --------- Co-authored-by: Tim te Beek <[email protected]>
1 parent 595a273 commit 598d7cd

File tree

3 files changed

+378
-0
lines changed

3 files changed

+378
-0
lines changed

build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ dependencies {
4444

4545
testRuntimeOnly("org.gradle:gradle-tooling-api:latest.release")
4646

47+
testRuntimeOnly("com.tngtech.archunit:archunit:0.23.1")
48+
4749
// testImplementation("org.hamcrest:hamcrest:latest.release")
4850
// testImplementation("org.assertj:assertj-core:latest.release")
4951
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#
2+
# Copyright 2023 the original author or authors.
3+
# <p>
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
# <p>
8+
# https://www.apache.org/licenses/LICENSE-2.0
9+
# <p>
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
#
16+
---
17+
type: specs.openrewrite.org/v1beta/recipe
18+
name: org.openrewrite.java.testing.archunit.ArchUnit0to1Migration
19+
displayName: ArchUnit 0.x upgrade
20+
description: Upgrade ArchUnit from 0.x to 1.x.
21+
recipeList:
22+
- org.openrewrite.java.dependencies.UpgradeDependencyVersion:
23+
groupId: com.tngtech.archunit
24+
artifactId: archunit*
25+
newVersion: 1.x
26+
- org.openrewrite.java.ChangeMethodName:
27+
methodPattern: com.tngtech.archunit.core.domain.JavaPackage getAllClasses()
28+
newMethodName: getClassesInPackageTree
29+
- org.openrewrite.java.ChangeMethodName:
30+
methodPattern: com.tngtech.archunit.core.domain.JavaPackage getAllSubpackages()
31+
newMethodName: getSubpackagesInTree
32+
- org.openrewrite.java.ChangeMethodName:
33+
methodPattern: com.tngtech.archunit.core.domain.JavaPackage getClassDependenciesFromSelf()
34+
newMethodName: getClassDependenciesFromThisPackageTree
35+
- org.openrewrite.java.ChangeMethodName:
36+
methodPattern: com.tngtech.archunit.core.domain.JavaPackage getClassDependenciesToSelf()
37+
newMethodName: getClassDependenciesToThisPackageTree
38+
- org.openrewrite.java.ChangeMethodName:
39+
methodPattern: com.tngtech.archunit.core.domain.JavaPackage getPackageDependenciesFromSelf()
40+
newMethodName: getPackageDependenciesFromThisPackageTree
41+
- org.openrewrite.java.ChangeMethodName:
42+
methodPattern: com.tngtech.archunit.core.domain.JavaPackage getPackageDependenciesToSelf()
43+
newMethodName: getPackageDependenciesToThisPackageTree
44+
- org.openrewrite.java.ChangeMethodName:
45+
methodPattern: com.tngtech.archunit.core.domain.JavaPackage accept(..)
46+
newMethodName: traversePackageTree
47+
- org.openrewrite.java.ChangePackage:
48+
oldPackageName: com.tngtech.archunit.library.plantuml
49+
newPackageName: com.tngtech.archunit.library.plantuml.rules
Lines changed: 327 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,327 @@
1+
/*
2+
* Copyright 2023 the original author or authors.
3+
* <p>
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
* <p>
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
* <p>
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.openrewrite.java.testing.archunit;
17+
18+
import org.junit.jupiter.api.Test;
19+
import org.openrewrite.java.JavaParser;
20+
import org.openrewrite.test.RecipeSpec;
21+
import org.openrewrite.test.RewriteTest;
22+
23+
import java.util.regex.Matcher;
24+
import java.util.regex.Pattern;
25+
26+
import static org.openrewrite.java.Assertions.java;
27+
import static org.openrewrite.java.Assertions.mavenProject;
28+
import static org.openrewrite.maven.Assertions.pomXml;
29+
30+
class ArchUnit0To1MigrationTest implements RewriteTest {
31+
@Override
32+
public void defaults(RecipeSpec spec) {
33+
spec
34+
.parser(JavaParser.fromJavaVersion().classpath("archunit-0.23.1"))
35+
.recipeFromResource("/META-INF/rewrite/archunit.yml", "org.openrewrite.java.testing.archunit.ArchUnit0to1Migration");
36+
}
37+
38+
@Test
39+
void shouldMigrateMavenDependency() {
40+
rewriteRun(
41+
mavenProject("project",
42+
//language=xml
43+
pomXml(
44+
"""
45+
<project>
46+
<modelVersion>4.0.0</modelVersion>
47+
<groupId>com.example</groupId>
48+
<artifactId>demo</artifactId>
49+
<version>0.0.1-SNAPSHOT</version>
50+
<dependencies>
51+
<dependency>
52+
<groupId>com.tngtech.archunit</groupId>
53+
<artifactId>archunit-junit5</artifactId>
54+
<version>0.23.1</version>
55+
<scope>test</scope>
56+
</dependency>
57+
</dependencies>
58+
</project>
59+
""",
60+
spec -> spec.after(pom -> {
61+
Matcher matcher = Pattern.compile("<version>(1\\..+)</version>").matcher(pom);
62+
matcher.find();
63+
String version = matcher.group(1);
64+
return """
65+
<project>
66+
<modelVersion>4.0.0</modelVersion>
67+
<groupId>com.example</groupId>
68+
<artifactId>demo</artifactId>
69+
<version>0.0.1-SNAPSHOT</version>
70+
<dependencies>
71+
<dependency>
72+
<groupId>com.tngtech.archunit</groupId>
73+
<artifactId>archunit-junit5</artifactId>
74+
<version>%s</version>
75+
<scope>test</scope>
76+
</dependency>
77+
</dependencies>
78+
</project>
79+
""".formatted(version);
80+
})
81+
)
82+
)
83+
);
84+
}
85+
86+
@Test
87+
void shouldUseGetClassesInPackageTree() {
88+
//language=java
89+
rewriteRun(
90+
java(
91+
"""
92+
import com.tngtech.archunit.core.domain.JavaPackage;
93+
import java.util.Set;
94+
import com.tngtech.archunit.core.domain.JavaClass;
95+
96+
public class ArchUnitTest {
97+
public Set<JavaClass> sample(JavaPackage javaPackage) {
98+
return javaPackage.getAllClasses();
99+
}
100+
}
101+
""",
102+
"""
103+
import com.tngtech.archunit.core.domain.JavaPackage;
104+
import java.util.Set;
105+
import com.tngtech.archunit.core.domain.JavaClass;
106+
107+
public class ArchUnitTest {
108+
public Set<JavaClass> sample(JavaPackage javaPackage) {
109+
return javaPackage.getClassesInPackageTree();
110+
}
111+
}
112+
"""
113+
)
114+
);
115+
}
116+
117+
@Test
118+
void shouldUseGetSubpackagesInTree() {
119+
//language=java
120+
rewriteRun(
121+
java(
122+
"""
123+
import com.tngtech.archunit.core.domain.JavaPackage;
124+
import java.util.Set;
125+
import com.tngtech.archunit.core.domain.JavaClass;
126+
127+
public class ArchUnitTest {
128+
public Set<JavaClass> sample(JavaPackage javaPackage) {
129+
return javaPackage.getAllSubpackages();
130+
}
131+
}
132+
""",
133+
"""
134+
import com.tngtech.archunit.core.domain.JavaPackage;
135+
import java.util.Set;
136+
import com.tngtech.archunit.core.domain.JavaClass;
137+
138+
public class ArchUnitTest {
139+
public Set<JavaClass> sample(JavaPackage javaPackage) {
140+
return javaPackage.getSubpackagesInTree();
141+
}
142+
}
143+
"""
144+
)
145+
);
146+
}
147+
148+
@Test
149+
void shouldUseGetClassDependenciesFromThisPackageTree() {
150+
//language=java
151+
rewriteRun(
152+
java(
153+
"""
154+
import com.tngtech.archunit.core.domain.JavaPackage;
155+
import java.util.Set;
156+
import com.tngtech.archunit.core.domain.Dependency;
157+
158+
public class ArchUnitTest {
159+
public Set<Dependency> sample(JavaPackage javaPackage) {
160+
return javaPackage.getClassDependenciesFromSelf();
161+
}
162+
}
163+
""",
164+
"""
165+
import com.tngtech.archunit.core.domain.JavaPackage;
166+
import java.util.Set;
167+
import com.tngtech.archunit.core.domain.Dependency;
168+
169+
public class ArchUnitTest {
170+
public Set<Dependency> sample(JavaPackage javaPackage) {
171+
return javaPackage.getClassDependenciesFromThisPackageTree();
172+
}
173+
}
174+
"""
175+
)
176+
);
177+
}
178+
179+
@Test
180+
void shouldUseGetClassDependenciesToThisPackageTree() {
181+
//language=java
182+
rewriteRun(
183+
java(
184+
"""
185+
import com.tngtech.archunit.core.domain.JavaPackage;
186+
import java.util.Set;
187+
import com.tngtech.archunit.core.domain.Dependency;
188+
189+
public class ArchUnitTest {
190+
public Set<Dependency> sample(JavaPackage javaPackage) {
191+
return javaPackage.getClassDependenciesToSelf();
192+
}
193+
}
194+
""",
195+
"""
196+
import com.tngtech.archunit.core.domain.JavaPackage;
197+
import java.util.Set;
198+
import com.tngtech.archunit.core.domain.Dependency;
199+
200+
public class ArchUnitTest {
201+
public Set<Dependency> sample(JavaPackage javaPackage) {
202+
return javaPackage.getClassDependenciesToThisPackageTree();
203+
}
204+
}
205+
"""
206+
)
207+
);
208+
}
209+
210+
@Test
211+
void shouldUseGetPackageDependenciesFromThisPackageTree() {
212+
//language=java
213+
rewriteRun(
214+
java(
215+
"""
216+
import com.tngtech.archunit.core.domain.JavaPackage;
217+
import java.util.Set;
218+
import com.tngtech.archunit.core.domain.JavaPackage;
219+
220+
public class ArchUnitTest {
221+
public Set<JavaPackage> sample(JavaPackage javaPackage) {
222+
return javaPackage.getPackageDependenciesFromSelf();
223+
}
224+
}
225+
""",
226+
"""
227+
import com.tngtech.archunit.core.domain.JavaPackage;
228+
import java.util.Set;
229+
import com.tngtech.archunit.core.domain.JavaPackage;
230+
231+
public class ArchUnitTest {
232+
public Set<JavaPackage> sample(JavaPackage javaPackage) {
233+
return javaPackage.getPackageDependenciesFromThisPackageTree();
234+
}
235+
}
236+
"""
237+
)
238+
);
239+
}
240+
241+
@Test
242+
void shouldUseGetPackageDependenciesToThisPackageTree() {
243+
//language=java
244+
rewriteRun(
245+
java(
246+
"""
247+
import com.tngtech.archunit.core.domain.JavaPackage;
248+
import java.util.Set;
249+
import com.tngtech.archunit.core.domain.JavaPackage;
250+
251+
public class ArchUnitTest {
252+
public Set<JavaPackage> sample(JavaPackage javaPackage) {
253+
return javaPackage.getPackageDependenciesToSelf();
254+
}
255+
}
256+
""",
257+
"""
258+
import com.tngtech.archunit.core.domain.JavaPackage;
259+
import java.util.Set;
260+
import com.tngtech.archunit.core.domain.JavaPackage;
261+
262+
public class ArchUnitTest {
263+
public Set<JavaPackage> sample(JavaPackage javaPackage) {
264+
return javaPackage.getPackageDependenciesToThisPackageTree();
265+
}
266+
}
267+
"""
268+
)
269+
);
270+
}
271+
272+
@Test
273+
void shouldUseTraversePackageTree() {
274+
//language=java
275+
rewriteRun(
276+
java(
277+
"""
278+
import com.tngtech.archunit.core.domain.JavaPackage;
279+
import static com.tngtech.archunit.core.domain.JavaPackage.ClassVisitor;
280+
281+
public class ArchUnitTest {
282+
public void sample(JavaPackage javaPackage, ClassVisitor visitor) {
283+
javaPackage.accept(null, visitor);
284+
}
285+
}
286+
""",
287+
"""
288+
import com.tngtech.archunit.core.domain.JavaPackage;
289+
import static com.tngtech.archunit.core.domain.JavaPackage.ClassVisitor;
290+
291+
public class ArchUnitTest {
292+
public void sample(JavaPackage javaPackage, ClassVisitor visitor) {
293+
javaPackage.traversePackageTree(null, visitor);
294+
}
295+
}
296+
"""
297+
)
298+
);
299+
}
300+
301+
@Test
302+
void shouldUsePlantUmlRulesPackage() {
303+
//language=java
304+
rewriteRun(
305+
java(
306+
"""
307+
import com.tngtech.archunit.library.plantuml.PlantUmlArchCondition;
308+
309+
public class ArchUnitTest {
310+
public void sample(PlantUmlArchCondition condition) {
311+
condition.ignoreDependencies("origin", "");
312+
}
313+
}
314+
""",
315+
"""
316+
import com.tngtech.archunit.library.plantuml.rules.PlantUmlArchCondition;
317+
318+
public class ArchUnitTest {
319+
public void sample(PlantUmlArchCondition condition) {
320+
condition.ignoreDependencies("origin", "");
321+
}
322+
}
323+
"""
324+
)
325+
);
326+
}
327+
}

0 commit comments

Comments
 (0)