Skip to content

Commit f3f107e

Browse files
BoykoAlextimtebeek
andauthored
Gradle ChangeDependencyClassifier supports add and remove classifier (#4268)
* Gradle `ChangeDependencyClassifier` supports add and remove classifier * Correction * Minor polish --------- Co-authored-by: Tim te Beek <[email protected]>
1 parent 9ae8b92 commit f3f107e

File tree

2 files changed

+201
-26
lines changed

2 files changed

+201
-26
lines changed

rewrite-gradle/src/main/java/org/openrewrite/gradle/ChangeDependencyClassifier.java

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,12 @@
2727
import org.openrewrite.internal.StringUtils;
2828
import org.openrewrite.internal.lang.Nullable;
2929
import org.openrewrite.java.MethodMatcher;
30-
import org.openrewrite.java.tree.Expression;
31-
import org.openrewrite.java.tree.J;
30+
import org.openrewrite.java.tree.*;
31+
import org.openrewrite.marker.Markers;
3232
import org.openrewrite.semver.DependencyMatcher;
3333

3434
import java.util.List;
35+
import java.util.Objects;
3536

3637
import static java.util.Objects.requireNonNull;
3738

@@ -50,7 +51,9 @@ public class ChangeDependencyClassifier extends Recipe {
5051

5152
@Option(displayName = "New classifier",
5253
description = "A qualification classifier for the dependency.",
53-
example = "sources")
54+
example = "sources",
55+
required = false)
56+
@Nullable
5457
String newClassifier;
5558

5659
@Option(displayName = "Dependency configuration",
@@ -98,7 +101,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx)
98101
String gav = (String) ((J.Literal) depArgs.get(0)).getValue();
99102
if (gav != null) {
100103
Dependency dependency = DependencyStringNotationConverter.parse(gav);
101-
if (dependency != null && dependency.getVersion() != null && dependency.getClassifier() != null && !newClassifier.equals(dependency.getClassifier()) &&
104+
if (dependency != null && dependency.getVersion() != null && !Objects.equals(newClassifier, dependency.getClassifier()) &&
102105
depMatcher.matches(dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion())) {
103106
Dependency newDependency = dependency.withClassifier(newClassifier);
104107
m = m.withArguments(ListUtils.mapFirst(m.getArguments(), arg -> ChangeStringLiteral.withStringValue((J.Literal) arg, newDependency.toStringNotation())));
@@ -111,7 +114,10 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx)
111114
String version = null;
112115
String classifier = null;
113116

114-
String classifierStringDelimiter = "'";
117+
String groupDelimiter = "'";
118+
G.MapEntry mapEntry = null;
119+
String classifierStringDelimiter = null;
120+
int index = 0;
115121
for (Expression e : depArgs) {
116122
if (!(e instanceof G.MapEntry)) {
117123
continue;
@@ -129,38 +135,61 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx)
129135
String valueValue = (String) value.getValue();
130136
if ("group".equals(keyValue)) {
131137
groupId = valueValue;
138+
if (value.getValueSource() != null) {
139+
groupDelimiter = value.getValueSource().substring(0, value.getValueSource().indexOf(valueValue));
140+
}
132141
} else if ("name".equals(keyValue)) {
142+
if (index > 0 && mapEntry == null) {
143+
mapEntry = arg;
144+
}
133145
artifactId = valueValue;
134146
} else if ("version".equals(keyValue)) {
135147
version = valueValue;
136-
} else if ("classifier".equals(keyValue) && !newClassifier.equals(valueValue)) {
148+
} else if ("classifier".equals(keyValue)) {
137149
if (value.getValueSource() != null) {
138150
classifierStringDelimiter = value.getValueSource().substring(0, value.getValueSource().indexOf(valueValue));
139151
}
140152
classifierEntry = arg;
141153
classifier = valueValue;
142154
}
155+
index++;
143156
}
144157
if (groupId == null || artifactId == null
145158
|| (version == null && !depMatcher.matches(groupId, artifactId))
146159
|| (version != null && !depMatcher.matches(groupId, artifactId, version))
147-
|| classifier == null) {
160+
|| Objects.equals(newClassifier, classifier)) {
148161
return m;
149162
}
150-
String delimiter = classifierStringDelimiter;
151-
G.MapEntry finalClassifier = classifierEntry;
152-
m = m.withArguments(ListUtils.map(m.getArguments(), arg -> {
153-
if (arg == finalClassifier) {
154-
return finalClassifier.withValue(((J.Literal) finalClassifier.getValue())
155-
.withValue(newClassifier)
156-
.withValueSource(delimiter + newClassifier + delimiter));
163+
164+
if (classifier == null) {
165+
String delimiter = groupDelimiter;
166+
List<Expression> args = m.getArguments();
167+
J.Literal keyLiteral = new J.Literal(Tree.randomId(), mapEntry == null ? Space.EMPTY : mapEntry.getKey().getPrefix(), Markers.EMPTY, "classifier", "classifier", null, JavaType.Primitive.String);
168+
J.Literal valueLiteral = new J.Literal(Tree.randomId(), mapEntry == null ? Space.EMPTY : mapEntry.getValue().getPrefix(), Markers.EMPTY, newClassifier, delimiter + newClassifier + delimiter, null, JavaType.Primitive.String);
169+
args.add(new G.MapEntry(Tree.randomId(), mapEntry == null ? Space.EMPTY : mapEntry.getPrefix(), Markers.EMPTY, JRightPadded.build(keyLiteral), valueLiteral, null));
170+
m = m.withArguments(args);
171+
} else {
172+
G.MapEntry finalClassifier = classifierEntry;
173+
if (newClassifier == null) {
174+
m = m.withArguments(ListUtils.map(m.getArguments(), arg -> arg == finalClassifier ? null : arg));
175+
} else {
176+
String delimiter = classifierStringDelimiter; // `classifierStringDelimiter` cannot be null
177+
m = m.withArguments(ListUtils.map(m.getArguments(), arg -> {
178+
if (arg == finalClassifier) {
179+
return finalClassifier.withValue(((J.Literal) finalClassifier.getValue())
180+
.withValue(newClassifier)
181+
.withValueSource(delimiter + newClassifier + delimiter));
182+
}
183+
return arg;
184+
}));
157185
}
158-
return arg;
159-
}));
186+
}
187+
160188
}
161189

162190
return m;
163191
}
164192
});
165193
}
194+
166195
}

