Skip to content

Commit 18a348a

Browse files
authored
Merge pull request #15 from MangelMaxime/main
Exposed an equivalent to `allReleaseNotesFor` from the Ionide.KeepAChangelog package
2 parents 97b28d7 + af89e01 commit 18a348a

File tree

3 files changed

+125
-39
lines changed

3 files changed

+125
-39
lines changed

src/Ionide.KeepAChangelog.Tasks/Library.fs

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,6 @@ module Util =
1717
item.ItemSpec <- "Unreleased"
1818
item
1919

20-
let allReleaseNotesFor (data: ChangelogData) =
21-
let section name items =
22-
match items with
23-
| [] -> []
24-
| items -> $"### {name}" :: items @ [ "" ]
25-
26-
String.concat
27-
System.Environment.NewLine
28-
([ yield! section "Added" data.Added
29-
yield! section "Changed" data.Changed
30-
yield! section "Deprecated" data.Deprecated
31-
yield! section "Removed" data.Removed
32-
yield! section "Fixed" data.Fixed
33-
yield! section "Security" data.Security
34-
for KeyValue(heading, lines) in data.Custom do
35-
yield! section heading lines ])
36-
3720
let stitch items =
3821
String.concat System.Environment.NewLine items
3922

@@ -104,7 +87,7 @@ type ParseChangelogs() =
10487
|> Option.iter (fun (version, date, data) ->
10588
data
10689
|> Option.iter (fun data ->
107-
this.LatestReleaseNotes <- Util.allReleaseNotesFor data)
90+
this.LatestReleaseNotes <- data.ToMarkdown())
10891
)
10992

11093
true

src/Ionide.KeepAChangelog/Library.fs

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module Domain =
44
open SemVersion
55
open System
6-
6+
77
// TODO: a changelog entry may have a description?
88
type ChangelogData =
99
{ Added: string list
@@ -22,6 +22,39 @@ module Domain =
2222
Security = []
2323
Custom = Map.empty }
2424

25+
member this.ToMarkdown () =
26+
27+
let renderItems (items : string list) =
28+
items
29+
|> List.map (fun item ->
30+
"* " + item
31+
)
32+
|> String.concat Environment.NewLine
33+
34+
let section name items =
35+
match items with
36+
| [] -> []
37+
| items ->
38+
$"### {name}"
39+
+ Environment.NewLine
40+
+ Environment.NewLine
41+
+ (renderItems items)
42+
+ Environment.NewLine
43+
|> List.singleton
44+
45+
String.concat
46+
Environment.NewLine
47+
[
48+
yield! section "Added" this.Added
49+
yield! section "Changed" this.Changed
50+
yield! section "Deprecated" this.Deprecated
51+
yield! section "Removed" this.Removed
52+
yield! section "Fixed" this.Fixed
53+
yield! section "Security" this.Security
54+
for KeyValue(heading, lines) in this.Custom do
55+
yield! section heading lines
56+
]
57+
2558
type Changelogs =
2659
{ Unreleased: ChangelogData option
2760
Releases: (SemanticVersion * DateTime * ChangelogData option) list }
@@ -89,9 +122,9 @@ module Parser =
89122

90123
let rest = opt (many1 (attempt followingLine))
91124

