Skip to content

Commit fc35778

Browse files
author
Maxime Mangel
committed
Allow release section to have a free-text descrption
Fix #4
1 parent c667d4b commit fc35778

File tree

3 files changed

+70
-6
lines changed

3 files changed

+70
-6
lines changed

src/Ionide.KeepAChangelog.Tasks/Library.fs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ module Util =
3030

3131
item
3232

33+
let mapDescription (description: string) (item: ITaskItem) : ITaskItem =
34+
item.SetMetadata("Description", description)
35+
item
36+
3337
type ParseChangelogs() =
3438
inherit Task()
3539

@@ -72,6 +76,10 @@ type ParseChangelogs() =
7276
|> Seq.map (fun release ->
7377
TaskItem()
7478
|> Util.mapReleaseInfo release.Version release.Date
79+
|> fun d ->
80+
match release.Description with
81+
| Some desc -> Util.mapDescription desc d
82+
| None -> d
7583
|> fun d ->
7684
match release.Data with
7785
| Some data -> Util.mapChangelogData data d

src/Ionide.KeepAChangelog/Library.fs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ module Domain =
4141
{ Version: SemanticVersion
4242
Date: DateTime
4343
Data: ChangelogData option
44+
Description: string option
4445
IsYanked: bool }
4546

4647
type Changelogs =
@@ -233,18 +234,39 @@ module Parser =
233234

234235
let pVersion = mdUrl pSemver <|> pSemver
235236

237+
let pReleaseDescription =
238+
let nextHeader = (opt newline >>. regex @"[#]{1,3}\s\S" |>> ignore)
239+
let endOfSection = choice [ eof; nextHeader ]
240+
241+
let description =
242+
(manyTill anyChar (lookAhead endOfSection) .>> attempt (opt newline))
243+
|>> function
244+
| [] -> None
245+
| x -> Some(System.String.Concat x)
246+
247+
description <?> "release description body"
248+
236249
let pRelease: Parser<Release> =
237250
let vPart = skipString "##" >>. spaces1 >>. pVersion
238251
let middle = spaces1 .>> pchar '-' .>> spaces1
239252
let date = pDate
240253
let yanked = opt spaces1 >>. pYanked
241254
let content = choice [ pData; pNonStructuredData ]
242255

243-
pipe6 vPart middle date yanked (opt (many newline)) (opt content) (fun v _ date yanked _ data ->
244-
{ Version = v
245-
Date = date
246-
Data = data
247-
IsYanked = yanked })
256+
pipe7
257+
vPart
258+
middle
259+
date
260+
yanked
261+
(opt (many newline))
262+
pReleaseDescription
263+
(opt content)
264+
(fun v _ date yanked _ desciption data ->
265+
{ Version = v
266+
Date = date
267+
Data = data
268+
Description = desciption
269+
IsYanked = yanked })
248270

249271
let pChangeLogs: Parser<Changelogs, unit> =
250272
let unreleased =

test/Ionide.KeepAChangelog.Test/Program.fs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ let singleReleaseExpected =
3030
Removed = "- C\n"
3131
}
3232
IsYanked = false
33+
Description = None
3334
}
3435

3536
let keepAChangelog =
@@ -72,6 +73,7 @@ let keepAChangelogExpected: Changelogs =
7273
Added = "- A\n- B\n- C\n\n"
7374
}
7475
IsYanked = false
76+
Description = None
7577
}
7678
]
7779
}
@@ -109,6 +111,7 @@ let sample1ReleaseExpected =
109111
Date = DateTime(2022, 1, 8)
110112
Data = Some { ChangelogData.Default with Added = "- Add XmlDocs to the generated package\n\n" }
111113
IsYanked = false
114+
Description = None
112115
}
113116

