Skip to content

Commit f910d7b

Browse files
authored
Merge PR fsprojects#839 from knocte/wip/improveLibHeuristic
Improve lib name heuristics.
2 parents c0bcef2 + f6f65e0 commit f910d7b

File tree

2 files changed

+109
-15
lines changed

2 files changed

+109
-15
lines changed

src/FSharpLint.Core/Rules/Smells/NoAsyncRunSynchronouslyInLibrary.fs

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,44 @@ let hasEntryPoint (checkFileResults: FSharpCheckFileResults) (maybeProjectCheckR
3030
| None ->
3131
false
3232

33-
let excludedProjectNames = [ "test"; "console" ]
33+
let private projectNamesUnlikelyToBeLibraries =
34+
[
35+
"tests"
36+
"test"
37+
"testing"
38+
"console"
39+
"CLI"
40+
"TUI"
41+
]
42+
|> Seq.map (fun name -> name.ToLowerInvariant())
43+
44+
let private possibleProjectNameSegmentSeparators =
45+
[|
46+
'.'
47+
'_'
48+
'-'
49+
|]
3450

3551
let howLikelyProjectIsLibrary (projectFileName: string): LibraryHeuristicResultByProjectName =
36-
let nameSegments = Helper.Naming.QuickFixes.splitByCaseChange projectFileName
37-
if nameSegments |> Seq.contains "Lib" then
52+
let libraryAbbrev = "lib"
53+
let nameSegments =
54+
Helper.Naming.QuickFixes.splitByCaseChange projectFileName
55+
|> Seq.map (fun segment -> segment.ToLowerInvariant())
56+
if nameSegments |> Seq.contains libraryAbbrev then
3857
Likely
39-
elif excludedProjectNames |> List.exists (fun name -> projectFileName.ToLowerInvariant().Contains name) then
58+
elif
59+
nameSegments
60+
|> Seq.exists (
61+
fun segment ->
62+
let subSegments = segment.Split possibleProjectNameSegmentSeparators
63+
subSegments
64+
|> Seq.exists (fun subSegment ->
65+
projectNamesUnlikelyToBeLibraries
66+
|> Seq.exists (fun noLibName -> noLibName = subSegment)
67+
)
68+
) then
4069
Unlikely
41-
elif projectFileName.ToLowerInvariant().EndsWith "lib" then
70+
elif projectFileName.ToLowerInvariant().EndsWith libraryAbbrev then
4271
Likely
4372
else
4473
Uncertain

tests/FSharpLint.Core.Tests/Rules/Smells/NoAsyncRunSynchronouslyInLibrary.fs

Lines changed: 75 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -134,37 +134,102 @@ let Foo() =
134134

135135
[<TestFixture>]
136136
type TestNoAsyncRunSynchronouslyInLibraryHeuristic() =
137+
138+
[<Test>]
139+
member this.``Unlikely to be library if contains "tests" in name``() =
140+
Assert.AreEqual(
141+
LibraryHeuristicResultByProjectName.Unlikely,
142+
howLikelyProjectIsLibrary "IntegrationTests"
143+
)
144+
145+
[<Test>]
146+
member this.``Unlikely to be library if contains "testing" in name``() =
147+
Assert.AreEqual(
148+
LibraryHeuristicResultByProjectName.Unlikely,
149+
howLikelyProjectIsLibrary "UnitTesting"
150+
)
151+
137152
[<Test>]
138153
member this.``Unlikely to be library if contains "test" in name``() =
139154
Assert.AreEqual(
140-
howLikelyProjectIsLibrary "TestProject",
141-
LibraryHeuristicResultByProjectName.Unlikely
155+
LibraryHeuristicResultByProjectName.Unlikely,
156+
howLikelyProjectIsLibrary "TestSuite"
142157
)
143158

144159
[<Test>]
145160
member this.``Unlikely to be library if contains "console" in name``() =
146161
Assert.AreEqual(
147-
howLikelyProjectIsLibrary "FooConsole",
148-
LibraryHeuristicResultByProjectName.Unlikely
162+
LibraryHeuristicResultByProjectName.Unlikely,
163+
howLikelyProjectIsLibrary "FooConsole"
149164
)
150165

151166
[<Test>]
152167
member this.``Likely to be library if contains Contains "Lib" as a PascalCase segment``() =
153168
Assert.AreEqual(
154-
howLikelyProjectIsLibrary "LibFoo",
155-
LibraryHeuristicResultByProjectName.Likely
169+
LibraryHeuristicResultByProjectName.Likely,
170+
howLikelyProjectIsLibrary "LibFoo"
156171
)
157172

158173
[<Test>]
159174
member this.``Uncertain if contains contains "Lib" but not as a PascalCase segment``() =
160175
Assert.AreEqual(
161-
howLikelyProjectIsLibrary "LibreOfficeProg",
162-
LibraryHeuristicResultByProjectName.Uncertain
176+
LibraryHeuristicResultByProjectName.Uncertain,
177+
howLikelyProjectIsLibrary "LibreOfficeProg"
163178
)
164179

165180
[<Test>]
166181
member this.``Likely to be library if contains ends with "lib" (case-insensitive)``() =
167182
Assert.AreEqual(
168-
howLikelyProjectIsLibrary "FooLib",
169-
LibraryHeuristicResultByProjectName.Likely
183+
LibraryHeuristicResultByProjectName.Likely,
184+
howLikelyProjectIsLibrary "FooLib"
185+
)
186+
187+
[<Test>]
188+
member this.``Unlikely to be library if contains "CLI" in name``() =
189+
Assert.AreEqual(
190+
LibraryHeuristicResultByProjectName.Unlikely,
191+
howLikelyProjectIsLibrary "FooCLI"
192+
)
193+
194+
[<Test>]
195+
member this.``Uncertain to be library if contains "cli" in name not related to CLI``() =
196+
Assert.AreEqual(
197+
LibraryHeuristicResultByProjectName.Uncertain,
198+
howLikelyProjectIsLibrary "InclinedDriver"
199+
)
200+
201+
[<Test>]
202+
member this.``Unlikely to be library if contains "TUI" in name``() =
203+
Assert.AreEqual(
204+
LibraryHeuristicResultByProjectName.Unlikely,
205+
howLikelyProjectIsLibrary "FooTUI"
206+
)
207+
208+
[<Test>]
209+
member this.``Likely to be library if it starts with "lib", e.g. camelCase``() =
210+
Assert.AreEqual(
211+
LibraryHeuristicResultByProjectName.Likely,
212+
howLikelyProjectIsLibrary "libFoo"
213+
)
214+
215+
[<Test>]
216+
member this.``Unlikely to be library if it contains "console", but segments are separated by dots``() =
217+
Assert.AreEqual(
218+
LibraryHeuristicResultByProjectName.Unlikely,
219+
howLikelyProjectIsLibrary "foo.console.app"
170220
)
221+
222+
[<Test>]
223+
member this.``Unlikely to be library if it contains "console", but segments are separated by dashes``() =
224+
Assert.AreEqual(
225+
LibraryHeuristicResultByProjectName.Unlikely,
226+
howLikelyProjectIsLibrary "foo-console-app"
227+
)
228+
229+
[<Test>]
230+
member this.``Unlikely to be library if it contains "console", but segments are separated by underscores``() =
231+
Assert.AreEqual(
232+
LibraryHeuristicResultByProjectName.Unlikely,
233+
howLikelyProjectIsLibrary "foo_console_app"
234+
)
235+

0 commit comments

Comments
 (0)