diff --git a/scripts/checkCommits1by1.fsx b/scripts/checkCommits1by1.fsx index f15feb45..8b102fdd 100755 --- a/scripts/checkCommits1by1.fsx +++ b/scripts/checkCommits1by1.fsx @@ -9,7 +9,7 @@ open System.Net.Http.Headers #r "nuget: FSharp.Data, Version=5.0.2" open FSharp.Data -#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" open Fsdk open Fsdk.Process diff --git a/scripts/compileFSharpScripts.fsx b/scripts/compileFSharpScripts.fsx index 09fd0d5e..6eff0616 100755 --- a/scripts/compileFSharpScripts.fsx +++ b/scripts/compileFSharpScripts.fsx @@ -3,7 +3,7 @@ open System open System.IO -#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" #load "../src/FileConventions/Helpers.fs" Fsdk diff --git a/scripts/dotnetFileConventions.fsx b/scripts/dotnetFileConventions.fsx new file mode 100755 index 00000000..0c868a6f --- /dev/null +++ b/scripts/dotnetFileConventions.fsx @@ -0,0 +1,79 @@ +#!/usr/bin/env -S dotnet fsi + +open System +open System.IO +open System.Text.RegularExpressions + +#r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" + +open Fsdk +open Fsdk.Process + +#load "../src/FileConventions/Helpers.fs" +#load "../src/FileConventions/Library.fs" + +open FileConventions +open Helpers + +let args = Misc.FsxOnlyArguments() + +if args.Length > 1 then + Console.Error.WriteLine + "Usage: dotnetFileConventions.fsx [projectFolder(optional)]" + + Environment.Exit 1 + +let rootDir = DirectoryInfo args.[0] + +// DefiningEmptyStringsWithDoubleQuotes +let allSourceFiles = ReturnAllProjectSourceFiles rootDir [ "*.cs"; "*.fs" ] true +printfn "%A" (String.Join("\n", allSourceFiles)) + +let allProjFiles = + ReturnAllProjectSourceFiles rootDir [ "*.csproj"; "*.fsproj" ] true + +for sourceFile in allSourceFiles do + let isStringEmpty = DefiningEmptyStringsWithDoubleQuotes sourceFile + + if isStringEmpty then + failwith( + sprintf + "%s file: Contains empty strings specifed with \"\" , you should use String.Empty()" + sourceFile.FullName + ) + + +// ProjFilesNamingConvention + +for projfile in allProjFiles do + let isWrongProjFile = ProjFilesNamingConvention projfile + + if isWrongProjFile then + failwith( + sprintf + "%s file: Project file or Project directory is incorrect!\n + Fix: use same name on .csproj/.fsproj on parrent project directory" + projfile.FullName + ) + +// notfollowingnamespaceconvention +for sourcefile in allSourceFiles do + let iswrongnamespace = NotFollowingNamespaceConvention sourcefile + + if iswrongnamespace then + failwith(sprintf "%s file: has wrong namespace!" sourcefile.FullName) + +// NotFollowingConsoleAppConvention +for projfile in allProjFiles do + let isWrongConsoleApplication = + NotFollowingConsoleAppConvention projfile true + + printfn "%A" projfile + + if isWrongConsoleApplication then + failwith( + sprintf + "%s project: Should not contain console methods or printf" + projfile.FullName + ) diff --git a/scripts/eofConvention.fsx b/scripts/eofConvention.fsx index 3f2b712b..d01257a5 100755 --- a/scripts/eofConvention.fsx +++ b/scripts/eofConvention.fsx @@ -4,6 +4,7 @@ open System.IO open System #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" #load "../src/FileConventions/Helpers.fs" #load "../src/FileConventions/Library.fs" diff --git a/scripts/executableConvention.fsx b/scripts/executableConvention.fsx index cecaf6b5..06c6c8a1 100755 --- a/scripts/executableConvention.fsx +++ b/scripts/executableConvention.fsx @@ -4,8 +4,9 @@ open System open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" -#load "../src/FileConventions/Library.fs" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" #load "../src/FileConventions/Helpers.fs" +#load "../src/FileConventions/Library.fs" let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo diff --git a/scripts/gitPush1by1.fsx b/scripts/gitPush1by1.fsx index c336cfc1..58ace0fd 100755 --- a/scripts/gitPush1by1.fsx +++ b/scripts/gitPush1by1.fsx @@ -8,7 +8,7 @@ open System.Threading #r "System.Configuration" open System.Configuration -#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" open Fsdk open Fsdk.Process diff --git a/scripts/inconsistentVersionsInFSharpScripts.fsx b/scripts/inconsistentVersionsInFSharpScripts.fsx index 93922496..82b72af9 100755 --- a/scripts/inconsistentVersionsInFSharpScripts.fsx +++ b/scripts/inconsistentVersionsInFSharpScripts.fsx @@ -4,9 +4,10 @@ open System.IO open System.Linq #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" -#load "../src/FileConventions/Library.fs" #load "../src/FileConventions/Helpers.fs" +#load "../src/FileConventions/Library.fs" let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo let currentDir = Directory.GetCurrentDirectory() |> DirectoryInfo diff --git a/scripts/inconsistentVersionsInGitHubCI.fsx b/scripts/inconsistentVersionsInGitHubCI.fsx index f8041a45..6777390c 100755 --- a/scripts/inconsistentVersionsInGitHubCI.fsx +++ b/scripts/inconsistentVersionsInGitHubCI.fsx @@ -3,9 +3,10 @@ open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" -#load "../src/FileConventions/Library.fs" #load "../src/FileConventions/Helpers.fs" +#load "../src/FileConventions/Library.fs" let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo diff --git a/scripts/mixedLineEndings.fsx b/scripts/mixedLineEndings.fsx index 427826a6..d3cef830 100755 --- a/scripts/mixedLineEndings.fsx +++ b/scripts/mixedLineEndings.fsx @@ -4,9 +4,10 @@ open System open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" -#load "../src/FileConventions/Library.fs" #load "../src/FileConventions/Helpers.fs" +#load "../src/FileConventions/Library.fs" let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo diff --git a/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx b/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx index 54bd123d..eaac7547 100755 --- a/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx +++ b/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx @@ -4,9 +4,10 @@ open System open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" -#load "../src/FileConventions/Library.fs" #load "../src/FileConventions/Helpers.fs" +#load "../src/FileConventions/Library.fs" let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo diff --git a/scripts/shebangConvention.fsx b/scripts/shebangConvention.fsx index 965a9aad..5c2c9320 100755 --- a/scripts/shebangConvention.fsx +++ b/scripts/shebangConvention.fsx @@ -4,9 +4,10 @@ open System open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" -#load "../src/FileConventions/Library.fs" #load "../src/FileConventions/Helpers.fs" +#load "../src/FileConventions/Library.fs" let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo diff --git a/scripts/unpinnedDotnetPackageVersions.fsx b/scripts/unpinnedDotnetPackageVersions.fsx index 56da33c0..af45ef18 100755 --- a/scripts/unpinnedDotnetPackageVersions.fsx +++ b/scripts/unpinnedDotnetPackageVersions.fsx @@ -4,9 +4,10 @@ open System open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" -#load "../src/FileConventions/Library.fs" #load "../src/FileConventions/Helpers.fs" +#load "../src/FileConventions/Library.fs" let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo diff --git a/scripts/unpinnedDotnetToolInstallVersions.fsx b/scripts/unpinnedDotnetToolInstallVersions.fsx index 92f35dcc..7cdffc99 100755 --- a/scripts/unpinnedDotnetToolInstallVersions.fsx +++ b/scripts/unpinnedDotnetToolInstallVersions.fsx @@ -4,9 +4,10 @@ open System open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" -#load "../src/FileConventions/Library.fs" #load "../src/FileConventions/Helpers.fs" +#load "../src/FileConventions/Library.fs" let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo diff --git a/scripts/unpinnedGitHubActionsImageVersions.fsx b/scripts/unpinnedGitHubActionsImageVersions.fsx index 07d31cc9..31615dc8 100755 --- a/scripts/unpinnedGitHubActionsImageVersions.fsx +++ b/scripts/unpinnedGitHubActionsImageVersions.fsx @@ -4,9 +4,10 @@ open System open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" -#load "../src/FileConventions/Library.fs" #load "../src/FileConventions/Helpers.fs" +#load "../src/FileConventions/Library.fs" let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo diff --git a/scripts/unpinnedNugetPackageReferenceVersions.fsx b/scripts/unpinnedNugetPackageReferenceVersions.fsx index 72e0e74b..44370c1a 100755 --- a/scripts/unpinnedNugetPackageReferenceVersions.fsx +++ b/scripts/unpinnedNugetPackageReferenceVersions.fsx @@ -4,9 +4,10 @@ open System open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" -#load "../src/FileConventions/Library.fs" #load "../src/FileConventions/Helpers.fs" +#load "../src/FileConventions/Library.fs" let rootDir = Path.Combine(__SOURCE_DIRECTORY__, "..") |> DirectoryInfo diff --git a/scripts/wrapLatestCommitMsg.fsx b/scripts/wrapLatestCommitMsg.fsx index 64f757eb..4fd8e11e 100755 --- a/scripts/wrapLatestCommitMsg.fsx +++ b/scripts/wrapLatestCommitMsg.fsx @@ -5,11 +5,11 @@ open System open System.Text.RegularExpressions #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" +#load "../src/FileConventions/Helpers.fs" #load "../src/FileConventions/Library.fs" -#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62" - open Fsdk open Fsdk.Process diff --git a/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/DummyConsoleProjectWithRightName.Console.fsproj b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/DummyConsoleProjectWithRightName.Console.fsproj new file mode 100644 index 00000000..299cf40e --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/DummyConsoleProjectWithRightName.Console.fsproj @@ -0,0 +1,12 @@ + + + + Exe + net7.0 + + + + + + + diff --git a/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/Program.fs b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/Program.fs new file mode 100644 index 00000000..543f77ad --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/Program.fs @@ -0,0 +1 @@ +printf "Hello World" diff --git a/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/DummyConsoleProjectWithWrongName.fsproj b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/DummyConsoleProjectWithWrongName.fsproj new file mode 100644 index 00000000..299cf40e --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/DummyConsoleProjectWithWrongName.fsproj @@ -0,0 +1,12 @@ + + + + Exe + net7.0 + + + + + + + diff --git a/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/Program.fs b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/Program.fs new file mode 100644 index 00000000..543f77ad --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/Program.fs @@ -0,0 +1 @@ +printf "Hello World" diff --git a/src/FileConventions.Test/DummyFiles/DummyProjFileWithTheSameNameAsItsParentFolder/DummyProjFileWithTheSameNameAsItsParentFolder.fsproj b/src/FileConventions.Test/DummyFiles/DummyProjFileWithTheSameNameAsItsParentFolder/DummyProjFileWithTheSameNameAsItsParentFolder.fsproj new file mode 100644 index 00000000..e69de29b diff --git a/src/FileConventions.Test/DummyFiles/DummyProject/DummyProjFileWithoutTheSameNameAsItsParentFolder.fsproj b/src/FileConventions.Test/DummyFiles/DummyProject/DummyProjFileWithoutTheSameNameAsItsParentFolder.fsproj new file mode 100644 index 00000000..e69de29b diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/DummyProjectAsync.Console.fsproj b/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/DummyProjectAsync.Console.fsproj new file mode 100644 index 00000000..299cf40e --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/DummyProjectAsync.Console.fsproj @@ -0,0 +1,12 @@ + + + + Exe + net7.0 + + + + + + + diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/Program.fs b/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/Program.fs new file mode 100644 index 00000000..6cceb79d --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/Program.fs @@ -0,0 +1,2 @@ +async { do! Async.Sleep(5000) } |> Async.RunSynchronously +printf "Hello World" diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectAsync/DummyProjectAsync.fsproj b/src/FileConventions.Test/DummyFiles/DummyProjectAsync/DummyProjectAsync.fsproj new file mode 100644 index 00000000..9263cfd6 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyProjectAsync/DummyProjectAsync.fsproj @@ -0,0 +1,12 @@ + + + + net7.0 + true + + + + + + + diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectAsync/Library.fs b/src/FileConventions.Test/DummyFiles/DummyProjectAsync/Library.fs new file mode 100644 index 00000000..bf14df5f --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyProjectAsync/Library.fs @@ -0,0 +1,7 @@ +namespace DummyProjectAsync + +module Say = + + let delayedHello name = + async { do! Async.Sleep(5000) } |> Async.RunSynchronously + "Delayed Hello" diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/DummyProjectWithRight.Console.fsproj b/src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/DummyProjectWithRight.Console.fsproj new file mode 100644 index 00000000..299cf40e --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/DummyProjectWithRight.Console.fsproj @@ -0,0 +1,12 @@ + + + + Exe + net7.0 + + + + + + + diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/Program.fs b/src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/Program.fs new file mode 100644 index 00000000..543f77ad --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/Program.fs @@ -0,0 +1 @@ +printf "Hello World" diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/DummyProjectWithWrongConsole.fsproj b/src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/DummyProjectWithWrongConsole.fsproj new file mode 100644 index 00000000..9263cfd6 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/DummyProjectWithWrongConsole.fsproj @@ -0,0 +1,12 @@ + + + + net7.0 + true + + + + + + + diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/Library.fs b/src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/Library.fs new file mode 100644 index 00000000..78fab96d --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/Library.fs @@ -0,0 +1,6 @@ +// printf not accepted here +namespace DummyProjectWithWrongConsole + +module Say = + let hello name = + printfn "Hello %s" name diff --git a/src/FileConventions.Test/DummyFiles/DummyScriptWithConventionalEmptyString.fsx b/src/FileConventions.Test/DummyFiles/DummyScriptWithConventionalEmptyString.fsx new file mode 100644 index 00000000..cc2a7e4a --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyScriptWithConventionalEmptyString.fsx @@ -0,0 +1,6 @@ +#!/usr/bin/env -S dotnet fsi + +open System +open System.IO + +let emptyString = String.Empty diff --git a/src/FileConventions.Test/DummyFiles/DummyScriptWithEmptyString.fsx b/src/FileConventions.Test/DummyFiles/DummyScriptWithEmptyString.fsx new file mode 100644 index 00000000..1ae049d8 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyScriptWithEmptyString.fsx @@ -0,0 +1 @@ +let myString = "\"Hello World\"" diff --git a/src/FileConventions.Test/DummyFiles/DummyScriptWithMatchEmptyString.fsx b/src/FileConventions.Test/DummyFiles/DummyScriptWithMatchEmptyString.fsx new file mode 100644 index 00000000..f8911d75 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyScriptWithMatchEmptyString.fsx @@ -0,0 +1,5 @@ +let temp = "Hello World" + +match temp with +| "" -> failwith "Empty String" +| _ -> failwith "Non-Empty String" diff --git a/src/FileConventions.Test/DummyFiles/DummyScriptWithNonConventionalEmptyString.fsx b/src/FileConventions.Test/DummyFiles/DummyScriptWithNonConventionalEmptyString.fsx new file mode 100644 index 00000000..126e0616 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyScriptWithNonConventionalEmptyString.fsx @@ -0,0 +1,6 @@ +#!/usr/bin/env -S dotnet fsi + +open System +open System.IO + +let emptyString = "" diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithRightNamespace.fs b/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithRightNamespace.fs new file mode 100644 index 00000000..7de30ff2 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithRightNamespace.fs @@ -0,0 +1 @@ +namespace Foo.Bar diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace.fs b/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace.fs new file mode 100644 index 00000000..b1a3e545 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace.fs @@ -0,0 +1 @@ +namespace Foo.Baz diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace2.fs b/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace2.fs new file mode 100644 index 00000000..0dda3513 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace2.fs @@ -0,0 +1 @@ +namespace Bar diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.cs b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.cs new file mode 100644 index 00000000..2f2bebd3 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.cs @@ -0,0 +1,3 @@ +using System; + +namespace Foo; diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.fs b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.fs new file mode 100644 index 00000000..a36e204f --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.fs @@ -0,0 +1 @@ +namespace Foo diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace.fs b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace.fs new file mode 100644 index 00000000..9704ca2b --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace.fs @@ -0,0 +1 @@ +namespace Baz diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace2.fs b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace2.fs new file mode 100644 index 00000000..d631c774 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace2.fs @@ -0,0 +1 @@ +namespace FooBuzz diff --git a/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithoutNamespace.fs b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithoutNamespace.fs new file mode 100644 index 00000000..4c736242 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithoutNamespace.fs @@ -0,0 +1 @@ +printf "Hello" diff --git a/src/FileConventions.Test/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index e32fe7a4..0e86a853 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -22,12 +22,12 @@ let dummyFilesDirectory = [] let HasCorrectShebangTest1() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyWithoutShebang.fsx" ) - )) + ) Assert.That(HasCorrectShebang fileInfo, Is.EqualTo false) @@ -35,9 +35,9 @@ let HasCorrectShebangTest1() = [] let HasCorrectShebangTest2() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine(dummyFilesDirectory.FullName, "DummyWithShebang.fsx") - )) + ) Assert.That(HasCorrectShebang fileInfo, Is.EqualTo true) @@ -45,12 +45,12 @@ let HasCorrectShebangTest2() = [] let HasCorrectShebangTest3() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyWithWrongShebang.fsx" ) - )) + ) Assert.That(HasCorrectShebang fileInfo, Is.EqualTo false) @@ -58,7 +58,7 @@ let HasCorrectShebangTest3() = [] let HasCorrectShebangTest4() = let fileInfo = - (FileInfo(Path.Combine(dummyFilesDirectory.FullName, "DummyEmpty.fsx"))) + FileInfo(Path.Combine(dummyFilesDirectory.FullName, "DummyEmpty.fsx")) Assert.That(HasCorrectShebang fileInfo, Is.EqualTo false) @@ -66,12 +66,12 @@ let HasCorrectShebangTest4() = [] let MixedLineEndingsTest1() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyWithMixedLineEndings" ) - )) + ) Assert.That(MixedLineEndings fileInfo, Is.EqualTo true) @@ -79,9 +79,9 @@ let MixedLineEndingsTest1() = [] let MixedLineEndingsTest2() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine(dummyFilesDirectory.FullName, "DummyWithLFLineEndings") - )) + ) Assert.That(MixedLineEndings fileInfo, Is.EqualTo false) @@ -89,12 +89,12 @@ let MixedLineEndingsTest2() = [] let MixedLineEndingsTest3() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyWithCRLFLineEndings" ) - )) + ) Assert.That(MixedLineEndings fileInfo, Is.EqualTo false) @@ -102,12 +102,12 @@ let MixedLineEndingsTest3() = [] let DetectUnpinnedVersionsInGitHubCI1() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithLatestTag.yml" ) - )) + ) Assert.That(DetectUnpinnedVersionsInGitHubCI fileInfo, Is.EqualTo true) @@ -115,12 +115,12 @@ let DetectUnpinnedVersionsInGitHubCI1() = [] let DetectUnpinnedVersionsInGitHubCI2() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithoutLatestTag.yml" ) - )) + ) Assert.That(DetectUnpinnedVersionsInGitHubCI fileInfo, Is.EqualTo false) @@ -128,12 +128,12 @@ let DetectUnpinnedVersionsInGitHubCI2() = [] let DetectUnpinnedDotnetToolInstallVersions1() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithUnpinnedDotnetToolInstallVersion.yml" ) - )) + ) Assert.That( DetectUnpinnedDotnetToolInstallVersions fileInfo, @@ -144,12 +144,12 @@ let DetectUnpinnedDotnetToolInstallVersions1() = [] let DetectAsteriskInPackageReferenceItems1() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyFsprojWithAsterisk.fsproj" ) - )) + ) Assert.That(DetectAsteriskInPackageReferenceItems fileInfo, Is.EqualTo true) @@ -157,12 +157,12 @@ let DetectAsteriskInPackageReferenceItems1() = [] let DetectAsteriskInPackageReferenceItems2() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyFsprojWithoutAsterisk.fsproj" ) - )) + ) Assert.That( DetectAsteriskInPackageReferenceItems fileInfo, @@ -173,12 +173,12 @@ let DetectAsteriskInPackageReferenceItems2() = [] let MissingVersionsInNugetPackageReferencesTest1() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyWithMissingVersionsInNugetPackageReferences.fsx" ) - )) + ) Assert.That( DetectMissingVersionsInNugetPackageReferences fileInfo, @@ -189,12 +189,12 @@ let MissingVersionsInNugetPackageReferencesTest1() = [] let MissingVersionsInNugetPackageReferencesTest2() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyWithoutMissingVersionsInNugetPackageReferences.fsx" ) - )) + ) Assert.That( DetectMissingVersionsInNugetPackageReferences fileInfo, @@ -205,12 +205,12 @@ let MissingVersionsInNugetPackageReferencesTest2() = [] let MissingVersionsInNugetPackageReferencesTest3() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyWithoutNugetPackageReferences.fsx" ) - )) + ) Assert.That( DetectMissingVersionsInNugetPackageReferences fileInfo, @@ -221,9 +221,9 @@ let MissingVersionsInNugetPackageReferencesTest3() = [] let EolAtEofTest1() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine(dummyFilesDirectory.FullName, "DummyWithEolAtEof.txt") - )) + ) Assert.That(EolAtEof fileInfo, Is.EqualTo True) @@ -231,12 +231,12 @@ let EolAtEofTest1() = [] let EolAtEofTest2() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyWithoutEolAtEof.txt" ) - )) + ) Assert.That(EolAtEof fileInfo, Is.EqualTo False) @@ -244,7 +244,7 @@ let EolAtEofTest2() = [] let EolAtEofTest3() = let fileInfo = - (FileInfo(Path.Combine(dummyFilesDirectory.FullName, "someLib.dll"))) + FileInfo(Path.Combine(dummyFilesDirectory.FullName, "someLib.dll")) Assert.That(EolAtEof fileInfo, Is.EqualTo NotApplicable) @@ -252,7 +252,7 @@ let EolAtEofTest3() = [] let HasBinaryContentTest1() = let fileInfo = - (FileInfo(Path.Combine(dummyFilesDirectory.FullName, "someLib.dll"))) + FileInfo(Path.Combine(dummyFilesDirectory.FullName, "someLib.dll")) Assert.That(HasBinaryContent fileInfo, Is.EqualTo true) @@ -260,7 +260,7 @@ let HasBinaryContentTest1() = [] let HasBinaryContentTest2() = let fileInfo = - (FileInfo(Path.Combine(dummyFilesDirectory.FullName, "white.png"))) + FileInfo(Path.Combine(dummyFilesDirectory.FullName, "white.png")) Assert.That(HasBinaryContent fileInfo, Is.EqualTo true) @@ -268,9 +268,9 @@ let HasBinaryContentTest2() = [] let HasBinaryContentTest3() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine(dummyFilesDirectory.FullName, "DummyNonBinaryFile.txt") - )) + ) Assert.That(HasBinaryContent fileInfo, Is.EqualTo false) @@ -279,14 +279,14 @@ let HasBinaryContentTest3() = let DetectInconsistentVersionsInGitHubCIWorkflow1() = let fileInfo = - (Seq.singleton( + Seq.singleton( FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithSamePulumiVersion.yml" ) ) - )) + ) Assert.That( DetectInconsistentVersionsInGitHubCIWorkflow fileInfo, @@ -297,14 +297,14 @@ let DetectInconsistentVersionsInGitHubCIWorkflow1() = [] let DetectInconsistentVersionsInGitHubCIWorkflow2() = let fileInfo = - (Seq.singleton( + Seq.singleton( FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithoutSamePulumiVersion.yml" ) ) - )) + ) Assert.That( DetectInconsistentVersionsInGitHubCIWorkflow fileInfo, @@ -315,14 +315,14 @@ let DetectInconsistentVersionsInGitHubCIWorkflow2() = [] let DetectInconsistentVersionsInGitHubCIWorkflow3() = let fileInfo = - (Seq.singleton( + Seq.singleton( FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithoutSameSetupPulumiVersion.yml" ) ) - )) + ) Assert.That( DetectInconsistentVersionsInGitHubCIWorkflow fileInfo, @@ -333,14 +333,14 @@ let DetectInconsistentVersionsInGitHubCIWorkflow3() = [] let DetectInconsistentVersionsInGitHubCIWorkflow4() = let fileInfo = - (Seq.singleton( + Seq.singleton( FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithSameSetupPulumiVersion.yml" ) ) - )) + ) Assert.That( DetectInconsistentVersionsInGitHubCIWorkflow fileInfo, @@ -351,7 +351,7 @@ let DetectInconsistentVersionsInGitHubCIWorkflow4() = [] let DetectInconsistentVersionsInGitHubCIWorkflow5() = let fileInfo = - (seq { + seq { FileInfo( Path.Combine( @@ -367,7 +367,7 @@ let DetectInconsistentVersionsInGitHubCIWorkflow5() = ) ) - }) + } Assert.That( DetectInconsistentVersionsInGitHubCIWorkflow fileInfo, @@ -378,14 +378,14 @@ let DetectInconsistentVersionsInGitHubCIWorkflow5() = [] let DetectInconsistentVersionsInGitHubCIWorkflow6() = let fileInfo = - (Seq.singleton( + Seq.singleton( FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithoutSameCheckoutVersion.yml" ) ) - )) + ) Assert.That( DetectInconsistentVersionsInGitHubCIWorkflow fileInfo, @@ -396,14 +396,14 @@ let DetectInconsistentVersionsInGitHubCIWorkflow6() = [] let DetectInconsistentVersionsInGitHubCIWorkflow7() = let fileInfo = - (Seq.singleton( + Seq.singleton( FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithoutSameNodeVersion.yml" ) ) - )) + ) Assert.That( DetectInconsistentVersionsInGitHubCIWorkflow fileInfo, @@ -424,7 +424,7 @@ let DetectInconsistentVersionsInGitHubCI1() = [] let DetectInconsistentVersionsInNugetRefsInFSharpScripts1() = let fileInfos = - (seq { + seq { FileInfo( Path.Combine( @@ -440,7 +440,7 @@ let DetectInconsistentVersionsInNugetRefsInFSharpScripts1() = ) ) - }) + } Assert.That( DetectInconsistentVersionsInNugetRefsInFSharpScripts fileInfos, @@ -478,12 +478,12 @@ let DetectInconsistentVersionsInFSharpScripts2() = [] let NonVerboseFlagsInGitHubCI1() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithNonVerboseFlag.yml" ) - )) + ) Assert.That(NonVerboseFlags fileInfo, Is.EqualTo true) @@ -491,12 +491,12 @@ let NonVerboseFlagsInGitHubCI1() = [] let NonVerboseFlagsInGitHubCI2() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithoutNonVerboseFlags.yml" ) - )) + ) Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false) @@ -504,12 +504,12 @@ let NonVerboseFlagsInGitHubCI2() = [] let NonVerboseFlagsInGitHubCI3() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithAcceptedNonVerboseFlag1.yml" ) - )) + ) Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false) @@ -517,12 +517,12 @@ let NonVerboseFlagsInGitHubCI3() = [] let NonVerboseFlagsInGitHubCI4() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyScriptWithNonVerboseFlag.fsx" ) - )) + ) Assert.That(NonVerboseFlags fileInfo, Is.EqualTo true) @@ -530,12 +530,12 @@ let NonVerboseFlagsInGitHubCI4() = [] let NonVerboseFlagsInGitHubCI5() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyScriptWithoutNonVerboseFlag.fsx" ) - )) + ) Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false) @@ -543,12 +543,12 @@ let NonVerboseFlagsInGitHubCI5() = [] let NonVerboseFlagsInGitHubCI6() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithAcceptedNonVerboseFlag2.yml" ) - )) + ) Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false) @@ -570,19 +570,324 @@ let IsExecutableTest1() = .UnwrapDefault() |> ignore - let fileInfo = (FileInfo filePath) + let fileInfo = FileInfo filePath Assert.That(IsExecutable fileInfo, Is.EqualTo true) [] let IsExecutableTest2() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( __SOURCE_DIRECTORY__, "DummyFiles", "DummyNotExecutable.fs" ) - )) + ) Assert.That(IsExecutable fileInfo, Is.EqualTo false) + + +[] +let DefiningEmptyStringsWithDoubleQuotes1() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyScriptWithConventionalEmptyString.fsx" + ) + ) + + Assert.That(DefiningEmptyStringsWithDoubleQuotes fileInfo, Is.EqualTo false) + + +[] +let DefiningEmptyStringsWithDoubleQuotes2() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyScriptWithNonConventionalEmptyString.fsx" + ) + ) + + Assert.That(DefiningEmptyStringsWithDoubleQuotes fileInfo, Is.EqualTo true) + + +[] +let DefiningEmptyStringsWithDoubleQuotes3() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyScriptWithEmptyString.fsx" + ) + ) + + Assert.That(DefiningEmptyStringsWithDoubleQuotes fileInfo, Is.EqualTo false) + + +[] +let DefiningEmptyStringsWithDoubleQuotes4() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyScriptWithMatchEmptyString.fsx" + ) + ) + + Assert.That(DefiningEmptyStringsWithDoubleQuotes fileInfo, Is.EqualTo false) + + +[] +let ProjFilesNamingConvention1() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyProjFileWithTheSameNameAsItsParentFolder", + "DummyProjFileWithTheSameNameAsItsParentFolder.fsproj" + ) + ) + + Assert.That(ProjFilesNamingConvention fileInfo, Is.EqualTo false) + + +[] +let ProjFilesNamingConvention2() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyProject", + "DummyProjFileWithoutTheSameNameAsItsParentFolder.fsproj" + ) + ) + + Assert.That(ProjFilesNamingConvention fileInfo, Is.EqualTo true) + + +[] +let NamespaceConvention1() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "src", + "Foo", + "DummyFileUnderFooWithRightNamespace.fs" + ) + ) + + Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo false) + + +[] +let NamespaceConvention2() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "src", + "Foo", + "DummyFileUnderFooWithWrongNamespace.fs" + ) + ) + + Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true) + + +[] +let NamespaceConvention3() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "src", + "Foo", + "Bar", + "DummyFileUnderBarWithRightNamespace.fs" + ) + ) + + Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo false) + + +[] +let NamespaceConvention4() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "src", + "Foo", + "Bar", + "DummyFileUnderBarWithWrongNamespace.fs" + ) + ) + + Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true) + + +[] +let NamespaceConvention5() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "src", + "Foo", + "Bar", + "DummyFileUnderBarWithWrongNamespace2.fs" + ) + ) + + Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true) + + +[] +let NamespaceConvention6() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "src", + "Foo", + "DummyFileUnderFooWithRightNamespace.cs" + ) + ) + + Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo false) + + +[] +let NamespaceConvention7() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "src", + "Foo", + "DummyFileUnderFooWithWrongNamespace2.fs" + ) + ) + + Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true) + + +[] +let NamespaceConvention8() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "src", + "Foo", + "DummyFileUnderFooWithoutNamespace.fs" + ) + ) + + Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo false) + + +[] +let ConsoleAppConvention1() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyProjectWithWrongConsole", + "DummyProjectWithWrongConsole.fsproj" + ) + ) + + Assert.That( + NotFollowingConsoleAppConvention fileInfo false, + Is.EqualTo true + ) + + +[] +let ConsoleAppConvention2() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyProjectWithRight.Console", + "DummyProjectWithRight.Console.fsproj" + ) + ) + + Assert.That( + NotFollowingConsoleAppConvention fileInfo false, + Is.EqualTo false + ) + + +[] +let ConsoleAppConvention3() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyConsoleProjectWithWrongName", + "DummyConsoleProjectWithWrongName.fsproj" + ) + ) + + Assert.That( + NotFollowingConsoleAppConvention fileInfo false, + Is.EqualTo true + ) + + +[] +let ConsoleAppConvention4() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyConsoleProjectWithRightName.Console", + "DummyConsoleProjectWithRightName.Console.fsproj" + ) + ) + + Assert.That( + NotFollowingConsoleAppConvention fileInfo false, + Is.EqualTo false + ) + + +[] +let ConsoleAppConvention5() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyProjectAsync", + "DummyProjectAsync.fsproj" + ) + ) + + Assert.That( + NotFollowingConsoleAppConvention fileInfo false, + Is.EqualTo true + ) + + +[] +let ConsoleAppConvention6() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyProjectAsync.Console", + "DummyProjectAsync.Console.fsproj" + ) + ) + + Assert.That( + NotFollowingConsoleAppConvention fileInfo false, + Is.EqualTo false + ) diff --git a/src/FileConventions.Test/FileConventions.Test.fsproj b/src/FileConventions.Test/FileConventions.Test.fsproj index 88064c27..2b470f8d 100644 --- a/src/FileConventions.Test/FileConventions.Test.fsproj +++ b/src/FileConventions.Test/FileConventions.Test.fsproj @@ -19,7 +19,7 @@ - + @@ -28,6 +28,8 @@ + + @@ -48,5 +50,13 @@ + + + + + + + + diff --git a/src/FileConventions/FileConventions.fsproj b/src/FileConventions/FileConventions.fsproj index 9c8c6d17..6ff11dcd 100644 --- a/src/FileConventions/FileConventions.fsproj +++ b/src/FileConventions/FileConventions.fsproj @@ -6,13 +6,14 @@ - - + + + diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index 6a5ea374..70358045 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -7,6 +7,12 @@ open System.Text.RegularExpressions open Mono open Mono.Unix.Native +open Fsdk + +let ymlAssertionError = "Bug: file should be a .yml file" +let projAssertionError = "Bug: file should be a proj file" +let sourceFileAssertionError = "Bug: file was not a F#/C# source file" +let fsxAssertionError = "Bug: file was not a F# script source file" let HasCorrectShebang(fileInfo: FileInfo) = let fileText = File.ReadLines fileInfo.FullName @@ -42,7 +48,7 @@ let MixedLineEndings(fileInfo: FileInfo) = numberOfLineEndings > 1 let DetectUnpinnedVersionsInGitHubCI(fileInfo: FileInfo) = - assert (fileInfo.FullName.EndsWith(".yml")) + Misc.BetterAssert (fileInfo.FullName.EndsWith ".yml") ymlAssertionError let fileText = File.ReadAllText fileInfo.FullName @@ -52,7 +58,7 @@ let DetectUnpinnedVersionsInGitHubCI(fileInfo: FileInfo) = latestTagInRunsOnRegex.IsMatch fileText let DetectUnpinnedDotnetToolInstallVersions(fileInfo: FileInfo) = - assert (fileInfo.FullName.EndsWith(".yml")) + Misc.BetterAssert (fileInfo.FullName.EndsWith ".yml") ymlAssertionError let fileLines = File.ReadLines fileInfo.FullName @@ -70,7 +76,7 @@ let DetectUnpinnedDotnetToolInstallVersions(fileInfo: FileInfo) = unpinnedDotnetToolInstallVersions let DetectAsteriskInPackageReferenceItems(fileInfo: FileInfo) = - assert (fileInfo.FullName.EndsWith "proj") + Misc.BetterAssert (fileInfo.FullName.EndsWith "proj") projAssertionError let fileText = File.ReadAllText fileInfo.FullName @@ -83,7 +89,7 @@ let DetectAsteriskInPackageReferenceItems(fileInfo: FileInfo) = asteriskInPackageReference.IsMatch fileText let DetectMissingVersionsInNugetPackageReferences(fileInfo: FileInfo) = - assert (fileInfo.FullName.EndsWith ".fsx") + Misc.BetterAssert (fileInfo.FullName.EndsWith ".fsx") fsxAssertionError let fileLines = File.ReadLines fileInfo.FullName @@ -284,7 +290,9 @@ let private DetectInconsistentVersions let DetectInconsistentVersionsInGitHubCIWorkflow(fileInfos: seq) = fileInfos - |> Seq.iter(fun fileInfo -> assert (fileInfo.FullName.EndsWith ".yml")) + |> Seq.iter(fun fileInfo -> + Misc.BetterAssert (fileInfo.FullName.EndsWith ".yml") ymlAssertionError + ) let inconsistentVersionsType1 = DetectInconsistentVersions @@ -310,7 +318,9 @@ let DetectInconsistentVersionsInNugetRefsInFSharpScripts (fileInfos: seq) = fileInfos - |> Seq.iter(fun fileInfo -> assert (fileInfo.FullName.EndsWith ".fsx")) + |> Seq.iter(fun fileInfo -> + Misc.BetterAssert (fileInfo.FullName.EndsWith ".fsx") fsxAssertionError + ) DetectInconsistentVersions fileInfos @@ -390,3 +400,133 @@ let NonVerboseFlags(fileInfo: FileInfo) = let IsExecutable(fileInfo: FileInfo) = let hasExecuteAccess = Syscall.access(fileInfo.FullName, AccessModes.X_OK) hasExecuteAccess = 0 + +let DefiningEmptyStringsWithDoubleQuotes(fileInfo: FileInfo) = + let fileText = File.ReadAllText fileInfo.FullName + + Regex("(? Path.GetFileName + + + fileName <> parentDirectoryName + +let DoesNamespaceInclude (fileInfo: FileInfo) (word: string) = + let fileText = File.ReadLines fileInfo.FullName + + if fileText.Any() then + let rightNamespace = + fileText |> Seq.tryFind(fun x -> x.Contains "namespace") + + match rightNamespace with + | Some fileNamespace -> + let words = + fileNamespace.Split(' ', StringSplitOptions.RemoveEmptyEntries) + + let namespaceCorrentPos = 1 + let namespaceWordsCount = 2 + + if words.Length < namespaceWordsCount then + false + else + let namespaceName = words[namespaceCorrentPos] + namespaceName.Equals(word) || namespaceName.Equals($"{word};") + | None -> + // It is possible that there is a fsharp file without namespace + if fileInfo.FullName.EndsWith ".fs" + || fileInfo.FullName.EndsWith ".fsx" then + true + else + false + else + false + +let NotFollowingNamespaceConvention(fileInfo: FileInfo) = + Misc.BetterAssert + (fileInfo.FullName.EndsWith ".fs" || fileInfo.FullName.EndsWith ".cs") + sourceFileAssertionError + + let parentDir = Path.GetDirectoryName fileInfo.FullName |> DirectoryInfo + + + if parentDir.Parent.Name = "src" then + DoesNamespaceInclude fileInfo parentDir.Name |> not + + elif parentDir.Parent.Parent.Name = "src" then + DoesNamespaceInclude + fileInfo + $"{parentDir.Parent.Name}.{parentDir.Name}" + |> not + + else + false + + +let ContainsConsoleMethods(fileInfo: FileInfo) = + let fileLines = File.ReadAllLines fileInfo.FullName |> Array.toList + + let rec checkLine(lines: list) = + match lines with + | [] -> false + | line :: tail -> + if + line.TrimStart().StartsWith("Console.Write") + || line.TrimStart().StartsWith("printf") + || line.TrimStart().Contains("Async.RunSynchronously") + then + true + else + checkLine tail + + checkLine fileLines + + +let ReturnAllProjectSourceFiles + (parentDir: DirectoryInfo) + (patterns: List) + (shouldFilter: bool) + = + + seq { + for pattern in patterns do + if shouldFilter then + yield Helpers.GetFiles parentDir pattern + else + yield + Directory.GetFiles( + parentDir.FullName, + pattern, + SearchOption.AllDirectories + ) + |> Seq.map(fun pathStr -> FileInfo pathStr) + + } + |> Seq.concat + + +let NotFollowingConsoleAppConvention (fileInfo: FileInfo) (shouldFilter: bool) = + Misc.BetterAssert (fileInfo.FullName.EndsWith "proj") projAssertionError + let fileText = File.ReadAllText fileInfo.FullName + let parentDir = Path.GetDirectoryName fileInfo.FullName + + if not(fileText.Contains "Exe") then + let sourceFiles = + ReturnAllProjectSourceFiles + (DirectoryInfo parentDir) + [ "*.cs"; "*.fs" ] + shouldFilter + + sourceFiles |> Seq.exists(fun value -> ContainsConsoleMethods value) + + else + // project name should ends with .Console + // we only check parent dir because + // we have ProjFilesNamingConvention rule to check project name + parentDir.EndsWith ".Console" |> not