From 2e8f568728a04e770db0461b63b969f6332560df Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Thu, 9 Nov 2023 09:43:18 +0100 Subject: [PATCH] Fix consistent-separator rule when unreleased keyword is present --- CHANGELOG.md | 4 ++++ .../java/internal/heylogs/ExtendedRules.java | 10 +++------- .../src/main/java/nbbrd/heylogs/Util.java | 5 +++++ .../src/main/java/nbbrd/heylogs/Version.java | 18 ++++++++++++++---- .../internal/heylogs/ExtendedRulesTest.java | 3 +++ .../test/java/nbbrd/heylogs/VersionTest.java | 9 +++++++++ .../src/test/resources/NonDefaultSeparator.md | 17 +++++++++++++++++ 7 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 heylogs-api/src/test/resources/NonDefaultSeparator.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 09b7bd0..8a75646 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,10 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Output all separators in error message by [@koppor](https://github.com/koppor) [#164](https://github.com/nbbrd/heylogs/pull/164) +### Fixed + +- Fix consistent-separator rule when unreleased keyword is present [#163](https://github.com/nbbrd/heylogs/issues/163) + ## [0.7.1] - 2023-10-19 ### Fixed diff --git a/heylogs-api/src/main/java/internal/heylogs/ExtendedRules.java b/heylogs-api/src/main/java/internal/heylogs/ExtendedRules.java index 3e34b64..96cd4ec 100644 --- a/heylogs-api/src/main/java/internal/heylogs/ExtendedRules.java +++ b/heylogs-api/src/main/java/internal/heylogs/ExtendedRules.java @@ -10,6 +10,7 @@ import nbbrd.design.VisibleForTesting; import nbbrd.heylogs.Failure; import nbbrd.heylogs.Nodes; +import nbbrd.heylogs.Util; import nbbrd.heylogs.Version; import nbbrd.heylogs.spi.Rule; import nbbrd.heylogs.spi.RuleBatch; @@ -20,7 +21,6 @@ import java.net.URL; import java.util.List; import java.util.Locale; -import java.util.Objects; import java.util.stream.Stream; import static java.util.stream.Collectors.joining; @@ -120,7 +120,7 @@ static Failure validateConsistentSeparator(Document doc) { .descendants(doc) .filter(Version::isVersionLevel) .map(illegalArgumentToNull(Version::parse)) - .filter(Objects::nonNull) + .filter(version -> version != null && !version.isUnreleased()) .map(Version::getSeparator) .distinct() .collect(toList()); @@ -129,16 +129,12 @@ static Failure validateConsistentSeparator(Document doc) { ? Failure .builder() .rule(CONSISTENT_SEPARATOR) - .message("Expecting consistent version-date separator " + toUnicode(separators.get(0)) + ", found " + separators.stream().map(ExtendedRules::toUnicode).collect(joining(", ", "[", "]"))) + .message("Expecting consistent version-date separator " + Util.toUnicode(separators.get(0)) + ", found " + separators.stream().map(Util::toUnicode).collect(joining(", ", "[", "]"))) .location(doc) .build() : NO_PROBLEM; } - private static String toUnicode(Character c) { - return String.format(Locale.ROOT, "\\u%04x", (int) c); - } - @MightBeGenerated @ServiceProvider public static final class Batch implements RuleBatch { diff --git a/heylogs-api/src/main/java/nbbrd/heylogs/Util.java b/heylogs-api/src/main/java/nbbrd/heylogs/Util.java index 83eeb7e..dbcd5c1 100644 --- a/heylogs-api/src/main/java/nbbrd/heylogs/Util.java +++ b/heylogs-api/src/main/java/nbbrd/heylogs/Util.java @@ -2,6 +2,7 @@ import lombok.NonNull; +import java.util.Locale; import java.util.function.Function; public final class Util { @@ -19,4 +20,8 @@ private Util() { } }; } + + public static @NonNull String toUnicode(@NonNull Character c) { + return String.format(Locale.ROOT, "\\u%04x", (int) c); + } } diff --git a/heylogs-api/src/main/java/nbbrd/heylogs/Version.java b/heylogs-api/src/main/java/nbbrd/heylogs/Version.java index 5392080..e92bfe5 100644 --- a/heylogs-api/src/main/java/nbbrd/heylogs/Version.java +++ b/heylogs-api/src/main/java/nbbrd/heylogs/Version.java @@ -19,9 +19,6 @@ @RepresentableAs(Heading.class) public class Version implements BaseSection { - private static final String UNRELEASED_KEYWORD = "unreleased"; - private static final int HEADING_LEVEL = 2; - @VisibleForTesting static final char HYPHEN = '-'; @@ -31,6 +28,14 @@ public class Version implements BaseSection { @VisibleForTesting static final char EM_DASH = '—'; + private static final int HEADING_LEVEL = 2; + + private static final String UNRELEASED_KEYWORD = "unreleased"; + + private static final char UNRELEASED_SEPARATOR = HYPHEN; + + private static final LocalDate UNRELEASED_DATE = LocalDate.MAX; + // The unicode en dash ("–") and em dash ("—") are also accepted as separators private static final CharPredicate VALID_SEPARATOR = CharPredicate.anyOf(HYPHEN, EN_DASH, EM_DASH); @@ -46,6 +51,11 @@ public boolean isUnreleased() { return UNRELEASED_KEYWORD.equalsIgnoreCase(ref); } + @Override + public String toString() { + return "Version(ref=" + ref + ", separator=" + Util.toUnicode(separator) + ", date=" + date + ")"; + } + @Override public @NonNull Heading toHeading() { Heading result = new Heading(); @@ -87,7 +97,7 @@ public boolean isUnreleased() { throw new IllegalArgumentException("Unexpected additional part: '" + parts.next().getChars() + "'"); } - return new Version(ref, HYPHEN, LocalDate.MAX); + return new Version(ref, UNRELEASED_SEPARATOR, UNRELEASED_DATE); } if (!parts.hasNext()) { diff --git a/heylogs-api/src/test/java/internal/heylogs/ExtendedRulesTest.java b/heylogs-api/src/test/java/internal/heylogs/ExtendedRulesTest.java index 9308f14..d654321 100644 --- a/heylogs-api/src/test/java/internal/heylogs/ExtendedRulesTest.java +++ b/heylogs-api/src/test/java/internal/heylogs/ExtendedRulesTest.java @@ -65,5 +65,8 @@ public void testValidateGitHubIssueRef() { public void testValidateConsistentSeparator() { assertThat(validateConsistentSeparator(using("/ErraticSeparator.md"))) .isEqualTo(Failure.builder().rule(CONSISTENT_SEPARATOR).message("Expecting consistent version-date separator \\u002d, found [\\u002d, \\u2013, \\u2014]").line(1).column(1).build()); + + assertThat(validateConsistentSeparator(using("/NonDefaultSeparator.md"))) + .isEqualTo(NO_PROBLEM); } } diff --git a/heylogs-api/src/test/java/nbbrd/heylogs/VersionTest.java b/heylogs-api/src/test/java/nbbrd/heylogs/VersionTest.java index 780c179..8a4282e 100644 --- a/heylogs-api/src/test/java/nbbrd/heylogs/VersionTest.java +++ b/heylogs-api/src/test/java/nbbrd/heylogs/VersionTest.java @@ -102,5 +102,14 @@ public void testToHeading() { .isEqualTo("## [1.1.0] - 2019-02-15"); } + @Test + public void testToString() { + assertThat(Version.of("Unreleased", HYPHEN, LocalDate.MAX)) + .hasToString("Version(ref=Unreleased, separator=\\u002d, date=+999999999-12-31)"); + + assertThat(Version.of("1.1.0", HYPHEN, d20190215)) + .hasToString("Version(ref=1.1.0, separator=\\u002d, date=2019-02-15)"); + } + private final LocalDate d20190215 = LocalDate.parse("2019-02-15"); } diff --git a/heylogs-api/src/test/resources/NonDefaultSeparator.md b/heylogs-api/src/test/resources/NonDefaultSeparator.md new file mode 100644 index 0000000..9f7d448 --- /dev/null +++ b/heylogs-api/src/test/resources/NonDefaultSeparator.md @@ -0,0 +1,17 @@ +# Changelog + +## [Unreleased] + +## [1.1.0] — 2019-02-15 + +## [1.0.0] — 2017-06-20 + +## [0.3.0] — 2015-12-03 + +## [0.2.0] — 2015-10-06 + +[unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v1.1.0...HEAD +[1.1.0]: https://github.com/olivierlacan/keep-a-changelog/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.3.0...v1.0.0 +[0.3.0]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.2.0...v0.3.0 +[0.2.0]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.1.0...v0.2.0