From 50fe215c80506ceacc57cb5a4ca3f266aba74d36 Mon Sep 17 00:00:00 2001 From: realmarv Date: Tue, 1 Aug 2023 17:22:52 +0330 Subject: [PATCH 01/29] FileConventions: add failing test Add tests for DefiningEmptyStringsWithDoubleQuotes function. --- ...DummyScriptWithConventionalEmptyString.fsx | 6 +++++ ...myScriptWithNonConventionalEmptyString.fsx | 6 +++++ .../FileConventions.Test.fs | 26 +++++++++++++++++++ src/FileConventions/Library.fs | 4 +++ 4 files changed, 42 insertions(+) create mode 100644 src/FileConventions.Test/DummyFiles/DummyScriptWithConventionalEmptyString.fsx create mode 100644 src/FileConventions.Test/DummyFiles/DummyScriptWithNonConventionalEmptyString.fsx 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/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/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index e32fe7a42..0935c1616 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -586,3 +586,29 @@ let IsExecutableTest2() = )) 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) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index 6a5ea3748..eb5a45bb5 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -390,3 +390,7 @@ let NonVerboseFlags(fileInfo: FileInfo) = let IsExecutable(fileInfo: FileInfo) = let hasExecuteAccess = Syscall.access(fileInfo.FullName, AccessModes.X_OK) hasExecuteAccess = 0 + +let DefiningEmptyStringsWithDoubleQuotes(fileInfo: FileInfo) = + printfn "File Path: %s" fileInfo.FullName + false From 186213e767265114901c1887db085ee63063ba32 Mon Sep 17 00:00:00 2001 From: realmarv Date: Tue, 1 Aug 2023 17:29:46 +0330 Subject: [PATCH 02/29] FileConventions: implement the function Implement DefiningEmptyStringsWithDoubleQuotes function. --- src/FileConventions/Library.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index eb5a45bb5..be01a6c91 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -392,5 +392,5 @@ let IsExecutable(fileInfo: FileInfo) = hasExecuteAccess = 0 let DefiningEmptyStringsWithDoubleQuotes(fileInfo: FileInfo) = - printfn "File Path: %s" fileInfo.FullName - false + let fileText = File.ReadAllText fileInfo.FullName + fileText.Contains "\"\"" From 2ebd2b5746118bb7c496369feb2df17064569a1a Mon Sep 17 00:00:00 2001 From: realmarv Date: Tue, 1 Aug 2023 17:44:17 +0330 Subject: [PATCH 03/29] FileConventions: add failing test Add tests for ProjFilesNamingConvention function. --- ...ileWithTheSameNameAsItsParentFolder.fsproj | 0 ...WithoutTheSameNameAsItsParentFolder.fsproj | 0 .../FileConventions.Test.fs | 28 +++++++++++++++++++ src/FileConventions/Library.fs | 4 +++ 4 files changed, 32 insertions(+) create mode 100644 src/FileConventions.Test/DummyFiles/DummyProjFileWithTheSameNameAsItsParentFolder/DummyProjFileWithTheSameNameAsItsParentFolder.fsproj create mode 100644 src/FileConventions.Test/DummyFiles/DummyProject/DummyProjFileWithoutTheSameNameAsItsParentFolder.fsproj 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/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index 0935c1616..db10ac3b8 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -612,3 +612,31 @@ let DefiningEmptyStringsWithDoubleQuotes2() = )) Assert.That(DefiningEmptyStringsWithDoubleQuotes fileInfo, Is.EqualTo true) + + +[] +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) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index be01a6c91..bd11f27c0 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -394,3 +394,7 @@ let IsExecutable(fileInfo: FileInfo) = let DefiningEmptyStringsWithDoubleQuotes(fileInfo: FileInfo) = let fileText = File.ReadAllText fileInfo.FullName fileText.Contains "\"\"" + +let ProjFilesNamingConvention(fileInfo: FileInfo) = + printfn "%s" fileInfo.FullName + false From cc82850f5a2cbe114fb7148cbb76919210be7dc1 Mon Sep 17 00:00:00 2001 From: realmarv Date: Thu, 3 Aug 2023 16:32:32 +0330 Subject: [PATCH 04/29] FileConventions: implement the function Implement ProjFilesNamingConvention function. --- src/FileConventions/Library.fs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index bd11f27c0..37653fae2 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -396,5 +396,16 @@ let DefiningEmptyStringsWithDoubleQuotes(fileInfo: FileInfo) = fileText.Contains "\"\"" let ProjFilesNamingConvention(fileInfo: FileInfo) = - printfn "%s" fileInfo.FullName - false + let regex = new Regex("(.*)\..*proj$") + assert (regex.IsMatch fileInfo.FullName) + let fileName = Path.GetFileNameWithoutExtension fileInfo.FullName + + let parentDirectoryName = + Path.GetDirectoryName fileInfo.FullName |> Path.GetFileName + + printfn + "File name: %s, Parent directory name: %s" + fileName + parentDirectoryName + + fileName <> parentDirectoryName From a0272d64e45b814c7fd1774d1e9a79c7f2833c6c Mon Sep 17 00:00:00 2001 From: realmarv Date: Mon, 7 Aug 2023 15:48:49 +0330 Subject: [PATCH 05/29] FileConventions: add failing test Add tests for NotFollowingNamespaceConvention function. --- .../DummyFileUnderFooWithRightNamespace.fs | 1 + .../DummyFileUnderFooWithWrongNamespace.fs | 1 + .../FileConventions.Test.fs | 30 +++++++++++++++++++ src/FileConventions/Library.fs | 4 +++ 4 files changed, 36 insertions(+) create mode 100644 src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.fs create mode 100644 src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace.fs 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/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index db10ac3b8..c9c6949c4 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -640,3 +640,33 @@ let ProjFilesNamingConvention2() = )) 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) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index 37653fae2..f979582cc 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -409,3 +409,7 @@ let ProjFilesNamingConvention(fileInfo: FileInfo) = parentDirectoryName fileName <> parentDirectoryName + +let NotFollowingNamespaceConvention(fileInfo: FileInfo) = + printfn "%s" fileInfo.FullName + false From 482d4d6e96d963fb0171354d4169b8faf03a7f7c Mon Sep 17 00:00:00 2001 From: realmarv Date: Mon, 7 Aug 2023 16:15:56 +0330 Subject: [PATCH 06/29] FileConventions: implement the function Implement NotFollowingNamespaceConvention function. --- src/FileConventions/Library.fs | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index f979582cc..2aad90b4a 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -411,5 +411,31 @@ let ProjFilesNamingConvention(fileInfo: FileInfo) = fileName <> parentDirectoryName let NotFollowingNamespaceConvention(fileInfo: FileInfo) = - printfn "%s" fileInfo.FullName - false + assert (fileInfo.FullName.EndsWith(".fs")) + + let fileName = Path.GetFileNameWithoutExtension fileInfo.FullName + + let parentDirectoryName = + Path.GetDirectoryName fileInfo.FullName |> Path.GetFileName + + printfn + "File name: %s, Parent directory name: %s" + fileName + parentDirectoryName + + if parentDirectoryName <> "src" + && fileInfo.FullName.Contains + $"{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}" then + let fileText = File.ReadLines fileInfo.FullName + + if fileText.Any() then + let firstLine = fileText.First() + + if firstLine.Contains "namespace" then + firstLine.Contains parentDirectoryName |> not + else + false + else + false + else + false From 5f06394ed1be2c3b455ead6798333175fcbf4a2b Mon Sep 17 00:00:00 2001 From: realmarv Date: Mon, 7 Aug 2023 16:45:40 +0330 Subject: [PATCH 07/29] FileConventions.Test: add failing test Add more tests for NotFollowingNamespaceConvention fn. --- .../DummyFileUnderBarWithRightNamespace.fs | 1 + .../DummyFileUnderBarWithWrongNamespace.fs | 1 + .../DummyFileUnderBarWithWrongNamespace2.fs | 1 + .../FileConventions.Test.fs | 48 +++++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithRightNamespace.fs create mode 100644 src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace.fs create mode 100644 src/FileConventions.Test/DummyFiles/src/Foo/Bar/DummyFileUnderBarWithWrongNamespace2.fs 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/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index c9c6949c4..835953718 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -670,3 +670,51 @@ let NamespaceConvention2() = )) 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) From 12f4d0b69b008d46477fb376edb2fc7427664957 Mon Sep 17 00:00:00 2001 From: realmarv Date: Mon, 7 Aug 2023 17:11:53 +0330 Subject: [PATCH 08/29] FileConventions: fix the function Fix NotFollowingNamespaceConvention function. --- src/FileConventions/Library.fs | 41 ++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index 2aad90b4a..04e30554d 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -410,32 +410,35 @@ let ProjFilesNamingConvention(fileInfo: FileInfo) = fileName <> parentDirectoryName +let DoesNamespaceInclude (fileInfo: FileInfo) (word: string) = + let fileText = File.ReadLines fileInfo.FullName + + if fileText.Any() then + let firstLine = fileText.First() + + if firstLine.Contains "namespace" then + firstLine.Contains word + else + false + else + false + let NotFollowingNamespaceConvention(fileInfo: FileInfo) = assert (fileInfo.FullName.EndsWith(".fs")) let fileName = Path.GetFileNameWithoutExtension fileInfo.FullName + let parentDir = Path.GetDirectoryName fileInfo.FullName |> DirectoryInfo - let parentDirectoryName = - Path.GetDirectoryName fileInfo.FullName |> Path.GetFileName - - printfn - "File name: %s, Parent directory name: %s" - fileName - parentDirectoryName + printfn "File name: %s, Parent directory name: %s" fileName parentDir.Name - if parentDirectoryName <> "src" - && fileInfo.FullName.Contains - $"{Path.DirectorySeparatorChar}src{Path.DirectorySeparatorChar}" then - let fileText = File.ReadLines fileInfo.FullName + if parentDir.Parent.Name = "src" then + DoesNamespaceInclude fileInfo parentDir.Name |> not - if fileText.Any() then - let firstLine = fileText.First() + elif parentDir.Parent.Parent.Name = "src" then + DoesNamespaceInclude + fileInfo + $"{parentDir.Parent.Name}.{parentDir.Name}" + |> not - if firstLine.Contains "namespace" then - firstLine.Contains parentDirectoryName |> not - else - false - else - false else false From b0acb0c42c57bcd2a1d8ff68a57c17c90c58d2cd Mon Sep 17 00:00:00 2001 From: Mersho Date: Thu, 17 Aug 2023 12:59:28 +0330 Subject: [PATCH 09/29] FileConventions: add failing test Add one more test for NotFollowingNamespaceConvention function. --- .../Foo/DummyFileUnderFooWithRightNamespace.cs | 3 +++ src/FileConventions.Test/FileConventions.Test.fs | 15 +++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithRightNamespace.cs 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/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index 835953718..22dbc43e2 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -718,3 +718,18 @@ let NamespaceConvention5() = )) 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) From 7823ab2edc92b08e65b8a85c11331acd5f9e7a0b Mon Sep 17 00:00:00 2001 From: Mersho Date: Thu, 17 Aug 2023 14:32:41 +0330 Subject: [PATCH 10/29] FileConventions: fix csharp namespace Function DoesNamespaceInclude doesn't working on *.cs namespace. --- src/FileConventions/Library.fs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index 04e30554d..c48b36cb1 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -414,17 +414,17 @@ let DoesNamespaceInclude (fileInfo: FileInfo) (word: string) = let fileText = File.ReadLines fileInfo.FullName if fileText.Any() then - let firstLine = fileText.First() + let rightNamespace = + fileText + |> Seq.tryFind(fun x -> x.Contains "namespace" && x.Contains word) - if firstLine.Contains "namespace" then - firstLine.Contains word - else - false + rightNamespace <> None else false let NotFollowingNamespaceConvention(fileInfo: FileInfo) = - assert (fileInfo.FullName.EndsWith(".fs")) + assert + (fileInfo.FullName.EndsWith(".fs") || fileInfo.FullName.EndsWith(".cs")) let fileName = Path.GetFileNameWithoutExtension fileInfo.FullName let parentDir = Path.GetDirectoryName fileInfo.FullName |> DirectoryInfo From 9b8afb32dadb171d40fc30ecffec78bb6b4611eb Mon Sep 17 00:00:00 2001 From: Mersho Date: Thu, 17 Aug 2023 15:09:28 +0330 Subject: [PATCH 11/29] FileConventions: add failing test --- .../Foo/DummyFileUnderFooWithWrongNamespace2.fs | 1 + src/FileConventions.Test/FileConventions.Test.fs | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithWrongNamespace2.fs 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/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index 22dbc43e2..21ad18b12 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -733,3 +733,18 @@ let NamespaceConvention6() = )) 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) From 21f3749425e5e6be1c4193dfcfe43dab7b8f7bf4 Mon Sep 17 00:00:00 2001 From: Mersho Date: Thu, 17 Aug 2023 16:27:53 +0330 Subject: [PATCH 12/29] FileConventions: `Contains()` is not suitable here --- src/FileConventions/Library.fs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index c48b36cb1..efa1ae90d 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -415,10 +415,10 @@ let DoesNamespaceInclude (fileInfo: FileInfo) (word: string) = if fileText.Any() then let rightNamespace = - fileText - |> Seq.tryFind(fun x -> x.Contains "namespace" && x.Contains word) + fileText |> Seq.find(fun x -> x.Contains "namespace") - rightNamespace <> None + rightNamespace.Split().[1].Equals(word) + || rightNamespace.Split().[1].Equals(word + ";") else false From 81bfb573b8476e5e95925848927605a7947531d2 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Mon, 21 Aug 2023 13:53:55 +0330 Subject: [PATCH 13/29] FileConventions: use BetterAssert() & update Fsdk We updated fsdk to the latest version becuase the old version of fsdk does not have `Misc.BetterAssert` and we use `Misc.BetterAssert()` becuase assert is for debug mode. --- scripts/checkCommits1by1.fsx | 2 +- scripts/compileFSharpScripts.fsx | 2 +- scripts/eofConvention.fsx | 1 + scripts/executableConvention.fsx | 1 + scripts/gitPush1by1.fsx | 2 +- .../inconsistentVersionsInFSharpScripts.fsx | 1 + scripts/inconsistentVersionsInGitHubCI.fsx | 1 + scripts/mixedLineEndings.fsx | 1 + .../nonVerboseFlagsInGitHubCIAndScripts.fsx | 1 + scripts/shebangConvention.fsx | 1 + scripts/unpinnedDotnetPackageVersions.fsx | 1 + scripts/unpinnedDotnetToolInstallVersions.fsx | 1 + .../unpinnedGitHubActionsImageVersions.fsx | 1 + .../unpinnedNugetPackageReferenceVersions.fsx | 1 + scripts/wrapLatestCommitMsg.fsx | 3 +- .../FileConventions.Test.fsproj | 2 +- src/FileConventions/FileConventions.fsproj | 1 + src/FileConventions/Library.fs | 28 +++++++++++++------ 18 files changed, 36 insertions(+), 15 deletions(-) diff --git a/scripts/checkCommits1by1.fsx b/scripts/checkCommits1by1.fsx index f15feb452..8b102fdde 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 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/eofConvention.fsx b/scripts/eofConvention.fsx index 3f2b712b9..d01257a5b 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 cecaf6b5b..4368008d6 100755 --- a/scripts/executableConvention.fsx +++ b/scripts/executableConvention.fsx @@ -4,6 +4,7 @@ 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" 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/inconsistentVersionsInFSharpScripts.fsx b/scripts/inconsistentVersionsInFSharpScripts.fsx index 93922496e..4b521b4d8 100755 --- a/scripts/inconsistentVersionsInFSharpScripts.fsx +++ b/scripts/inconsistentVersionsInFSharpScripts.fsx @@ -4,6 +4,7 @@ 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" diff --git a/scripts/inconsistentVersionsInGitHubCI.fsx b/scripts/inconsistentVersionsInGitHubCI.fsx index f8041a45d..d015724eb 100755 --- a/scripts/inconsistentVersionsInGitHubCI.fsx +++ b/scripts/inconsistentVersionsInGitHubCI.fsx @@ -3,6 +3,7 @@ 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" diff --git a/scripts/mixedLineEndings.fsx b/scripts/mixedLineEndings.fsx index 427826a61..8b73ed3c2 100755 --- a/scripts/mixedLineEndings.fsx +++ b/scripts/mixedLineEndings.fsx @@ -4,6 +4,7 @@ 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" diff --git a/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx b/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx index 54bd123d5..16d032180 100755 --- a/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx +++ b/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx @@ -4,6 +4,7 @@ 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" diff --git a/scripts/shebangConvention.fsx b/scripts/shebangConvention.fsx index 965a9aad3..0ccdc14db 100755 --- a/scripts/shebangConvention.fsx +++ b/scripts/shebangConvention.fsx @@ -4,6 +4,7 @@ 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" diff --git a/scripts/unpinnedDotnetPackageVersions.fsx b/scripts/unpinnedDotnetPackageVersions.fsx index 56da33c01..55b6178b7 100755 --- a/scripts/unpinnedDotnetPackageVersions.fsx +++ b/scripts/unpinnedDotnetPackageVersions.fsx @@ -4,6 +4,7 @@ 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" diff --git a/scripts/unpinnedDotnetToolInstallVersions.fsx b/scripts/unpinnedDotnetToolInstallVersions.fsx index 92f35dcc6..b16297ae3 100755 --- a/scripts/unpinnedDotnetToolInstallVersions.fsx +++ b/scripts/unpinnedDotnetToolInstallVersions.fsx @@ -4,6 +4,7 @@ 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" diff --git a/scripts/unpinnedGitHubActionsImageVersions.fsx b/scripts/unpinnedGitHubActionsImageVersions.fsx index 07d31cc97..191e2bc8f 100755 --- a/scripts/unpinnedGitHubActionsImageVersions.fsx +++ b/scripts/unpinnedGitHubActionsImageVersions.fsx @@ -4,6 +4,7 @@ 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" diff --git a/scripts/unpinnedNugetPackageReferenceVersions.fsx b/scripts/unpinnedNugetPackageReferenceVersions.fsx index 72e0e74b5..74a788a13 100755 --- a/scripts/unpinnedNugetPackageReferenceVersions.fsx +++ b/scripts/unpinnedNugetPackageReferenceVersions.fsx @@ -4,6 +4,7 @@ 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" diff --git a/scripts/wrapLatestCommitMsg.fsx b/scripts/wrapLatestCommitMsg.fsx index 64f757eb1..92b2be69c 100755 --- a/scripts/wrapLatestCommitMsg.fsx +++ b/scripts/wrapLatestCommitMsg.fsx @@ -5,11 +5,10 @@ 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/Library.fs" -#r "nuget: Fsdk, Version=0.6.0--date20230214-0422.git-1ea6f62" - open Fsdk open Fsdk.Process diff --git a/src/FileConventions.Test/FileConventions.Test.fsproj b/src/FileConventions.Test/FileConventions.Test.fsproj index 88064c279..943038631 100644 --- a/src/FileConventions.Test/FileConventions.Test.fsproj +++ b/src/FileConventions.Test/FileConventions.Test.fsproj @@ -19,7 +19,7 @@ - + diff --git a/src/FileConventions/FileConventions.fsproj b/src/FileConventions/FileConventions.fsproj index 9c8c6d177..8de07efed 100644 --- a/src/FileConventions/FileConventions.fsproj +++ b/src/FileConventions/FileConventions.fsproj @@ -13,6 +13,7 @@ + diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index efa1ae90d..39c48af8f 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -7,6 +7,11 @@ 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 fsxAssertionError = "Bug: file was not a F#/C# source file" let HasCorrectShebang(fileInfo: FileInfo) = let fileText = File.ReadLines fileInfo.FullName @@ -42,7 +47,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 +57,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 +75,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 +88,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 +289,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 +317,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 @@ -397,7 +406,7 @@ let DefiningEmptyStringsWithDoubleQuotes(fileInfo: FileInfo) = let ProjFilesNamingConvention(fileInfo: FileInfo) = let regex = new Regex("(.*)\..*proj$") - assert (regex.IsMatch fileInfo.FullName) + Misc.BetterAssert (regex.IsMatch fileInfo.FullName) projAssertionError let fileName = Path.GetFileNameWithoutExtension fileInfo.FullName let parentDirectoryName = @@ -423,8 +432,9 @@ let DoesNamespaceInclude (fileInfo: FileInfo) (word: string) = false let NotFollowingNamespaceConvention(fileInfo: FileInfo) = - assert - (fileInfo.FullName.EndsWith(".fs") || fileInfo.FullName.EndsWith(".cs")) + Misc.BetterAssert + (fileInfo.FullName.EndsWith ".fs" || fileInfo.FullName.EndsWith ".cs") + fsxAssertionError let fileName = Path.GetFileNameWithoutExtension fileInfo.FullName let parentDir = Path.GetDirectoryName fileInfo.FullName |> DirectoryInfo From e124a919d0e833c5b3d82eb82f6b833311b9c110 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Mon, 21 Aug 2023 14:10:01 +0330 Subject: [PATCH 14/29] FileConventions(.Test): applying f# standard style Using RemoveEmptyEntries for split & removing extra parans & Regex does not require a new keyword & string formatting has been corrected. --- .../FileConventions.Test.fs | 182 +++++++++--------- src/FileConventions/Library.fs | 15 +- 2 files changed, 103 insertions(+), 94 deletions(-) diff --git a/src/FileConventions.Test/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index 21ad18b12..cd8b41bf9 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,20 +570,20 @@ 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) @@ -591,12 +591,12 @@ let IsExecutableTest2() = [] let DefiningEmptyStringsWithDoubleQuotes1() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyScriptWithConventionalEmptyString.fsx" ) - )) + ) Assert.That(DefiningEmptyStringsWithDoubleQuotes fileInfo, Is.EqualTo false) @@ -604,12 +604,12 @@ let DefiningEmptyStringsWithDoubleQuotes1() = [] let DefiningEmptyStringsWithDoubleQuotes2() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyScriptWithNonConventionalEmptyString.fsx" ) - )) + ) Assert.That(DefiningEmptyStringsWithDoubleQuotes fileInfo, Is.EqualTo true) @@ -617,13 +617,13 @@ let DefiningEmptyStringsWithDoubleQuotes2() = [] let ProjFilesNamingConvention1() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyProjFileWithTheSameNameAsItsParentFolder", "DummyProjFileWithTheSameNameAsItsParentFolder.fsproj" ) - )) + ) Assert.That(ProjFilesNamingConvention fileInfo, Is.EqualTo false) @@ -631,13 +631,13 @@ let ProjFilesNamingConvention1() = [] let ProjFilesNamingConvention2() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "DummyProject", "DummyProjFileWithoutTheSameNameAsItsParentFolder.fsproj" ) - )) + ) Assert.That(ProjFilesNamingConvention fileInfo, Is.EqualTo true) @@ -645,14 +645,14 @@ let ProjFilesNamingConvention2() = [] let NamespaceConvention1() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "src", "Foo", "DummyFileUnderFooWithRightNamespace.fs" ) - )) + ) Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo false) @@ -660,14 +660,14 @@ let NamespaceConvention1() = [] let NamespaceConvention2() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "src", "Foo", "DummyFileUnderFooWithWrongNamespace.fs" ) - )) + ) Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true) @@ -675,7 +675,7 @@ let NamespaceConvention2() = [] let NamespaceConvention3() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "src", @@ -683,7 +683,7 @@ let NamespaceConvention3() = "Bar", "DummyFileUnderBarWithRightNamespace.fs" ) - )) + ) Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo false) @@ -691,7 +691,7 @@ let NamespaceConvention3() = [] let NamespaceConvention4() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "src", @@ -699,7 +699,7 @@ let NamespaceConvention4() = "Bar", "DummyFileUnderBarWithWrongNamespace.fs" ) - )) + ) Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true) @@ -707,7 +707,7 @@ let NamespaceConvention4() = [] let NamespaceConvention5() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "src", @@ -715,7 +715,7 @@ let NamespaceConvention5() = "Bar", "DummyFileUnderBarWithWrongNamespace2.fs" ) - )) + ) Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true) @@ -723,14 +723,14 @@ let NamespaceConvention5() = [] let NamespaceConvention6() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "src", "Foo", "DummyFileUnderFooWithRightNamespace.cs" ) - )) + ) Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo false) @@ -738,13 +738,13 @@ let NamespaceConvention6() = [] let NamespaceConvention7() = let fileInfo = - (FileInfo( + FileInfo( Path.Combine( dummyFilesDirectory.FullName, "src", "Foo", "DummyFileUnderFooWithWrongNamespace2.fs" ) - )) + ) Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index 39c48af8f..888edc294 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -405,7 +405,7 @@ let DefiningEmptyStringsWithDoubleQuotes(fileInfo: FileInfo) = fileText.Contains "\"\"" let ProjFilesNamingConvention(fileInfo: FileInfo) = - let regex = new Regex("(.*)\..*proj$") + let regex = Regex "(.*)\..*proj$" Misc.BetterAssert (regex.IsMatch fileInfo.FullName) projAssertionError let fileName = Path.GetFileNameWithoutExtension fileInfo.FullName @@ -426,8 +426,17 @@ let DoesNamespaceInclude (fileInfo: FileInfo) (word: string) = let rightNamespace = fileText |> Seq.find(fun x -> x.Contains "namespace") - rightNamespace.Split().[1].Equals(word) - || rightNamespace.Split().[1].Equals(word + ";") + let words = + rightNamespace.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};") else false From eb5f76c18c484e01a176975fad109176d8b445e7 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Mon, 21 Aug 2023 15:53:00 +0330 Subject: [PATCH 15/29] FileConventions: add failing test Add tests for NotFollowingConsoleAppConvention() function. --- .../DummyProjectWithRightConsole.fsproj | 12 +++++++++ .../DummyProjectWithRightConsole/Program.fs | 1 + .../DummyProjectWithWrongConsole.fsproj | 12 +++++++++ .../DummyProjectWithWrongConsole/Library.fs | 6 +++++ .../FileConventions.Test.fs | 27 +++++++++++++++++++ .../FileConventions.Test.fsproj | 4 +++ src/FileConventions/Library.fs | 5 ++++ 7 files changed, 67 insertions(+) create mode 100644 src/FileConventions.Test/DummyFiles/DummyProjectWithRightConsole/DummyProjectWithRightConsole.fsproj create mode 100644 src/FileConventions.Test/DummyFiles/DummyProjectWithRightConsole/Program.fs create mode 100644 src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/DummyProjectWithWrongConsole.fsproj create mode 100644 src/FileConventions.Test/DummyFiles/DummyProjectWithWrongConsole/Library.fs diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectWithRightConsole/DummyProjectWithRightConsole.fsproj b/src/FileConventions.Test/DummyFiles/DummyProjectWithRightConsole/DummyProjectWithRightConsole.fsproj new file mode 100644 index 000000000..299cf40e1 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyProjectWithRightConsole/DummyProjectWithRightConsole.fsproj @@ -0,0 +1,12 @@ + + + + Exe + net7.0 + + + + + + + diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectWithRightConsole/Program.fs b/src/FileConventions.Test/DummyFiles/DummyProjectWithRightConsole/Program.fs new file mode 100644 index 000000000..543f77ad4 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyProjectWithRightConsole/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/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index cd8b41bf9..bcbfc5b6c 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -748,3 +748,30 @@ let NamespaceConvention7() = ) Assert.That(NotFollowingNamespaceConvention fileInfo, Is.EqualTo true) + +[] +let ConsoleAppConvention1() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyProjectWithWrongConsole", + "DummyProjectWithWrongConsole.fsproj" + ) + ) + + Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo true) + + +[] +let ConsoleAppConvention2() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyProjectWithRightConsole", + "DummyProjectWithRightConsole.fsproj" + ) + ) + + Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo false) diff --git a/src/FileConventions.Test/FileConventions.Test.fsproj b/src/FileConventions.Test/FileConventions.Test.fsproj index 943038631..00dad9506 100644 --- a/src/FileConventions.Test/FileConventions.Test.fsproj +++ b/src/FileConventions.Test/FileConventions.Test.fsproj @@ -48,5 +48,9 @@ + + + + diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index 888edc294..f8b368b7a 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -461,3 +461,8 @@ let NotFollowingNamespaceConvention(fileInfo: FileInfo) = else false + + +let NotFollowingConsoleAppConvention(fileInfo: FileInfo) = + printf "%A" fileInfo + false From 885a60aa39e78d29b99d78e6dab6b072763132ec Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Mon, 21 Aug 2023 17:32:39 +0330 Subject: [PATCH 16/29] FileConventions: fix the function Ensure that projects that aren't console applications don't have source files with console methods. Co-authored-by: Parham --- src/FileConventions/Library.fs | 42 ++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index f8b368b7a..2697403d6 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -463,6 +463,44 @@ let NotFollowingNamespaceConvention(fileInfo: FileInfo) = false +let ContainsConsoleMethods(fileInfo: FileInfo) = + let fileText = File.ReadAllText fileInfo.FullName + let consoleMethods = [ "printf"; "Console." ] + consoleMethods |> List.exists fileText.Contains + + let NotFollowingConsoleAppConvention(fileInfo: FileInfo) = - printf "%A" fileInfo - false + let fileText = File.ReadAllText fileInfo.FullName + let parentDir = Path.GetDirectoryName fileInfo.FullName |> Seq.singleton + + if not(fileText.Contains "Exe") then + let rec allFiles dirs = + if Seq.isEmpty dirs then + Seq.empty + else + let csFiles = + dirs + |> Seq.collect(fun dir -> + Directory.EnumerateFiles(dir, "*.cs") + ) + + let fsFiles = + dirs + |> Seq.collect(fun dir -> + Directory.EnumerateFiles(dir, "*.fs") + ) + + let projectDirectories = + dirs + |> Seq.collect Directory.EnumerateDirectories + |> allFiles + + Seq.append csFiles <| Seq.append fsFiles projectDirectories + + let sourceFiles = allFiles parentDir + + sourceFiles + |> Seq.exists(fun value -> ContainsConsoleMethods(FileInfo value)) + + else + false From 4e0c6e1031fff410c3c2d887da83bfcc204b39a9 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Tue, 22 Aug 2023 12:47:11 +0330 Subject: [PATCH 17/29] FileConventions: add failing test Add tests for NotFollowingConsoleAppConvention function and we fix ConsoleAppConvention2 test so that project name does not contradict new tests. --- ...onsoleProjectWithRightName.Console.fsproj} | 0 .../Program.fs | 0 .../DummyConsoleProjectWithWrongName.fsproj | 12 +++++++ .../Program.fs | 1 + .../DummyProjectWithRight.Console.fsproj | 12 +++++++ .../DummyProjectWithRight.Console/Program.fs | 1 + .../FileConventions.Test.fs | 32 +++++++++++++++++-- .../FileConventions.Test.fsproj | 6 +++- 8 files changed, 61 insertions(+), 3 deletions(-) rename src/FileConventions.Test/DummyFiles/{DummyProjectWithRightConsole/DummyProjectWithRightConsole.fsproj => DummyConsoleProjectWithRightName.Console/DummyConsoleProjectWithRightName.Console.fsproj} (100%) rename src/FileConventions.Test/DummyFiles/{DummyProjectWithRightConsole => DummyConsoleProjectWithRightName.Console}/Program.fs (100%) create mode 100644 src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/DummyConsoleProjectWithWrongName.fsproj create mode 100644 src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithWrongName/Program.fs create mode 100644 src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/DummyProjectWithRight.Console.fsproj create mode 100644 src/FileConventions.Test/DummyFiles/DummyProjectWithRight.Console/Program.fs diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectWithRightConsole/DummyProjectWithRightConsole.fsproj b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/DummyConsoleProjectWithRightName.Console.fsproj similarity index 100% rename from src/FileConventions.Test/DummyFiles/DummyProjectWithRightConsole/DummyProjectWithRightConsole.fsproj rename to src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/DummyConsoleProjectWithRightName.Console.fsproj diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectWithRightConsole/Program.fs b/src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/Program.fs similarity index 100% rename from src/FileConventions.Test/DummyFiles/DummyProjectWithRightConsole/Program.fs rename to src/FileConventions.Test/DummyFiles/DummyConsoleProjectWithRightName.Console/Program.fs 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/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/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index bcbfc5b6c..ed02423bc 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -769,8 +769,36 @@ let ConsoleAppConvention2() = FileInfo( Path.Combine( dummyFilesDirectory.FullName, - "DummyProjectWithRightConsole", - "DummyProjectWithRightConsole.fsproj" + "DummyProjectWithRight.Console", + "DummyProjectWithRight.Console.fsproj" + ) + ) + + Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo false) + + +[] +let ConsoleAppConvention3() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyConsoleProjectWithWrongName", + "DummyConsoleProjectWithWrongName.fsproj" + ) + ) + + Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo true) + + +[] +let ConsoleAppConvention4() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyConsoleProjectWithRightName.Console", + "DummyConsoleProjectWithRightName.Console.fsproj" ) ) diff --git a/src/FileConventions.Test/FileConventions.Test.fsproj b/src/FileConventions.Test/FileConventions.Test.fsproj index 00dad9506..cb727a5e1 100644 --- a/src/FileConventions.Test/FileConventions.Test.fsproj +++ b/src/FileConventions.Test/FileConventions.Test.fsproj @@ -51,6 +51,10 @@ - + + + + + From 6e80056cf8efa5f340f12409a381d73e0dd2c938 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Tue, 22 Aug 2023 13:12:41 +0330 Subject: [PATCH 18/29] FileConvention: fix the function Fix NotFollowingConsoleAppConvention() function. --- src/FileConventions/Library.fs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index 2697403d6..70e4fef4e 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -471,7 +471,7 @@ let ContainsConsoleMethods(fileInfo: FileInfo) = let NotFollowingConsoleAppConvention(fileInfo: FileInfo) = let fileText = File.ReadAllText fileInfo.FullName - let parentDir = Path.GetDirectoryName fileInfo.FullName |> Seq.singleton + let parentDir = Path.GetDirectoryName fileInfo.FullName if not(fileText.Contains "Exe") then let rec allFiles dirs = @@ -497,10 +497,13 @@ let NotFollowingConsoleAppConvention(fileInfo: FileInfo) = Seq.append csFiles <| Seq.append fsFiles projectDirectories - let sourceFiles = allFiles parentDir + let sourceFiles = allFiles(parentDir |> Seq.singleton) sourceFiles |> Seq.exists(fun value -> ContainsConsoleMethods(FileInfo value)) else - false + // project name should ends with .Console + // we only check parent dir because + // we have ProjFilesNamingConvention rule to check project name + parentDir.EndsWith ".Console" |> not From 46f3daeccc9b72dffc107b40f250e7a872a92568 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Tue, 22 Aug 2023 13:43:15 +0330 Subject: [PATCH 19/29] FileConventions: add failing test Add tests for async project, Async.RunSynchronously only allowed in console applications. --- .../DummyProjectAsync.Console.fsproj | 12 ++++++++ .../DummyProjectAsync.Console/Program.fs | 4 +++ .../DummyProjectAsync.fsproj | 12 ++++++++ .../DummyFiles/DummyProjectAsync/Library.fs | 9 ++++++ .../FileConventions.Test.fs | 28 +++++++++++++++++++ 5 files changed, 65 insertions(+) create mode 100644 src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/DummyProjectAsync.Console.fsproj create mode 100644 src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/Program.fs create mode 100644 src/FileConventions.Test/DummyFiles/DummyProjectAsync/DummyProjectAsync.fsproj create mode 100644 src/FileConventions.Test/DummyFiles/DummyProjectAsync/Library.fs 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..8f7a5c76d --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/Program.fs @@ -0,0 +1,4 @@ +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..0aa24d069 --- /dev/null +++ b/src/FileConventions.Test/DummyFiles/DummyProjectAsync/Library.fs @@ -0,0 +1,9 @@ +namespace DummyProjectAsync + +module Say = + + let delayedHello name = + async { + do! Async.Sleep(5000) + } |> Async.RunSynchronously + "Delayed Hello" diff --git a/src/FileConventions.Test/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index ed02423bc..7ec15a405 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -803,3 +803,31 @@ let ConsoleAppConvention4() = ) Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo false) + + +[] +let ConsoleAppConvention5() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyProjectAsync", + "DummyProjectAsync.fsproj" + ) + ) + + Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo true) + + +[] +let ConsoleAppConvention6() = + let fileInfo = + FileInfo( + Path.Combine( + dummyFilesDirectory.FullName, + "DummyProjectAsync.Console", + "DummyProjectAsync.Console.fsproj" + ) + ) + + Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo false) From 45e298b94f87844271f9bd8cd8b879e6010bb697 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Tue, 22 Aug 2023 13:53:23 +0330 Subject: [PATCH 20/29] FileConvention: fix the function Fix NotFollowingConsoleAppConvention() function. --- .../DummyFiles/DummyProjectAsync.Console/Program.fs | 4 +--- .../DummyFiles/DummyProjectAsync/Library.fs | 4 +--- src/FileConventions/Library.fs | 9 ++++++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/Program.fs b/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/Program.fs index 8f7a5c76d..6cceb79df 100644 --- a/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/Program.fs +++ b/src/FileConventions.Test/DummyFiles/DummyProjectAsync.Console/Program.fs @@ -1,4 +1,2 @@ -async { - do! Async.Sleep(5000) -} |> Async.RunSynchronously +async { do! Async.Sleep(5000) } |> Async.RunSynchronously printf "Hello World" diff --git a/src/FileConventions.Test/DummyFiles/DummyProjectAsync/Library.fs b/src/FileConventions.Test/DummyFiles/DummyProjectAsync/Library.fs index 0aa24d069..bf14df5fd 100644 --- a/src/FileConventions.Test/DummyFiles/DummyProjectAsync/Library.fs +++ b/src/FileConventions.Test/DummyFiles/DummyProjectAsync/Library.fs @@ -3,7 +3,5 @@ module Say = let delayedHello name = - async { - do! Async.Sleep(5000) - } |> Async.RunSynchronously + async { do! Async.Sleep(5000) } |> Async.RunSynchronously "Delayed Hello" diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index 70e4fef4e..cb37050c8 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -465,7 +465,14 @@ let NotFollowingNamespaceConvention(fileInfo: FileInfo) = let ContainsConsoleMethods(fileInfo: FileInfo) = let fileText = File.ReadAllText fileInfo.FullName - let consoleMethods = [ "printf"; "Console." ] + + let consoleMethods = + [ + "printf" + "Console." + "Async.RunSynchronously" + ] + consoleMethods |> List.exists fileText.Contains From c190f9c0f00933c805a69c6e8a9b3456cf5e23a7 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Mon, 28 Aug 2023 12:27:33 +0330 Subject: [PATCH 21/29] FileConventions(.Test): fix proj file indent --- src/FileConventions.Test/FileConventions.Test.fsproj | 2 +- src/FileConventions/FileConventions.fsproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/FileConventions.Test/FileConventions.Test.fsproj b/src/FileConventions.Test/FileConventions.Test.fsproj index cb727a5e1..c4beb5c4a 100644 --- a/src/FileConventions.Test/FileConventions.Test.fsproj +++ b/src/FileConventions.Test/FileConventions.Test.fsproj @@ -19,7 +19,7 @@ - + diff --git a/src/FileConventions/FileConventions.fsproj b/src/FileConventions/FileConventions.fsproj index 8de07efed..7f2c33724 100644 --- a/src/FileConventions/FileConventions.fsproj +++ b/src/FileConventions/FileConventions.fsproj @@ -13,7 +13,7 @@ - + From d49a99cc871e0aa1a2a66df6acae8fa50e65e262 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Mon, 28 Aug 2023 12:57:34 +0330 Subject: [PATCH 22/29] FileConvention: properly naming variables --- src/FileConventions/Library.fs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index cb37050c8..86de06e10 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -11,7 +11,7 @@ open Fsdk let ymlAssertionError = "Bug: file should be a .yml file" let projAssertionError = "Bug: file should be a proj file" -let fsxAssertionError = "Bug: file was not a F#/C# source file" +let sourceFileAssertionError = "Bug: file was not a F#/C# source file" let HasCorrectShebang(fileInfo: FileInfo) = let fileText = File.ReadLines fileInfo.FullName @@ -88,7 +88,9 @@ let DetectAsteriskInPackageReferenceItems(fileInfo: FileInfo) = asteriskInPackageReference.IsMatch fileText let DetectMissingVersionsInNugetPackageReferences(fileInfo: FileInfo) = - Misc.BetterAssert (fileInfo.FullName.EndsWith ".fsx") fsxAssertionError + Misc.BetterAssert + (fileInfo.FullName.EndsWith ".fsx") + sourceFileAssertionError let fileLines = File.ReadLines fileInfo.FullName @@ -318,7 +320,9 @@ let DetectInconsistentVersionsInNugetRefsInFSharpScripts = fileInfos |> Seq.iter(fun fileInfo -> - Misc.BetterAssert (fileInfo.FullName.EndsWith ".fsx") fsxAssertionError + Misc.BetterAssert + (fileInfo.FullName.EndsWith ".fsx") + sourceFileAssertionError ) DetectInconsistentVersions @@ -443,7 +447,7 @@ let DoesNamespaceInclude (fileInfo: FileInfo) (word: string) = let NotFollowingNamespaceConvention(fileInfo: FileInfo) = Misc.BetterAssert (fileInfo.FullName.EndsWith ".fs" || fileInfo.FullName.EndsWith ".cs") - fsxAssertionError + sourceFileAssertionError let fileName = Path.GetFileNameWithoutExtension fileInfo.FullName let parentDir = Path.GetDirectoryName fileInfo.FullName |> DirectoryInfo From 19b442d7774a24e459b265d47f5906b1e3e9cb8f Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Tue, 29 Aug 2023 13:07:49 +0330 Subject: [PATCH 23/29] FileConventions: add failing test Add test for NotFollowingNamespaceConvention fn. --- .../src/Foo/DummyFileUnderFooWithoutNamespace.fs | 1 + src/FileConventions.Test/FileConventions.Test.fs | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 src/FileConventions.Test/DummyFiles/src/Foo/DummyFileUnderFooWithoutNamespace.fs 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 7ec15a405..bc4c6a3f6 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -749,6 +749,22 @@ let NamespaceConvention7() = 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 = From e6fc8796402ffaac72096e96cc5a714c1b33231e Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Tue, 29 Aug 2023 13:18:02 +0330 Subject: [PATCH 24/29] FileConvention: fix the function A .fs/fsx file might not have a namespace sometimes. --- src/FileConventions/Library.fs | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index 86de06e10..8b43afa18 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -428,19 +428,28 @@ let DoesNamespaceInclude (fileInfo: FileInfo) (word: string) = if fileText.Any() then let rightNamespace = - fileText |> Seq.find(fun x -> x.Contains "namespace") + fileText |> Seq.tryFind(fun x -> x.Contains "namespace") - let words = - rightNamespace.Split(' ', StringSplitOptions.RemoveEmptyEntries) + match rightNamespace with + | Some fileNamespace -> + let words = + fileNamespace.Split(' ', StringSplitOptions.RemoveEmptyEntries) - let namespaceCorrentPos = 1 - let namespaceWordsCount = 2 + let namespaceCorrentPos = 1 + let namespaceWordsCount = 2 - if words.Length < namespaceWordsCount then - false - else - let namespaceName = words[namespaceCorrentPos] - namespaceName.Equals(word) || namespaceName.Equals($"{word};") + 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 From 5358b96bc285a38db2e4a9784ae8beb7c4430cb4 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Wed, 23 Aug 2023 17:02:47 +0330 Subject: [PATCH 25/29] FileConventions.Test: add failing test `Contains()` method catches a lot of false-positives and not suitable for this situation so we used regex. Co-authored-by: Parham --- .../DummyFiles/DummyScriptWithEmptyString.fsx | 1 + .../DummyScriptWithMatchEmptyString.fsx | 5 ++++ .../FileConventions.Test.fs | 26 +++++++++++++++++++ .../FileConventions.Test.fsproj | 2 ++ 4 files changed, 34 insertions(+) create mode 100644 src/FileConventions.Test/DummyFiles/DummyScriptWithEmptyString.fsx create mode 100644 src/FileConventions.Test/DummyFiles/DummyScriptWithMatchEmptyString.fsx 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/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index bc4c6a3f6..135498704 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -614,6 +614,32 @@ let DefiningEmptyStringsWithDoubleQuotes2() = 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 = diff --git a/src/FileConventions.Test/FileConventions.Test.fsproj b/src/FileConventions.Test/FileConventions.Test.fsproj index c4beb5c4a..2b470f8d2 100644 --- a/src/FileConventions.Test/FileConventions.Test.fsproj +++ b/src/FileConventions.Test/FileConventions.Test.fsproj @@ -28,6 +28,8 @@ + + From ce4c0c6a3070ceb5e65a34260ba3dfa5cfe2abd1 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Wed, 23 Aug 2023 17:10:30 +0330 Subject: [PATCH 26/29] FileConventions: fix empty string false-positives Fix `DefiningEmptyStringsWithDoubleQuotes()` function by using regex insted of `Contains()`. Co-authored-by: Parham --- src/FileConventions/Library.fs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index 8b43afa18..b388c8a99 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -406,7 +406,9 @@ let IsExecutable(fileInfo: FileInfo) = let DefiningEmptyStringsWithDoubleQuotes(fileInfo: FileInfo) = let fileText = File.ReadAllText fileInfo.FullName - fileText.Contains "\"\"" + + Regex("(? Date: Thu, 24 Aug 2023 14:23:45 +0330 Subject: [PATCH 27/29] FileConventions: load Helpers.fs first --- scripts/executableConvention.fsx | 2 +- scripts/inconsistentVersionsInFSharpScripts.fsx | 2 +- scripts/inconsistentVersionsInGitHubCI.fsx | 2 +- scripts/mixedLineEndings.fsx | 2 +- scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx | 2 +- scripts/shebangConvention.fsx | 2 +- scripts/unpinnedDotnetPackageVersions.fsx | 2 +- scripts/unpinnedDotnetToolInstallVersions.fsx | 2 +- scripts/unpinnedGitHubActionsImageVersions.fsx | 2 +- scripts/unpinnedNugetPackageReferenceVersions.fsx | 2 +- scripts/wrapLatestCommitMsg.fsx | 1 + src/FileConventions/FileConventions.fsproj | 4 ++-- 12 files changed, 13 insertions(+), 12 deletions(-) diff --git a/scripts/executableConvention.fsx b/scripts/executableConvention.fsx index 4368008d6..06c6c8a18 100755 --- a/scripts/executableConvention.fsx +++ b/scripts/executableConvention.fsx @@ -5,8 +5,8 @@ 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/inconsistentVersionsInFSharpScripts.fsx b/scripts/inconsistentVersionsInFSharpScripts.fsx index 4b521b4d8..82b72af9e 100755 --- a/scripts/inconsistentVersionsInFSharpScripts.fsx +++ b/scripts/inconsistentVersionsInFSharpScripts.fsx @@ -6,8 +6,8 @@ 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 d015724eb..6777390c9 100755 --- a/scripts/inconsistentVersionsInGitHubCI.fsx +++ b/scripts/inconsistentVersionsInGitHubCI.fsx @@ -5,8 +5,8 @@ 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 8b73ed3c2..d3cef8305 100755 --- a/scripts/mixedLineEndings.fsx +++ b/scripts/mixedLineEndings.fsx @@ -6,8 +6,8 @@ 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 16d032180..eaac75479 100755 --- a/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx +++ b/scripts/nonVerboseFlagsInGitHubCIAndScripts.fsx @@ -6,8 +6,8 @@ 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 0ccdc14db..5c2c93203 100755 --- a/scripts/shebangConvention.fsx +++ b/scripts/shebangConvention.fsx @@ -6,8 +6,8 @@ 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 55b6178b7..af45ef18b 100755 --- a/scripts/unpinnedDotnetPackageVersions.fsx +++ b/scripts/unpinnedDotnetPackageVersions.fsx @@ -6,8 +6,8 @@ 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 b16297ae3..7cdffc995 100755 --- a/scripts/unpinnedDotnetToolInstallVersions.fsx +++ b/scripts/unpinnedDotnetToolInstallVersions.fsx @@ -6,8 +6,8 @@ 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 191e2bc8f..31615dc8d 100755 --- a/scripts/unpinnedGitHubActionsImageVersions.fsx +++ b/scripts/unpinnedGitHubActionsImageVersions.fsx @@ -6,8 +6,8 @@ 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 74a788a13..44370c1ac 100755 --- a/scripts/unpinnedNugetPackageReferenceVersions.fsx +++ b/scripts/unpinnedNugetPackageReferenceVersions.fsx @@ -6,8 +6,8 @@ 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 92b2be69c..4fd8e11e8 100755 --- a/scripts/wrapLatestCommitMsg.fsx +++ b/scripts/wrapLatestCommitMsg.fsx @@ -7,6 +7,7 @@ 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" open Fsdk diff --git a/src/FileConventions/FileConventions.fsproj b/src/FileConventions/FileConventions.fsproj index 7f2c33724..6ff11dcda 100644 --- a/src/FileConventions/FileConventions.fsproj +++ b/src/FileConventions/FileConventions.fsproj @@ -6,8 +6,8 @@ - - + + From 1fd75764e0672ced14691ed3bf9fcfc5b7b2f218 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Thu, 24 Aug 2023 14:59:58 +0330 Subject: [PATCH 28/29] FileConventions: improvements to Library.fs Finding printf and console methods in files & removed printf methods used for debugging purposes & added file filter to ReturnAllProjectSourceFile. --- .../FileConventions.Test.fs | 30 +++++-- src/FileConventions/Library.fs | 82 ++++++++++--------- 2 files changed, 67 insertions(+), 45 deletions(-) diff --git a/src/FileConventions.Test/FileConventions.Test.fs b/src/FileConventions.Test/FileConventions.Test.fs index 135498704..0e86a8531 100644 --- a/src/FileConventions.Test/FileConventions.Test.fs +++ b/src/FileConventions.Test/FileConventions.Test.fs @@ -802,7 +802,10 @@ let ConsoleAppConvention1() = ) ) - Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo true) + Assert.That( + NotFollowingConsoleAppConvention fileInfo false, + Is.EqualTo true + ) [] @@ -816,7 +819,10 @@ let ConsoleAppConvention2() = ) ) - Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo false) + Assert.That( + NotFollowingConsoleAppConvention fileInfo false, + Is.EqualTo false + ) [] @@ -830,7 +836,10 @@ let ConsoleAppConvention3() = ) ) - Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo true) + Assert.That( + NotFollowingConsoleAppConvention fileInfo false, + Is.EqualTo true + ) [] @@ -844,7 +853,10 @@ let ConsoleAppConvention4() = ) ) - Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo false) + Assert.That( + NotFollowingConsoleAppConvention fileInfo false, + Is.EqualTo false + ) [] @@ -858,7 +870,10 @@ let ConsoleAppConvention5() = ) ) - Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo true) + Assert.That( + NotFollowingConsoleAppConvention fileInfo false, + Is.EqualTo true + ) [] @@ -872,4 +887,7 @@ let ConsoleAppConvention6() = ) ) - Assert.That(NotFollowingConsoleAppConvention fileInfo, Is.EqualTo false) + Assert.That( + NotFollowingConsoleAppConvention fileInfo false, + Is.EqualTo false + ) diff --git a/src/FileConventions/Library.fs b/src/FileConventions/Library.fs index b388c8a99..ac3865fb9 100644 --- a/src/FileConventions/Library.fs +++ b/src/FileConventions/Library.fs @@ -418,10 +418,6 @@ let ProjFilesNamingConvention(fileInfo: FileInfo) = let parentDirectoryName = Path.GetDirectoryName fileInfo.FullName |> Path.GetFileName - printfn - "File name: %s, Parent directory name: %s" - fileName - parentDirectoryName fileName <> parentDirectoryName @@ -460,10 +456,8 @@ let NotFollowingNamespaceConvention(fileInfo: FileInfo) = (fileInfo.FullName.EndsWith ".fs" || fileInfo.FullName.EndsWith ".cs") sourceFileAssertionError - let fileName = Path.GetFileNameWithoutExtension fileInfo.FullName let parentDir = Path.GetDirectoryName fileInfo.FullName |> DirectoryInfo - printfn "File name: %s, Parent directory name: %s" fileName parentDir.Name if parentDir.Parent.Name = "src" then DoesNamespaceInclude fileInfo parentDir.Name |> not @@ -479,50 +473,60 @@ let NotFollowingNamespaceConvention(fileInfo: FileInfo) = let ContainsConsoleMethods(fileInfo: FileInfo) = - let fileText = File.ReadAllText fileInfo.FullName - - let consoleMethods = - [ - "printf" - "Console." - "Async.RunSynchronously" - ] + 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 - consoleMethods |> List.exists fileText.Contains + checkLine fileLines -let NotFollowingConsoleAppConvention(fileInfo: FileInfo) = - let fileText = File.ReadAllText fileInfo.FullName - let parentDir = Path.GetDirectoryName fileInfo.FullName +let ReturnAllProjectSourceFile + (parentDir: DirectoryInfo) + (patterns: List) + (shouldFilter: bool) + = - if not(fileText.Contains "Exe") then - let rec allFiles dirs = - if Seq.isEmpty dirs then - Seq.empty + seq { + for pattern in patterns do + if shouldFilter then + yield Helpers.GetFiles parentDir pattern else - let csFiles = - dirs - |> Seq.collect(fun dir -> - Directory.EnumerateFiles(dir, "*.cs") + yield + Directory.GetFiles( + parentDir.FullName, + pattern, + SearchOption.AllDirectories ) + |> Seq.map(fun pathStr -> FileInfo pathStr) - let fsFiles = - dirs - |> Seq.collect(fun dir -> - Directory.EnumerateFiles(dir, "*.fs") - ) + } + |> Seq.concat - let projectDirectories = - dirs - |> Seq.collect Directory.EnumerateDirectories - |> allFiles - Seq.append csFiles <| Seq.append fsFiles projectDirectories +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 - let sourceFiles = allFiles(parentDir |> Seq.singleton) + if not(fileText.Contains "Exe") then + let sourceFiles = + ReturnAllProjectSourceFile + (DirectoryInfo parentDir) + [ "*.cs"; "*.fs" ] + shouldFilter - sourceFiles - |> Seq.exists(fun value -> ContainsConsoleMethods(FileInfo value)) + sourceFiles |> Seq.exists(fun value -> ContainsConsoleMethods value) else // project name should ends with .Console From a326d09c281a54cbc9169cad13c4a5ba54e35b93 Mon Sep 17 00:00:00 2001 From: Mehrshad Date: Thu, 24 Aug 2023 15:00:37 +0330 Subject: [PATCH 29/29] FileConventions: dotnetFileConvention The new dotnetFileConvention.fsx script detects empty strings, wrong namespace usage, and incorrect printf methods on non-console applications. --- scripts/dotnetFileConvention.fsx | 79 ++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100755 scripts/dotnetFileConvention.fsx diff --git a/scripts/dotnetFileConvention.fsx b/scripts/dotnetFileConvention.fsx new file mode 100755 index 000000000..5fcb0b156 --- /dev/null +++ b/scripts/dotnetFileConvention.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: dotnetFileConvention.fsx [projectFolder(optional)]" + + Environment.Exit 1 + +let rootDir = DirectoryInfo args.[0] + +// DefiningEmptyStringsWithDoubleQuotes +let allSourceFiles = ReturnAllProjectSourceFile rootDir [ "*.cs"; "*.fs" ] true +printfn "%A" (String.Join("\n", allSourceFiles)) + +let allProjFiles = + ReturnAllProjectSourceFile 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 + )