From 0ec2b646e070ec35e87c24b6a793b361e4c64eea Mon Sep 17 00:00:00 2001 From: Maxime Mangel Date: Sat, 16 Dec 2023 17:39:27 +0100 Subject: [PATCH 1/3] Disable auto-formatting on save --- .vscode/settings.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 953f548..8b1e7c6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,4 @@ { - "[fsharp]": { - "editor.formatOnSave": true - }, "files.associations": { "**/build*/*[props|targets]": "msbuild" } From e2b79338e91ebf9d3b9a07b48401fb39838e1679 Mon Sep 17 00:00:00 2001 From: Maxime Mangel Date: Sat, 16 Dec 2023 17:39:48 +0100 Subject: [PATCH 2/3] Move from a tuple to a record representation for the release --- src/Ionide.KeepAChangelog.Tasks/Library.fs | 12 +-- src/Ionide.KeepAChangelog/Library.fs | 18 ++++- test/Ionide.KeepAChangelog.Test/Program.fs | 86 ++++++++++++++-------- 3 files changed, 75 insertions(+), 41 deletions(-) diff --git a/src/Ionide.KeepAChangelog.Tasks/Library.fs b/src/Ionide.KeepAChangelog.Tasks/Library.fs index 63f9382..0619d71 100644 --- a/src/Ionide.KeepAChangelog.Tasks/Library.fs +++ b/src/Ionide.KeepAChangelog.Tasks/Library.fs @@ -65,14 +65,14 @@ type ParseChangelogs() = let sortedReleases = // have to use LINQ here because List.sortBy* require IComparable, which // semver doesn't implement - changelogs.Releases.OrderByDescending(fun (v, _, _) -> v) + changelogs.Releases.OrderByDescending(fun release -> release.Version) let items = sortedReleases - |> Seq.map (fun (version, date, data) -> + |> Seq.map (fun release -> TaskItem() - |> Util.mapReleaseInfo version date - |> fun d -> match data with Some data -> Util.mapChangelogData data d | None -> d + |> Util.mapReleaseInfo release.Version release.Date + |> fun d -> match release.Data with Some data -> Util.mapChangelogData data d | None -> d ) |> Seq.toArray @@ -81,8 +81,8 @@ type ParseChangelogs() = sortedReleases |> Seq.tryHead - |> Option.iter (fun (version, date, data) -> - data + |> Option.iter (fun release -> + release.Data |> Option.iter (fun data -> this.LatestReleaseNotes <- data.ToMarkdown()) ) diff --git a/src/Ionide.KeepAChangelog/Library.fs b/src/Ionide.KeepAChangelog/Library.fs index 420ae9c..d1e1fbd 100644 --- a/src/Ionide.KeepAChangelog/Library.fs +++ b/src/Ionide.KeepAChangelog/Library.fs @@ -40,9 +40,16 @@ module Domain = section heading lines ] + type Release = + { + Version : SemanticVersion + Date : DateTime + Data : ChangelogData option + } + type Changelogs = { Unreleased: ChangelogData option - Releases: (SemanticVersion * DateTime * ChangelogData option) list } + Releases: Release list } module Parser = @@ -241,13 +248,17 @@ module Parser = let pVersion = mdUrl pSemver <|> pSemver - let pRelease: Parser = + let pRelease: Parser = let vPart = skipString "##" >>. spaces1 >>. pVersion let middle = spaces1 .>> pchar '-' .>> spaces1 let date = pDate .>> skipRestOfLine true let content = choice [ pData; pNonStructuredData ] - pipe5 vPart middle date (opt (many newline)) (opt content) (fun v _ date _ data -> v, date, data) + pipe5 vPart middle date (opt (many newline)) (opt content) (fun v _ date _ data -> + { Version = v + Date = date + Data = data } + ) let pChangeLogs: Parser = let unreleased = @@ -275,3 +286,4 @@ module Parser = with | ParserResult.Success (result, _, pos) -> Result.Ok result | ParserResult.Failure (msg, structuredError, pos) -> Result.Error(msg, structuredError) + \ No newline at end of file diff --git a/test/Ionide.KeepAChangelog.Test/Program.fs b/test/Ionide.KeepAChangelog.Test/Program.fs index 01b4e45..7086f84 100644 --- a/test/Ionide.KeepAChangelog.Test/Program.fs +++ b/test/Ionide.KeepAChangelog.Test/Program.fs @@ -20,12 +20,16 @@ let singleRelease = """ let singleReleaseExpected = - (SemanticVersion.Parse "1.0.0", DateTime(2017, 06, 20), Some { + { + Version = SemanticVersion.Parse "1.0.0" + Date = DateTime(2017, 06, 20) + Data = Some { ChangelogData.Default with Added = "- A\n" Changed = "- B\n" Removed = "- C\n" - }) + } + } let keepAChangelog = normalizeNewline """# Changelog @@ -59,11 +63,13 @@ let keepAChangelogExpected: Changelogs = Unreleased = None Releases = [ singleReleaseExpected - SemanticVersion.Parse("0.3.0"), - DateTime(2015, 12, 03), - Some { - ChangelogData.Default with - Added = "- A\n- B\n- C\n\n" + { + Version = SemanticVersion.Parse "0.3.0" + Date = DateTime(2015, 12, 03) + Data = Some { + ChangelogData.Default with + Added = "- A\n- B\n- C\n\n" + } } ] } @@ -96,8 +102,12 @@ let sample1Release = normalizeNewline """## [0.3.1] - 8.1.2022 """ let sample1ReleaseExpected = - SemanticVersion.Parse "0.3.1", DateTime(2022, 1, 8), Some { ChangelogData.Default with Added = "- Add XmlDocs to the generated package\n\n" } - + { + Version = SemanticVersion.Parse "0.3.1" + Date = DateTime(2022, 1, 8) + Data = Some { ChangelogData.Default with Added = "- Add XmlDocs to the generated package\n\n" } + } + let sample = normalizeNewline """# Changelog All notable changes to this project will be documented in this file. @@ -133,26 +143,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 let sampleExpected: Changelogs = { Unreleased = None Releases = [ - SemanticVersion.Parse "0.3.1", - DateTime(2022, 1, 8), - Some { ChangelogData.Default with Added = "* Add XmlDocs to the generated package\n" } - - SemanticVersion.Parse "0.3.0", - DateTime(2021, 11, 23), - Some { + { + Version = SemanticVersion.Parse "0.3.1" + Date = DateTime(2022, 1, 8) + Data = Some { ChangelogData.Default with Added = "* Add XmlDocs to the generated package\n" } + } + { + Version = SemanticVersion.Parse "0.3.0" + Date = DateTime(2021, 11, 23) + Data = Some { ChangelogData.Default with Added = normalizeNewline """* Expose client `CodeAction` caps as CodeActionClientCapabilities. (by @razzmatazz) * Map CodeAction.IsPreferred & CodeAction.Disabled props. (by @razzmatazz) """ } - SemanticVersion.Parse "0.2.0", - DateTime(2021, 11, 17), - Some { ChangelogData.Default with Added = "* Add support for `codeAction/resolve` (by @razzmatazz)\n" } - - SemanticVersion.Parse "0.1.1", - DateTime(2021, 11, 15), - Some { ChangelogData.Default with Added = "* Initial implementation\n" } + } + { + Version = SemanticVersion.Parse "0.2.0" + Date = DateTime(2021, 11, 17) + Data = Some { ChangelogData.Default with Added = "* Add support for `codeAction/resolve` (by @razzmatazz)\n" } + } + { + Version = SemanticVersion.Parse "0.1.1" + Date = DateTime(2021, 11, 15) + Data = Some { ChangelogData.Default with Added = "* Initial implementation\n" } + } ] } @@ -328,9 +344,10 @@ let FableSampleExpected :Changelogs = { """ } Releases = [ - SemanticVersion.Parse "4.6.0", - DateTime(2023, 11, 27), - Some { + { + Version = SemanticVersion.Parse "4.6.0" + Date = DateTime(2023, 11, 27) + Data = Some { ChangelogData.Default with Changed = normalizeNewline """#### All @@ -360,6 +377,7 @@ let FableSampleExpected :Changelogs = { * PR #3608: Rewrite `time_span.py` allowing for better precision by using a number representation intead of native `timedelta`. (by @MangelMaxime) """ } + } ] } @@ -382,12 +400,16 @@ let SectionLessSample = normalizeNewlines """# Changelog let SectionLessSampleExpected: Changelogs = { Unreleased = None Releases = [ - SemanticVersion.Parse "4.2.1", - DateTime(2023, 9, 29), - Some ChangelogData.Default - SemanticVersion.Parse "4.2.0", - DateTime(2023, 9, 29), - Some ChangelogData.Default + { + Version = SemanticVersion.Parse "4.2.1" + Date = DateTime(2023, 9, 29) + Data = Some ChangelogData.Default + } + { + Version = SemanticVersion.Parse "4.2.0" + Date = DateTime(2023, 9, 29) + Data = Some ChangelogData.Default + } ] } From 4e72d713ba9f468467251fa159b783404030804b Mon Sep 17 00:00:00 2001 From: Maxime Mangel Date: Sat, 16 Dec 2023 17:43:31 +0100 Subject: [PATCH 3/3] Add `[YANKED]` tag support --- src/Ionide.KeepAChangelog/Library.fs | 16 +++++++++--- test/Ionide.KeepAChangelog.Test/Program.fs | 29 +++++++++++++++++++++- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/Ionide.KeepAChangelog/Library.fs b/src/Ionide.KeepAChangelog/Library.fs index d1e1fbd..b1fbce2 100644 --- a/src/Ionide.KeepAChangelog/Library.fs +++ b/src/Ionide.KeepAChangelog/Library.fs @@ -45,6 +45,7 @@ module Domain = Version : SemanticVersion Date : DateTime Data : ChangelogData option + IsYanked : bool } type Changelogs = @@ -244,20 +245,27 @@ module Parser = pipe5 pDay dot pMonth dot pYear (fun d _ m _ y -> System.DateTime(y, m, d)) attempt dmyDots <|> ymdDashes - + + let pYanked: Parser<_> = + opt (pstring "[YANKED]") + |>> function + | None -> false + | Some _ -> true let pVersion = mdUrl pSemver <|> pSemver let pRelease: Parser = let vPart = skipString "##" >>. spaces1 >>. pVersion let middle = spaces1 .>> pchar '-' .>> spaces1 - let date = pDate .>> skipRestOfLine true + let date = pDate + let yanked = opt spaces1 >>. pYanked let content = choice [ pData; pNonStructuredData ] - pipe5 vPart middle date (opt (many newline)) (opt content) (fun v _ date _ data -> + pipe6 vPart middle date yanked (opt (many newline)) (opt content) (fun v _ date isYanked _ data -> { Version = v Date = date - Data = data } + Data = data + IsYanked = isYanked } ) let pChangeLogs: Parser = diff --git a/test/Ionide.KeepAChangelog.Test/Program.fs b/test/Ionide.KeepAChangelog.Test/Program.fs index 7086f84..f5b26c1 100644 --- a/test/Ionide.KeepAChangelog.Test/Program.fs +++ b/test/Ionide.KeepAChangelog.Test/Program.fs @@ -29,6 +29,7 @@ let singleReleaseExpected = Changed = "- B\n" Removed = "- C\n" } + IsYanked = false } let keepAChangelog = @@ -70,6 +71,7 @@ let keepAChangelogExpected: Changelogs = ChangelogData.Default with Added = "- A\n- B\n- C\n\n" } + IsYanked = false } ] } @@ -106,8 +108,25 @@ let sample1ReleaseExpected = Version = SemanticVersion.Parse "0.3.1" Date = DateTime(2022, 1, 8) Data = Some { ChangelogData.Default with Added = "- Add XmlDocs to the generated package\n\n" } + IsYanked = false } - + +let yankedRelease = normalizeNewline """## [0.3.1] - 8.1.2022 [YANKED] + +### Added + +- Add XmlDocs to the generated package + +""" + +let yankedReleaseExpected = + { + Version = SemanticVersion.Parse "0.3.1" + Date = DateTime(2022, 1, 8) + Data = Some { ChangelogData.Default with Added = "- Add XmlDocs to the generated package\n\n" } + IsYanked = true + } + let sample = normalizeNewline """# Changelog All notable changes to this project will be documented in this file. @@ -147,6 +166,7 @@ let sampleExpected: Changelogs = { Version = SemanticVersion.Parse "0.3.1" Date = DateTime(2022, 1, 8) Data = Some { ChangelogData.Default with Added = "* Add XmlDocs to the generated package\n" } + IsYanked = false } { Version = SemanticVersion.Parse "0.3.0" @@ -158,16 +178,19 @@ let sampleExpected: Changelogs = { """* Expose client `CodeAction` caps as CodeActionClientCapabilities. (by @razzmatazz) * Map CodeAction.IsPreferred & CodeAction.Disabled props. (by @razzmatazz) """ } + IsYanked = false } { Version = SemanticVersion.Parse "0.2.0" Date = DateTime(2021, 11, 17) Data = Some { ChangelogData.Default with Added = "* Add support for `codeAction/resolve` (by @razzmatazz)\n" } + IsYanked = false } { Version = SemanticVersion.Parse "0.1.1" Date = DateTime(2021, 11, 15) Data = Some { ChangelogData.Default with Added = "* Initial implementation\n" } + IsYanked = false } ] } @@ -203,6 +226,7 @@ let parsingExamples = testList "parsing examples" [ runSuccess "header and unreleased" (Parser.pHeader >>. Parser.pUnreleased) headerAndUnreleased None runSuccess "release" Parser.pRelease singleRelease singleReleaseExpected runSuccess "sample 1 release" Parser.pRelease sample1Release sample1ReleaseExpected + runSuccess "yanked release" Parser.pRelease yankedRelease yankedReleaseExpected runSuccess "header and unreleased and released" (Parser.pHeader >>. Parser.pUnreleased @@ -347,6 +371,7 @@ let FableSampleExpected :Changelogs = { { Version = SemanticVersion.Parse "4.6.0" Date = DateTime(2023, 11, 27) + IsYanked = false Data = Some { ChangelogData.Default with Changed = @@ -404,11 +429,13 @@ let SectionLessSampleExpected: Changelogs = { Version = SemanticVersion.Parse "4.2.1" Date = DateTime(2023, 9, 29) Data = Some ChangelogData.Default + IsYanked = false } { Version = SemanticVersion.Parse "4.2.0" Date = DateTime(2023, 9, 29) Data = Some ChangelogData.Default + IsYanked = false } ] }