rewrite-gradle/src/test/java/org/openrewrite/gradle/ChangeDependencyClassifierTest.java

Lines changed: 156 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ void worksWithEmptyStringConfig() {
3434
plugins {
3535
id 'java-library'
3636
}
37-
37+
3838
repositories {
3939
mavenCentral()
4040
}
@@ -47,7 +47,7 @@ void worksWithEmptyStringConfig() {
4747
plugins {
4848
id 'java-library'
4949
}
50-
50+
5151
repositories {
5252
mavenCentral()
5353
}
@@ -108,7 +108,7 @@ void findMapStyleDependency(String group, String artifact) {
108108
plugins {
109109
id 'java-library'
110110
}
111-
111+
112112
repositories {
113113
mavenCentral()
114114
}
@@ -122,7 +122,7 @@ void findMapStyleDependency(String group, String artifact) {
122122
plugins {
123123
id 'java-library'
124124
}
125-
125+
126126
repositories {
127127
mavenCentral()
128128
}
@@ -146,7 +146,7 @@ void worksWithoutVersion(String group, String artifact) {
146146
plugins {
147147
id 'java-library'
148148
}
149-
149+
150150
repositories {
151151
mavenCentral()
152152
}
@@ -160,7 +160,7 @@ void worksWithoutVersion(String group, String artifact) {
160160
plugins {
161161
id 'java-library'
162162
}
163-
163+
164164
repositories {
165165
mavenCentral()
166166
}
@@ -184,7 +184,7 @@ void worksWithClassifier(String group, String artifact) {
184184
plugins {
185185
id 'java-library'
186186
}
187-
187+
188188
repositories {
189189
mavenCentral()
190190
}
@@ -200,7 +200,7 @@ void worksWithClassifier(String group, String artifact) {
200200
plugins {
201201
id 'java-library'
202202
}
203-
203+
204204
repositories {
205205
mavenCentral()
206206
}
@@ -226,7 +226,7 @@ void worksWithExt(String group, String artifact) {
226226
plugins {
227227
id 'java-library'
228228
}
229-
229+
230230
repositories {
231231
mavenCentral()
232232
}
@@ -246,7 +246,7 @@ void worksWithExt(String group, String artifact) {
246246
plugins {
247247
id 'java-library'
248248
}
249-
249+
250250
repositories {
251251
mavenCentral()
252252
}
@@ -265,4 +265,150 @@ void worksWithExt(String group, String artifact) {
265265
)
266266
);
267267
}
268+
269+
@Test
270+
void noPreviousClassifier_1() {
271+
rewriteRun(
272+
spec -> spec.recipe(new ChangeDependencyClassifier("org.openrewrite", "*", "classified", "")),
273+
buildGradle(
274+
"""
275+
plugins {
276+
id 'java-library'
277+
}
278+
279+
repositories {
280+
mavenCentral()
281+
}
282+
283+
dependencies {
284+
api 'org.openrewrite:rewrite-gradle:latest.release'
285+
}
286+
""",
287+
"""
288+
plugins {
289+
id 'java-library'
290+
}
291+
292+
repositories {
293+
mavenCentral()
294+
}
295+
296+
dependencies {
297+
api 'org.openrewrite:rewrite-gradle:latest.release:classified'
298+
}
299+
"""
300+
)
301+
);
302+
}
303+
304+
@ParameterizedTest
305+
@CsvSource(value = {"org.openrewrite:rewrite-core", "*:*"}, delimiterString = ":")
306+
void noPreviousClassifier_2(String group, String artifact) {
307+
rewriteRun(
308+
spec -> spec.recipe(new ChangeDependencyClassifier(group, artifact, "classified", null)),
309+
buildGradle(
310+
"""
311+
plugins {
312+
id 'java-library'
313+
}
314+
315+
repositories {
316+
mavenCentral()
317+
}
318+
319+
dependencies {
320+
api(group: 'org.openrewrite', name: 'rewrite-core', version: 'latest.release')
321+
api(group: "org.openrewrite", name: "rewrite-core", version: "latest.release")
322+
}
323+
""",
324+
"""
325+
plugins {
326+
id 'java-library'
327+
}
328+
329+
repositories {
330+
mavenCentral()
331+
}
332+
333+
dependencies {
334+
api(group: 'org.openrewrite', name: 'rewrite-core', version: 'latest.release', classifier: 'classified')
335+
api(group: "org.openrewrite", name: "rewrite-core", version: "latest.release", classifier: "classified")
336+
}
337+
"""
338+
)
339+
);
340+
}
341+
342+
@Test
343+
void noNewClassifier_1() {
344+
rewriteRun(
345+
spec -> spec.recipe(new ChangeDependencyClassifier("org.openrewrite", "*", null, "")),
346+
buildGradle(
347+
"""
348+
plugins {
349+
id 'java-library'
350+
}
351+
352+
repositories {
353+
mavenCentral()
354+
}
355+
356+
dependencies {
357+
api 'org.openrewrite:rewrite-gradle:latest.release:classified'
358+
}
359+
""",
360+
"""
361+
plugins {
362+
id 'java-library'
363+
}
364+
365+
repositories {
366+
mavenCentral()
367+
}
368+
369+
dependencies {
370+
api 'org.openrewrite:rewrite-gradle:latest.release'
371+
}
372+
"""
373+
)
374+
);
375+
}
376+
377+
@ParameterizedTest
378+
@CsvSource(value = {"org.openrewrite:rewrite-core", "*:*"}, delimiterString = ":")
379+
void noNewClassifier_2(String group, String artifact) {
380+
rewriteRun(
381+
spec -> spec.recipe(new ChangeDependencyClassifier(group, artifact, null, null)),
382+
buildGradle(
383+
"""
384+
plugins {
385+
id 'java-library'
386+
}
387+
388+
repositories {
389+
mavenCentral()
390+
}
391+
392+
dependencies {
393+
api(group: 'org.openrewrite', name: 'rewrite-core', version: 'latest.release', classifier: 'classified')
394+
api(group: "org.openrewrite", name: "rewrite-core", version: "latest.release", classifier: "classified")
395+
}
396+
""",
397+
"""
398+
plugins {
399+
id 'java-library'
400+
}
401+
402+
repositories {
403+
mavenCentral()
404+
}
405+
406+
dependencies {
407+
api(group: 'org.openrewrite', name: 'rewrite-core', version: 'latest.release')
408+
api(group: "org.openrewrite", name: "rewrite-core", version: "latest.release")
409+
}
410+
"""
411+
)
412+
);
413+
}
268414
}

0 commit comments

Comments
 (0)