114117
let yankedRelease = normalizeNewline """## [0.3.1] - 8.1.2022 [YANKED]
@@ -125,6 +128,29 @@ let yankedReleaseExpected =
125128
Date = DateTime(2022, 1, 8)
126129
Data = Some { ChangelogData.Default with Added = "- Add XmlDocs to the generated package\n\n" }
127130
IsYanked = true
131+
Description = None
132+
}
133+
134+
let releaseWithDescription =
135+
normalizeNewline """## [0.3.1] - 8.1.2022
136+
137+
This is a description
138+
139+
And there is even a second line
140+
141+
### Added
142+
143+
- Add XmlDocs to the generated package
144+
145+
"""
146+
147+
let releaseWithDescriptionExpected =
148+
{
149+
Version = SemanticVersion.Parse "0.3.1"
150+
Date = DateTime(2022, 1, 8)
151+
Data = Some { ChangelogData.Default with Added = "- Add XmlDocs to the generated package\n\n" }
152+
IsYanked = false
153+
Description = Some "This is a description\n\nAnd there is even a second line\n"
128154
}
129155

130156
let sample = normalizeNewline """# Changelog
@@ -167,6 +193,7 @@ let sampleExpected: Changelogs = {
167193
Date = DateTime(2022, 1, 8)
168194
Data = Some { ChangelogData.Default with Added = "* Add XmlDocs to the generated package\n" }
169195
IsYanked = false
196+
Description = None
170197
}
171198
{
172199
Version = SemanticVersion.Parse "0.3.0"
@@ -179,18 +206,21 @@ let sampleExpected: Changelogs = {
179206
* Map CodeAction.IsPreferred & CodeAction.Disabled props. (by @razzmatazz)
180207
""" }
181208
IsYanked = false
209+
Description = None
182210
}
183211
{
184212
Version = SemanticVersion.Parse "0.2.0"
185213
Date = DateTime(2021, 11, 17)
186214
Data = Some { ChangelogData.Default with Added = "* Add support for `codeAction/resolve` (by @razzmatazz)\n" }
187215
IsYanked = false
216+
Description = None
188217
}
189218
{
190219
Version = SemanticVersion.Parse "0.1.1"
191220
Date = DateTime(2021, 11, 15)
192221
Data = Some { ChangelogData.Default with Added = "* Initial implementation\n" }
193222
IsYanked = false
223+
Description = None
194224
}
195225

196226
]
@@ -220,14 +250,15 @@ let runSuccessNormalized label (p: Parser<string,unit>) text (expected:string) =
220250
failwithf "%A" m
221251
}
222252

223-
let parsingExamples = testList "parsing examples" [
253+
let parsingExamples = ftestList "parsing examples" [
224254
runSuccess "line entry" Parser.pEntry "- A" "- A"
225255
runSuccess "header" Parser.pHeader header ()
226256
runSuccess "unreleased" Parser.pUnreleased emptyUnreleased None
227257
runSuccess "header and unreleased" (Parser.pHeader >>. Parser.pUnreleased) headerAndUnreleased None
228258
runSuccess "release" Parser.pRelease singleRelease singleReleaseExpected
229259
runSuccess "sample 1 release" Parser.pRelease sample1Release sample1ReleaseExpected
230260
runSuccess "yanked release" Parser.pRelease yankedRelease yankedReleaseExpected
261+
runSuccess "release with description" Parser.pRelease releaseWithDescription releaseWithDescriptionExpected
231262
runSuccess
232263
"header and unreleased and released"
233264
(Parser.pHeader >>. Parser.pUnreleased
@@ -373,6 +404,7 @@ let FableSampleExpected :Changelogs = {
373404
Version = SemanticVersion.Parse "4.6.0"
374405
Date = DateTime(2023, 11, 27)
375406
IsYanked = false
407+
Description = None
376408
Data = Some {
377409
ChangelogData.Default with
378410
Changed =
@@ -430,12 +462,14 @@ let SectionLessSampleExpected: Changelogs = {
430462
Version = SemanticVersion.Parse "4.2.1"
431463
Date = DateTime(2023, 9, 29)
432464
IsYanked = false
465+
Description = None
433466
Data = Some ChangelogData.Default
434467
}
435468
{
436469
Version = SemanticVersion.Parse "4.2.0"
437470
Date = DateTime(2023, 9, 29)
438471
IsYanked = false
472+
Description = None
439473
Data = Some ChangelogData.Default
440474
}
441475
]

0 commit comments

Comments
 (0)