92-
pipe2 firstLine rest (fun f rest ->
125+
pipe2 firstLine rest (fun f rest ->
93126
match rest with
94-
| None -> f
127+
| None -> f
95128
| Some parts -> String.concat " " (f :: parts))
96129
<?> "line item"
97130

@@ -183,25 +216,25 @@ module Parser =
183216
|> attempt
184217

185218

186-
let pMonth =
219+
let pMonth =
187220
pint32
188221
|> attempt
189222

190-
let pDay =
223+
let pDay =
191224
pint32
192225
|> attempt
193226

194-
let ymdDashes =
227+
let ymdDashes =
195228
let dash = pchar '-'
196229
pipe5 pYear dash pMonth dash pDay (fun y _ m _ d -> System.DateTime(y, m, d))
197230

198231

199-
let dmyDots =
232+
let dmyDots =
200233
let dot = pchar '.'
201234
pipe5 pDay dot pMonth dot pYear (fun d _ m _ y -> System.DateTime(y, m, d))
202235

203236
attempt dmyDots <|> ymdDashes
204-
237+
205238

206239
let pVersion = mdUrl pSemver <|> pSemver
207240

@@ -219,7 +252,7 @@ module Parser =
219252
match unreleased with
220253
| None -> None
221254
| Some u when u = ChangelogData.Default -> None
222-
| Some unreleased -> Some unreleased
255+
| Some unreleased -> Some unreleased
223256
pipe3
224257
pHeader
225258
(attempt (opt unreleased))

test/Ionide.KeepAChangelog.Test/Program.fs

Lines changed: 82 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ let singleRelease =
1818
1919
"""
2020

21-
let singleReleaseExpected =
22-
(SemanticVersion.Parse "1.0.0", DateTime(2017, 06, 20), Some {
21+
let singleReleaseExpected =
22+
(SemanticVersion.Parse "1.0.0", DateTime(2017, 06, 20), Some {
2323
ChangelogData.Default with
2424
Added = ["- A"]
2525
Changed = ["- B"]
@@ -53,7 +53,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5353
5454
"""
5555

56-
let keepAChangelogExpected: Changelogs =
56+
let keepAChangelogExpected: Changelogs =
5757
{
5858
Unreleased = None
5959
Releases = [
@@ -89,7 +89,7 @@ let sample1Release = """## [0.3.1] - 8.1.2022
8989
9090
"""
9191

92-
let sample1ReleaseExpected =
92+
let sample1ReleaseExpected =
9393
SemanticVersion.Parse "0.3.1", DateTime(2022, 1, 8), Some { ChangelogData.Default with Added = ["- Add XmlDocs to the generated package"] }
9494

9595
let sample = """# Changelog
@@ -141,20 +141,19 @@ let runSuccess label p text expected =
141141
test $"parsing {label}" {
142142

143143
match FParsec.CharParsers.run p text with
144-
| FParsec.CharParsers.Success (r, _, _) ->
144+
| FParsec.CharParsers.Success (r, _, _) ->
145145
Expect.equal r expected "Should have produced expected value"
146-
| FParsec.CharParsers.Failure (m, _, _) ->
146+
| FParsec.CharParsers.Failure (m, _, _) ->
147147
failwithf "%A" m
148148
}
149149

150-
[<Tests>]
151-
let tests = testList "parsing examples" [
150+
let parsingExamples = testList "parsing examples" [
152151
runSuccess "line entry" Parser.pEntry "- A" "- A"
153152
runSuccess "header" Parser.pHeader header ()
154153
runSuccess "unreleased" Parser.pUnreleased emptyUnreleased None
155154
runSuccess "header and unreleased" (Parser.pHeader >>. Parser.pUnreleased) headerAndUnreleased None
156-
runSuccess "release" Parser.pRelease singleRelease singleReleaseExpected
157-
runSuccess "sample 1 release" Parser.pRelease sample1Release sample1ReleaseExpected
155+
runSuccess "release" Parser.pRelease singleRelease singleReleaseExpected
156+
runSuccess "sample 1 release" Parser.pRelease sample1Release sample1ReleaseExpected
158157
runSuccess
159158
"header and unreleased and released"
160159
(Parser.pHeader >>. Parser.pUnreleased
@@ -167,6 +166,77 @@ let tests = testList "parsing examples" [
167166
runSuccess "lsp changelog" Parser.pChangeLogs sample sampleExpected
168167
]
169168

169+
let changelogDataTest =
170+
test "Transform ChangelogData to Markdown" {
171+
let changelogData =
172+
{
173+
Added = [ "Added line 1"; "Added line 2" ]
174+
Changed = [ "Changed line 1"; "Changed line 2" ]
175+
Deprecated = [ "Deprecated line 1"; "Deprecated line 2" ]
176+
Removed = [ "Removed line 1"; "Removed line 2" ]
177+
Fixed = [ "Fixed line 1"; "Fixed line 2" ]
178+
Security = [ "Security line 1"; "Security line 2" ]
179+
Custom =
180+
[
181+
"CustomHeaderA", [ "Custom line 1"; "Custom line 2" ]
182+
"CustomHeaderB", [ "Custom line 3"; "Custom line 4" ]
183+
]
184+
|> Map.ofList
185+
}
186+
187+
printfn "%A" (changelogData.ToMarkdown())
188+
189+
let expected =
190+
"""### Added
191+
192+
* Added line 1
193+
* Added line 2
194+
195+
### Changed
196+
197+
* Changed line 1
198+
* Changed line 2
199+
200+
### Deprecated
201+
202+
* Deprecated line 1
203+
* Deprecated line 2
204+
205+
### Removed
206+
207+
* Removed line 1
208+
* Removed line 2
209+
210+
### Fixed
211+
212+
* Fixed line 1
213+
* Fixed line 2
214+
215+
### Security
216+
217+
* Security line 1
218+
* Security line 2
219+
220+
### CustomHeaderA
221+
222+
* Custom line 1
223+
* Custom line 2
224+
225+
### CustomHeaderB
226+
227+
* Custom line 3
228+
* Custom line 4
229+
"""
230+
231+
Expect.equal (changelogData.ToMarkdown()) expected "Should have produced expected value"
232+
}
233+
234+
[<Tests>]
235+
let tests = testList "All" [
236+
parsingExamples
237+
changelogDataTest
238+
]
239+
170240
[<EntryPoint>]
171-
let main argv =
172-
runTestsWithCLIArgs Seq.empty argv tests
241+
let main argv =
242+
runTestsWithCLIArgs Seq.empty argv tests

0 commit comments

Comments
 (0)