Skip to content

Commit

Permalink
Fix prerelease version prompt order (#948)
Browse files Browse the repository at this point in the history
* fix prerelease version prompt order

Signed-off-by: tvallin <thibault.vallin@oracle.com>

* review changes

Signed-off-by: tvallin <thibault.vallin@oracle.com>

---------

Signed-off-by: tvallin <thibault.vallin@oracle.com>
  • Loading branch information
tvallin authored Jul 5, 2023
1 parent 68327cb commit f0fedfb
Show file tree
Hide file tree
Showing 10 changed files with 149 additions and 77 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import io.helidon.build.common.maven.MavenVersion;
import io.helidon.build.common.maven.VersionRange;

import static io.helidon.build.cli.common.SemVer.sortVersions;

/**
* Information about archetypes versions.
*/
Expand All @@ -44,8 +46,7 @@ private ArchetypesData(Builder builder) {
* @return list of the latest major versions
*/
public List<String> latestMajorVersions() {
List<String> versionsId = Lists.map(versions, Version::id);
return SemVer.latestMajorVersions(versionsId);
return SemVer.latestMajorVersions(versions);
}

/**
Expand Down Expand Up @@ -144,8 +145,8 @@ Builder version(Version version) {
return this;
}

Builder versions(String... versions) {
this.versions.addAll(Arrays.stream(versions).map(ArchetypesData.Version::new).collect(Collectors.toList()));
Builder versions(Version... versions) {
this.versions.addAll(Arrays.stream(versions).collect(Collectors.toList()));
return this;
}

Expand All @@ -160,6 +161,7 @@ Builder rule(Rule rule) {
* @return version
*/
ArchetypesData build() {
sortVersions(versions);
return new ArchetypesData(this);
}
}
Expand All @@ -170,15 +172,12 @@ ArchetypesData build() {
public static class Version {
private final String id;
private final boolean isDefault;
private final int order;

Version(String id) {
this.id = id;
this.isDefault = false;
}

Version(String id, boolean isDefault) {
this.id = id;
this.isDefault = isDefault;
Version(Builder builder) {
this.id = builder.id;
this.isDefault = builder.isDefault;
this.order = builder.order;
}

MavenVersion toMavenVersion() {
Expand All @@ -202,6 +201,60 @@ public String id() {
public boolean isDefault() {
return isDefault;
}

/**
* Get version order.
*
* @return order
*/
public int order() {
return order;
}

/**
* Create a {@link Version} builder.
*
* @return builder instance
*/
static Builder builder() {
return new Builder();
}

/**
* Version builder.
*/
static class Builder {
private static final int DEFAULT_ORDER = 100;
private String id;
private boolean isDefault;
private int order = DEFAULT_ORDER;

Builder order(String order) {
if (order != null) {
this.order = Integer.parseInt(order);
}
return this;
}

Builder order(int order) {
this.order = order;
return this;
}

Builder id(String id) {
this.id = id;
return this;
}

Builder isDefault(boolean isDefault) {
this.isDefault = isDefault;
return this;
}

Version build() {
return new Version(this);
}
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,11 @@ public void elementText(String data) {
if (name != null) {
if ("version".equals(name)) {
String defaultVersion = versionAttributes.get("default");
builder.version(new ArchetypesData.Version(data, "true".equals(defaultVersion)));
builder.version(ArchetypesData.Version.builder()
.id(data)
.order(versionAttributes.get("order"))
.isDefault("true".equals(defaultVersion))
.build());
}
}
}
Expand Down
18 changes: 15 additions & 3 deletions cli/common/src/main/java/io/helidon/build/cli/common/SemVer.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@
package io.helidon.build.cli.common;

import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

import io.helidon.build.common.Lists;
import io.helidon.build.common.Maps;
Expand All @@ -44,9 +46,10 @@ private SemVer() {
* @param versions versions
* @return latest major versions
*/
static List<String> latestMajorVersions(List<String> versions) {
static List<String> latestMajorVersions(List<ArchetypesData.Version> versions) {
List<String> ids = versions.stream().map(ArchetypesData.Version::id).collect(Collectors.toList());
// versions grouped by major digit
Map<String, List<String>> groups = Lists.mappedBy(versions, SemVer::majorDigit);
Map<String, List<String>> groups = Lists.mappedBy(ids, SemVer::majorDigit);

// Maven versions grouped by version range
Map<VersionRange, List<MavenVersion>> ranges =
Expand All @@ -55,9 +58,18 @@ static List<String> latestMajorVersions(List<String> versions) {
// the latest of each group
Collection<MavenVersion> latest = Maps.mapEntryValue(ranges, entry->entry.getKey().resolveLatest(entry.getValue()))
.values();
List<ArchetypesData.Version> latestVersions = versions.stream()
.filter(version -> latest.contains(version.toMavenVersion()))
.collect(Collectors.toList());

// return String based versions
return Lists.map(latest, MavenVersion::toString);
return Lists.map(sortVersions(latestVersions), ArchetypesData.Version::id);
}

static List<ArchetypesData.Version> sortVersions(List<ArchetypesData.Version> versions) {
versions.sort(Comparator.comparingInt(ArchetypesData.Version::order)
.thenComparing((v1, v2) -> v2.id().compareTo(v1.id())));
return versions;
}

private static String majorDigit(String version) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@

package io.helidon.build.cli.common;

import java.util.Arrays;
import java.util.List;

import org.hamcrest.Matchers;
import org.junit.jupiter.api.Test;

import static io.helidon.build.common.maven.MavenVersion.toMavenVersion;
Expand Down Expand Up @@ -45,9 +49,56 @@ public void testLatestVersion() {
);
}

@Test
public void testLatestMajorVersions() {
ArchetypesData data = data("2.1.3", "2.4.5", "2.0.5", "3.0.0", "3.9.8", "2.9", "4.0.0", "4.0.1-SNAPSHOT");
assertThat(data.latestMajorVersions(), Matchers.contains("4.0.1-SNAPSHOT", "3.9.8", "2.9"));

data = data("2.1.3", "2.4.5", "2.0.5", "4.0.1-SNAPSHOT", "3.0.0", "3.9.8", "2.9");
assertThat(data.latestMajorVersions(), Matchers.contains("4.0.1-SNAPSHOT", "3.9.8", "2.9"));

data = data("2.1.3", "2.4.5", "2.0.5", "3.0.0", "3.9.8", "2.9");
assertThat(data.latestMajorVersions(), Matchers.contains("3.9.8", "2.9"));

data = ArchetypesData.builder().build();
assertThat(data.latestMajorVersions().size(), Matchers.is(0));
}

@Test
public void testLatestMajorVersionsOrdering() {
ArchetypesData data = data(version("2.0.0", 100),
version("3.0.0", 100),
version("4.0.1-SNAPSHOT", 200));
assertThat(data.latestMajorVersions(), Matchers.contains("3.0.0", "2.0.0", "4.0.1-SNAPSHOT"));

data = data(version("3.0.0", 100),
version("3.0.1", 100),
version("2.0.0", 100),
version("4.0.0", 200),
version("4.0.1", 200));
assertThat(data.latestMajorVersions(), Matchers.contains("3.0.1", "2.0.0", "4.0.1"));
}

@Test
public void testVersionOrdering() {
assertThat(data(version("1.0.0", 100),
version("1.0.1", 100),
version("2.0.0", 100),
version("4.0.0", 200)).latestMajorVersions(),
Matchers.is(List.of("2.0.0", "1.0.1", "4.0.0")));
}

private static ArchetypesData data(ArchetypesData.Version... versions) {
return ArchetypesData.builder().versions(versions).build();
}

private static ArchetypesData data(String... versions) {
return ArchetypesData.builder()
.versions(versions)
.build();
return data(Arrays.stream(versions)
.map(version -> ArchetypesData.Version.builder().id(version).build())
.toArray(ArchetypesData.Version[]::new));
}

private static ArchetypesData.Version version(String id, int order) {
return ArchetypesData.Version.builder().id(id).order(order).build();
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;

import io.helidon.build.archetype.engine.v1.Prompter;
Expand Down Expand Up @@ -133,7 +132,6 @@ private String promptHelidonVersion(ArchetypesData archetypesData, boolean showL
if (showLatest) {
versions = archetypesData.latestMajorVersions();
}
versions.sort(Collections.reverseOrder());
int defaultOption = archetypesData.defaultVersionIndex(versions);
if (showLatest) {
versions.add(SHOW_ALL_VERSIONS_MESSAGE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,9 +166,9 @@ public void testInteractiveAllHelidonVersions() throws Exception {
projectDir);

assertThat(output, containsString("Helidon versions"));
assertThat(output, containsString("(29) 2.0.0"));
assertThat(output, containsString("(1) 4.0.0-SNAPSHOT"));
assertThat(output, containsString("Enter selection (default: 1):"));
assertThat(output, containsString("(28) 2.0.0"));
assertThat(output, containsString("(29) 4.0.0-SNAPSHOT"));
assertThat(output, containsString("Enter selection (default: 29):"));

if ( helidonProperty != null) {
System.setProperty(HELIDON_VERSION_PROPERTY, helidonProperty);
Expand All @@ -193,11 +193,11 @@ public void testInteractiveLatestHelidonVersions() throws Exception {
projectDir);

assertThat(output, containsString("Helidon versions"));
assertThat(output, containsString("(3) 2.6.0"));
assertThat(output, containsString("(2) 3.1.2"));
assertThat(output, containsString("(1) 4.0.0-SNAPSHOT"));
assertThat(output, containsString("(1) 3.1.2"));
assertThat(output, containsString("(2) 2.6.0"));
assertThat(output, containsString("(3) 4.0.0-SNAPSHOT"));
assertThat(output, containsString("(4) Show all versions"));
assertThat(output, containsString("Enter selection (default: 1):"));
assertThat(output, containsString("Enter selection (default: 3):"));

if ( helidonVersionProperty != null) {
System.setProperty(HELIDON_VERSION_PROPERTY, helidonVersionProperty);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
4
1
29



Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
1
3



Expand Down
2 changes: 1 addition & 1 deletion cli/impl/src/test/resources/versions/cli-data/versions.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
<version>3.1.0</version>
<version>3.1.1</version>
<version>3.1.2</version>
<version default="true">4.0.0-SNAPSHOT</version>
<version default="true" order="200">4.0.0-SNAPSHOT</version>
</archetypes>
<rules>
<!-- Helidon version 2.x archetypes are supported by CLI 2.x, 3.x, 4.x -->
Expand Down

0 comments on commit f0fedfb

Please sign in to comment.