@@ -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
@@ -112,4 +115,49 @@ let DetectNotUsingSnakeCaseInScriptName(fileInfo: FileInfo) =
112115
113116let 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