Skip to content

Commit 2e58c29

Browse files
committed
FileConventions: implement the function
Implement DetectNotUsingKebabCaseInGitHubCIJobs function.
1 parent bcd3832 commit 2e58c29

9 files changed

+60
-1
lines changed

scripts/eofConvention.fsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
open System.IO
44
open System
55

6+
#r "nuget: YamlDotNet, Version=13.0.2"
67
#load "../src/FileConventions/Helpers.fs"
78
#load "../src/FileConventions/Library.fs"
89

scripts/mixedLineEndings.fsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
open System
44
open System.IO
55

6+
#r "nuget: YamlDotNet, Version=13.0.2"
67
#load "../src/FileConventions/Library.fs"
78
#load "../src/FileConventions/Helpers.fs"
89

scripts/shebangConvention.fsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
open System
44
open System.IO
55

6+
#r "nuget: YamlDotNet, Version=13.0.2"
67
#load "../src/FileConventions/Library.fs"
78
#load "../src/FileConventions/Helpers.fs"
89

scripts/unpinnedDotnetPackageVersions.fsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
open System
44
open System.IO
55

6+
#r "nuget: YamlDotNet, Version=13.0.2"
67
#load "../src/FileConventions/Library.fs"
78
#load "../src/FileConventions/Helpers.fs"
89

scripts/unpinnedDotnetToolInstallVersions.fsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
open System
44
open System.IO
55

6+
#r "nuget: YamlDotNet, Version=13.0.2"
67
#load "../src/FileConventions/Library.fs"
78
#load "../src/FileConventions/Helpers.fs"
89

scripts/unpinnedGitHubActionsImageVersions.fsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
open System
44
open System.IO
55

6+
#r "nuget: YamlDotNet, Version=13.0.2"
67
#load "../src/FileConventions/Library.fs"
78
#load "../src/FileConventions/Helpers.fs"
89

scripts/unpinnedNugetPackageReferenceVersions.fsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
open System
44
open System.IO
55

6+
#r "nuget: YamlDotNet, Version=13.0.2"
67
#load "../src/FileConventions/Library.fs"
78
#load "../src/FileConventions/Helpers.fs"
89

src/FileConventions/FileConventions.fsproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,8 @@
1010
<Compile Include="Helpers.fs" />
1111
</ItemGroup>
1212

13+
<ItemGroup>
14+
<PackageReference Include="YamlDotNet" Version="13.0.2" />
15+
</ItemGroup>
16+
1317
</Project>

src/FileConventions/Library.fs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ open System.IO
55
open System.Linq
66
open System.Text.RegularExpressions
77

8+
open YamlDotNet
9+
open YamlDotNet.RepresentationModel
10+
811
let HasCorrectShebang(fileInfo: FileInfo) =
912
let fileText = File.ReadLines fileInfo.FullName
1013

@@ -130,4 +133,49 @@ let DetectNotUsingSnakeCaseInScriptName(fileInfo: FileInfo) =
130133

131134
let DetectNotUsingKebabCaseInGitHubCIJobs(fileInfo: FileInfo) =
132135
assert (fileInfo.FullName.EndsWith ".yml")
133-
false
136+
137+
let read yaml =
138+
use reader = new StringReader(yaml)
139+
let stream = YamlStream()
140+
stream.Load(reader)
141+
stream.Documents
142+
143+
let doc = read(File.ReadAllText fileInfo.FullName)
144+
145+
let ymlNode = doc.[0].RootNode
146+
147+
// Borrowed from https://stackoverflow.com/questions/46697298/whats-the-best-way-to-parse-yaml-in-f-on-net-core
148+
let getMapping(ymlNode: YamlNode) =
149+
let node = ymlNode :?> YamlMappingNode
150+
151+
let mapping =
152+
node.Children
153+
|> Seq.map(fun kvp ->
154+
let keyNode = kvp.Key :?> YamlScalarNode
155+
keyNode.Value, kvp.Value
156+
)
157+
|> Map.ofSeq
158+
159+
mapping
160+
161+
let jobNames =
162+
match ymlNode.NodeType with
163+
| YamlNodeType.Mapping ->
164+
let mapping = getMapping ymlNode
165+
let maybeJobs = mapping.TryFind "jobs"
166+
167+
match maybeJobs with
168+
| Some jobs ->
169+
let mapping = getMapping jobs
170+
(mapping |> Map.toSeq |> Seq.map fst)
171+
| None -> Seq.empty
172+
| _ -> Seq.empty
173+
174+
jobNames
175+
|> Seq.map(fun jobName ->
176+
let isKebabCase =
177+
jobName.ToLower() = jobName && not(jobName.Contains("_"))
178+
179+
isKebabCase
180+
)
181+
|> Seq.contains false

0 commit comments

Comments
 (0)