@@ -5,6 +5,9 @@ open System.IO
55open System.Linq
66open System.Text .RegularExpressions
77
8+ open YamlDotNet
9+ open YamlDotNet.RepresentationModel
10+
811let HasCorrectShebang ( fileInfo : FileInfo ) =
912 let fileText = File.ReadLines fileInfo.FullName
1013
@@ -130,4 +133,49 @@ let DetectNotUsingSnakeCaseInScriptName(fileInfo: FileInfo) =
130133
131134let 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