diff --git a/kork-expressions/kork-expressions.gradle b/kork-expressions/kork-expressions.gradle index f1bf50d00..2c5badacc 100644 --- a/kork-expressions/kork-expressions.gradle +++ b/kork-expressions/kork-expressions.gradle @@ -14,6 +14,7 @@ dependencies { api "org.slf4j:slf4j-api" implementation "org.springframework.boot:spring-boot" + implementation "org.apache.maven:maven-artifact:3.9.6" testImplementation project(":kork-artifacts") testImplementation "org.assertj:assertj-core" diff --git a/kork-expressions/src/main/java/com/netflix/spinnaker/kork/expressions/ExpressionsSupport.java b/kork-expressions/src/main/java/com/netflix/spinnaker/kork/expressions/ExpressionsSupport.java index 3392ec73a..08c1db022 100644 --- a/kork-expressions/src/main/java/com/netflix/spinnaker/kork/expressions/ExpressionsSupport.java +++ b/kork-expressions/src/main/java/com/netflix/spinnaker/kork/expressions/ExpressionsSupport.java @@ -46,6 +46,7 @@ import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; +import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.pf4j.PluginManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -90,6 +91,7 @@ public ExpressionsSupport( LinkedHashSet.class, HashMap.class, LinkedHashMap.class, + DefaultArtifactVersion.class, TreeMap.class, TreeSet.class)); Collections.addAll(allowedReturnTypes, extraAllowedReturnTypes); @@ -281,6 +283,16 @@ public static Integer toInt(String str) { return Integer.valueOf(str); } + /** + * Parses a string to an integer + * + * @param str represents an int + * @return an integer + */ + public static DefaultArtifactVersion toArtifactVersion(String str) { + return new DefaultArtifactVersion(str); + } + /** * Parses a string to a float * @@ -343,6 +355,13 @@ public Functions getFunctions() { "toInt", "Converts a string to integer", new FunctionParameter(String.class, "value", "A String value to convert to an int")), + new FunctionDefinition( + "toArtifactVersion", + "Converts a string to a Maven Default Artifact Version", + new FunctionParameter( + String.class, + "value", + "A String value to convert to a Maven Default Artifact Version")), new FunctionDefinition( "toFloat", "Converts a string to float", diff --git a/kork-expressions/src/test/java/com/netflix/spinnaker/kork/expressions/ExpressionsSupportTest.java b/kork-expressions/src/test/java/com/netflix/spinnaker/kork/expressions/ExpressionsSupportTest.java index 1ae7dcd22..7ffe89128 100644 --- a/kork-expressions/src/test/java/com/netflix/spinnaker/kork/expressions/ExpressionsSupportTest.java +++ b/kork-expressions/src/test/java/com/netflix/spinnaker/kork/expressions/ExpressionsSupportTest.java @@ -163,6 +163,26 @@ public void delegatesTypeConversion() { assertThat(evaluated).isEqualTo("00000000-0000-0000-0000-000000000000"); } + @Test + public void compareArtifactVersion() { + // If a thing is not an artifact URI, it should delegate to StandardTypeConverter + ExpressionProperties expressionProperties = new ExpressionProperties(); + + // StandardTypeConverter does things like convert ints to longs + String testInput = ("${#toArtifactVersion('2.0.0') > #toArtifactVersion('1.0.0')}"); + Map testContext = Map.of(); + + String evaluated = + new ExpressionTransform(parserContext, parser, Function.identity()) + .transformString( + testInput, + new ExpressionsSupport(null, expressionProperties) + .buildEvaluationContext(testContext, true), + new ExpressionEvaluationSummary()); + + assertThat(evaluated).isEqualTo(true); + } + public class MockArtifactStore extends ArtifactStore { public Map cache = new HashMap<>();