diff --git a/scripts/checkCommits1by1.fsx b/scripts/checkCommits1by1.fsx index 5641260f0..4475d6304 100755 --- a/scripts/checkCommits1by1.fsx +++ b/scripts/checkCommits1by1.fsx @@ -10,7 +10,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 09fd0d5e9..6eff0616f 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 000000000..790a0dfad --- /dev/null +++ b/scripts/dotnetFileConventions.fsx @@ -0,0 +1,80 @@ +#!/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" +#r "nuget: YamlDotNet, Version=16.1.3" + +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 fee536187..fe5c5364e 100755 --- a/scripts/eofConvention.fsx +++ b/scripts/eofConvention.fsx @@ -5,6 +5,7 @@ open System #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" +#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 365552de0..c7e67d0eb 100755 --- a/scripts/executableConvention.fsx +++ b/scripts/executableConvention.fsx @@ -5,8 +5,9 @@ open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" -#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 let currentDir = Directory.GetCurrentDirectory() |> DirectoryInfo diff --git a/scripts/gitPush1by1.fsx b/scripts/gitPush1by1.fsx index c336cfc12..58ace0fd6 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/inconsistentNugetVersionsInDotNetProjects.fsx b/scripts/inconsistentNugetVersionsInDotNetProjects.fsx index 27e53a6fb..906b2c89e 100755 --- a/scripts/inconsistentNugetVersionsInDotNetProjects.fsx +++ b/scripts/inconsistentNugetVersionsInDotNetProjects.fsx @@ -6,7 +6,7 @@ open System.IO #r "System.Core.dll" #r "System.Xml.Linq.dll" -#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" open Fsdk diff --git a/scripts/inconsistentNugetVersionsInDotNetProjectsAndFSharpScripts.fsx b/scripts/inconsistentNugetVersionsInDotNetProjectsAndFSharpScripts.fsx index 55110affc..db22fa703 100755 --- a/scripts/inconsistentNugetVersionsInDotNetProjectsAndFSharpScripts.fsx +++ b/scripts/inconsistentNugetVersionsInDotNetProjectsAndFSharpScripts.fsx @@ -5,13 +5,13 @@ open System.IO #r "System.Core.dll" #r "System.Xml.Linq.dll" -#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62" +#r "nuget: Fsdk, Version=0.6.0--date20230821-0702.git-5488853" #r "nuget: Microsoft.Build, Version=16.11.0" #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" -#load "../src/FileConventions/Library.fs" #load "../src/FileConventions/Helpers.fs" +#load "../src/FileConventions/Library.fs" #load "../src/FileConventions/NugetVersionsCheck.fs" #load "../src/FileConventions/CombinedVersionCheck.fs" diff --git a/scripts/inconsistentNugetVersionsInFSharpScripts.fsx b/scripts/inconsistentNugetVersionsInFSharpScripts.fsx index 5458c12e7..8018b2f6d 100755 --- a/scripts/inconsistentNugetVersionsInFSharpScripts.fsx +++ b/scripts/inconsistentNugetVersionsInFSharpScripts.fsx @@ -5,9 +5,10 @@ open System.Linq #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" +#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 84098ba9f..d0a930a5b 100755 --- a/scripts/inconsistentVersionsInGitHubCI.fsx +++ b/scripts/inconsistentVersionsInGitHubCI.fsx @@ -4,9 +4,10 @@ open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" +#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 208b0dca3..cf122dd7b 100755 --- a/scripts/mixedLineEndings.fsx +++ b/scripts/mixedLineEndings.fsx @@ -5,9 +5,10 @@ open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" +#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 f89eb79d8..f2f891680 100755 --- a/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx +++ b/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx @@ -5,9 +5,10 @@ open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" +#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 ceb39ddff..792c9a6b1 100755 --- a/scripts/shebangConvention.fsx +++ b/scripts/shebangConvention.fsx @@ -5,9 +5,10 @@ open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" +#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 304a66dbe..ec6234839 100755 --- a/scripts/unpinnedDotnetToolInstallVersions.fsx +++ b/scripts/unpinnedDotnetToolInstallVersions.fsx @@ -5,9 +5,10 @@ open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" +#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 1b30c0a59..d59aabcde 100755 --- a/scripts/unpinnedGitHubActionsImageVersions.fsx +++ b/scripts/unpinnedGitHubActionsImageVersions.fsx @@ -5,9 +5,10 @@ open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" +#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/unpinnedNugetPackageReferenceVersionsInFSharpScripts.fsx b/scripts/unpinnedNugetPackageReferenceVersionsInFSharpScripts.fsx index d48fc1e29..2649b80f2 100755 --- a/scripts/unpinnedNugetPackageReferenceVersionsInFSharpScripts.fsx +++ b/scripts/unpinnedNugetPackageReferenceVersionsInFSharpScripts.fsx @@ -5,9 +5,10 @@ open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" +#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/unpinnedNugetPackageReferenceVersionsInProjects.fsx b/scripts/unpinnedNugetPackageReferenceVersionsInProjects.fsx index 7d3a73f05..b8a34ac54 100755 --- a/scripts/unpinnedNugetPackageReferenceVersionsInProjects.fsx +++ b/scripts/unpinnedNugetPackageReferenceVersionsInProjects.fsx @@ -5,9 +5,10 @@ open System.IO #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" +#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/wrapLatestCommitMsg.fsx b/scripts/wrapLatestCommitMsg.fsx index 8e7f65044..e1aaf4f7b 100755 --- a/scripts/wrapLatestCommitMsg.fsx +++ b/scripts/wrapLatestCommitMsg.fsx @@ -7,11 +7,11 @@ open System.Linq #r "nuget: Mono.Unix, Version=7.1.0-final.1.21458.1" #r "nuget: YamlDotNet, Version=16.1.3" +#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 000000000..299cf40e1 --- /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 000000000..543f77ad4 --- /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 000000000..299cf40e1 --- /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 000000000..543f77ad4 --- /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 000000000..e69de29bb diff --git a/src/FileConventions.Test/DummyFiles/DummyProject/DummyProjFileWithoutTheSameNameAsItsParentFolder.fsproj b/src/FileConventions.Test/DummyFiles/DummyProject/DummyProjFileWithoutTheSameNameAsItsParentFolder.fsproj new file mode 100644 index 000000000..e69de29bb 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 000000000..299cf40e1 --- /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 000000000..6cceb79df --- /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 000000000..9263cfd62 --- /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 000000000..bf14df5fd --- /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 000000000..299cf40e1 --- /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 000000000..543f77ad4 --- /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 000000000..9263cfd62 --- /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 000000000..78fab96d2 --- /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 000000000..cc2a7e4ae --- /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 000000000..1ae049d82 --- /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 000000000..f8911d757 --- /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 000000000..126e0616a --- /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 000000000..7de30ff25 --- /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 000000000..b1a3e5451 --- /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 000000000..0dda3513d --- /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 000000000..2f2bebd34 --- /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 000000000..a36e204fc --- /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 000000000..9704ca2b7 --- /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 000000000..d631c774a --- /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 000000000..4c7362423 --- /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 81d82bc68..f600f736f 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, @@ -444,7 +444,7 @@ let DetectInconsistentVersionsInGitHubCI3() = [] let DetectInconsistentVersionsInNugetRefsInFSharpScripts1() = let fileInfos = - (seq { + seq { FileInfo( Path.Combine( @@ -460,7 +460,7 @@ let DetectInconsistentVersionsInNugetRefsInFSharpScripts1() = ) ) - }) + } Assert.That( DetectInconsistentVersionsInNugetRefsInFSharpScripts fileInfos, @@ -531,12 +531,12 @@ let DetectInconsistentVersionsInFSharpScriptsAndProjects() = [] let NonVerboseFlagsInGitHubCI1() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithNonVerboseFlag.yml" ) - )) + ) Assert.That(NonVerboseFlags fileInfo, Is.EqualTo true) @@ -544,12 +544,12 @@ let NonVerboseFlagsInGitHubCI1() = [] let NonVerboseFlagsInGitHubCI2() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithoutNonVerboseFlags.yml" ) - )) + ) Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false) @@ -557,12 +557,12 @@ let NonVerboseFlagsInGitHubCI2() = [] let NonVerboseFlagsInGitHubCI3() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithAcceptedNonVerboseFlag1.yml" ) - )) + ) Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false) @@ -570,12 +570,12 @@ let NonVerboseFlagsInGitHubCI3() = [] let NonVerboseFlagsInGitHubCI4() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyScriptWithNonVerboseFlag.fsx" ) - )) + ) Assert.That(NonVerboseFlags fileInfo, Is.EqualTo true) @@ -583,12 +583,12 @@ let NonVerboseFlagsInGitHubCI4() = [] let NonVerboseFlagsInGitHubCI5() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyScriptWithoutNonVerboseFlag.fsx" ) - )) + ) Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false) @@ -596,12 +596,12 @@ let NonVerboseFlagsInGitHubCI5() = [] let NonVerboseFlagsInGitHubCI6() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyCIWithAcceptedNonVerboseFlag2.yml" ) - )) + ) Assert.That(NonVerboseFlags fileInfo, Is.EqualTo false) @@ -623,19 +623,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 88064c279..2b470f8d2 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 9cfc3dac0..310346549 100644 --- a/src/FileConventions/FileConventions.fsproj +++ b/src/FileConventions/FileConventions.fsproj @@ -17,6 +17,7 @@ + diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index e471f54cd..c28d370dd 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -8,6 +8,7 @@ open System.Text.RegularExpressions open Mono open Mono.Unix.Native open YamlDotNet.RepresentationModel +open Fsdk let SplitByEOLs (text: string) (numberOfEOLs: uint) = if numberOfEOLs = 0u then @@ -28,6 +29,10 @@ let SplitByEOLs (text: string) (numberOfEOLs: uint) = preparedText.Split(separator, StringSplitOptions.None) +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 @@ -63,7 +68,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 @@ -73,7 +78,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 @@ -91,7 +96,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 @@ -104,7 +109,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 @@ -366,7 +371,9 @@ let private DetectInconsistentVersionsInYamlFiles 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 extractVersions(node: YamlNode) = match node with @@ -412,7 +419,9 @@ let DetectInconsistentVersionsInGitHubCI(dir: DirectoryInfo) = let GetVersionsMapForNugetRefsInFSharpScripts(fileInfos: seq) = fileInfos - |> Seq.iter(fun fileInfo -> assert (fileInfo.FullName.EndsWith ".fsx")) + |> Seq.iter(fun fileInfo -> + Misc.BetterAssert (fileInfo.FullName.EndsWith ".fsx") fsxAssertionError + ) let versionRegexPattern = "#r \"nuget:\\s*([^\\s]*)\\s*,\\s*Version\\s*=\\s*([^\\s]*)\\s*\"" @@ -495,3 +504,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