Skip to content

Commit c776a9a

Browse files
committed
FileConventions: implement the function
Implement DetectNotUsingKebabCaseInGitHubCIJobs function.
1 parent 89dff6d commit c776a9a

File tree

8 files changed

+59
-1
lines changed

8 files changed

+59
-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/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

@@ -112,4 +115,49 @@ let DetectNotUsingSnakeCaseInScriptName(fileInfo: FileInfo) =
112115

113116
let DetectNotUsingKebabCaseInGitHubCIJobs(fileInfo: FileInfo) =
114117
assert (fileInfo.FullName.EndsWith ".yml")
115-
false
118+
119+
let read yaml =
120+
use reader = new StringReader(yaml)
121+
let stream = YamlStream()
122+
stream.Load(reader)
123+
stream.Documents
124+
125+
let doc = read(File.ReadAllText fileInfo.FullName)
126+
127+
let ymlNode = doc.[0].RootNode
128+
129+
// Borrowed from https://stackoverflow.com/questions/46697298/whats-the-best-way-to-parse-yaml-in-f-on-net-core
130+
let getMapping(ymlNode: YamlNode) =
131+
let node = ymlNode :?> YamlMappingNode
132+
133+
let mapping =
134+
node.Children
135+
|> Seq.map(fun kvp ->
136+
let keyNode = kvp.Key :?> YamlScalarNode
137+
keyNode.Value, kvp.Value
138+
)
139+
|> Map.ofSeq
140+
141+
mapping
142+
143+
let jobNames =
144+
match ymlNode.NodeType with
145+
| YamlNodeType.Mapping ->
146+
let mapping = getMapping ymlNode
147+
let maybeJobs = mapping.TryFind "jobs"
148+
149+
match maybeJobs with
150+
| Some jobs ->
151+
let mapping = getMapping jobs
152+
(mapping |> Map.toSeq |> Seq.map fst)
153+
| None -> Seq.empty
154+
| _ -> Seq.empty
155+
156+
jobNames
157+
|> Seq.map(fun jobName ->
158+
let isKebabCase =
159+
jobName.ToLower() = jobName && not(jobName.Contains("_"))
160+
161+
isKebabCase
162+
)
163+
|> Seq.contains false

0 commit comments

Comments
 (0)