From 1417252feb70e793358fa1d96bf31f6417e9507e Mon Sep 17 00:00:00 2001 From: Mike Dougherty Date: Wed, 31 May 2023 10:37:04 -0400 Subject: [PATCH 1/3] include NuGet packages.config manifest files --- .../Unit/CSharp/PackagesManifestTest.cs | 27 +++++++++++++++++++ .../Languages/CSharp/PackagesManifest.cs | 23 ++++++++++++++++ .../CSharp/PackagesManifestFinder.cs | 16 +++++++++++ 3 files changed, 66 insertions(+) create mode 100644 Corgibytes.Freshli.Lib.Test/Unit/CSharp/PackagesManifestTest.cs create mode 100644 Corgibytes.Freshli.Lib/Languages/CSharp/PackagesManifest.cs create mode 100644 Corgibytes.Freshli.Lib/Languages/CSharp/PackagesManifestFinder.cs diff --git a/Corgibytes.Freshli.Lib.Test/Unit/CSharp/PackagesManifestTest.cs b/Corgibytes.Freshli.Lib.Test/Unit/CSharp/PackagesManifestTest.cs new file mode 100644 index 00000000..0c0f9f1e --- /dev/null +++ b/Corgibytes.Freshli.Lib.Test/Unit/CSharp/PackagesManifestTest.cs @@ -0,0 +1,27 @@ +using Corgibytes.Freshli.Lib.Languages.CSharp; +using Xunit; + +namespace Corgibytes.Freshli.Lib.Test.Unit.CSharp; + +public class PackagesManifestTest +{ + [Fact] + public void ParsesFile() + { + var manifest = new PackagesManifest(); + var testContent = @" + + + + + + + + "; + + manifest.Parse(testContent); + + Assert.Equal(6, manifest.Count); + } + +} diff --git a/Corgibytes.Freshli.Lib/Languages/CSharp/PackagesManifest.cs b/Corgibytes.Freshli.Lib/Languages/CSharp/PackagesManifest.cs new file mode 100644 index 00000000..1026c666 --- /dev/null +++ b/Corgibytes.Freshli.Lib/Languages/CSharp/PackagesManifest.cs @@ -0,0 +1,23 @@ +using System.Xml; + +namespace Corgibytes.Freshli.Lib.Languages.CSharp; + +public class PackagesManifest : AbstractManifest +{ + public override void Parse(string contents) + { + var xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(contents); + + var packages = xmlDoc.GetElementsByTagName("package"); + foreach (XmlNode package in packages) + { + Add( + package.Attributes![0].Value, + package.Attributes[1].Value + ); + } + } + + public override bool UsesExactMatches => true; +} diff --git a/Corgibytes.Freshli.Lib/Languages/CSharp/PackagesManifestFinder.cs b/Corgibytes.Freshli.Lib/Languages/CSharp/PackagesManifestFinder.cs new file mode 100644 index 00000000..bc091a7f --- /dev/null +++ b/Corgibytes.Freshli.Lib/Languages/CSharp/PackagesManifestFinder.cs @@ -0,0 +1,16 @@ +namespace Corgibytes.Freshli.Lib.Languages.CSharp; + +public class PackagesManifestFinder : AbstractManifestFinder +{ + protected override string ManifestPattern => "packages.config"; + public override IPackageRepository RepositoryFor(string projectRootPath) + { + return new NuGetRepository(); + } + + public override IManifest ManifestFor(string projectRootPath) + { + return new PackagesManifest(); + } + +} From 23ba7468bff275fb332f6b810dbc3cf8f975db38 Mon Sep 17 00:00:00 2001 From: Mike Dougherty Date: Wed, 31 May 2023 16:11:20 -0400 Subject: [PATCH 2/3] return multiple manifests found in the path Resolves #628 --- .../Corgibytes.Freshli.Lib.Test.csproj | 6 +++ .../Integration/ManifestServiceTest.cs | 51 +++++++++++++++++++ .../Unit/RunnerTest.cs | 21 ++++++++ .../fixtures/csharp/config/packages.config | 7 +++ .../fixtures/csharp/csproj/Project.csproj | 21 ++++++++ Corgibytes.Freshli.Lib/ManifestService.cs | 6 --- Corgibytes.Freshli.Lib/Runner.cs | 6 +-- 7 files changed, 107 insertions(+), 11 deletions(-) create mode 100644 Corgibytes.Freshli.Lib.Test/Unit/RunnerTest.cs create mode 100644 Corgibytes.Freshli.Lib.Test/fixtures/csharp/config/packages.config create mode 100644 Corgibytes.Freshli.Lib.Test/fixtures/csharp/csproj/Project.csproj diff --git a/Corgibytes.Freshli.Lib.Test/Corgibytes.Freshli.Lib.Test.csproj b/Corgibytes.Freshli.Lib.Test/Corgibytes.Freshli.Lib.Test.csproj index cb4f49ba..eeda5b21 100644 --- a/Corgibytes.Freshli.Lib.Test/Corgibytes.Freshli.Lib.Test.csproj +++ b/Corgibytes.Freshli.Lib.Test/Corgibytes.Freshli.Lib.Test.csproj @@ -41,6 +41,12 @@ + + + Always + + + diff --git a/Corgibytes.Freshli.Lib.Test/Integration/ManifestServiceTest.cs b/Corgibytes.Freshli.Lib.Test/Integration/ManifestServiceTest.cs index 9930610a..56694ef2 100644 --- a/Corgibytes.Freshli.Lib.Test/Integration/ManifestServiceTest.cs +++ b/Corgibytes.Freshli.Lib.Test/Integration/ManifestServiceTest.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using Xunit; @@ -88,5 +89,55 @@ public void PerlCpanfile() Assert.Equal("cpanfile", finders.First().GetManifestFilenames(fixturePath).First()); } + + [Fact] + public void CSharpProjectFile() + { + string fixturePath = Fixtures.Path( + "csharp", + "csproj" + ); + AssertManifest(fixturePath, "Project.csproj"); + } + + [Fact] + public void CSharpPackagesFile() + { + string fixturePath = Fixtures.Path( + "csharp", + "config" + ); + AssertManifest(fixturePath, "packages.config"); + } + + [Fact] + public void CSharpMultipleFiles() + { + string fixturePath = Fixtures.Path( + "csharp" + ); + var historyService = new FileHistoryService(FileHistoryFinderRegistry); + var fileFinder = historyService.SelectFinderFor(fixturePath); + var manifestService = new ManifestService(); + + var finders = manifestService.SelectFindersFor(fixturePath, fileFinder); + List manifestFilenames = finders.SelectMany(finder => finder.GetManifestFilenames(fixturePath)).ToList(); + + // When https://github.com/corgibytes/freshli-lib/issues/630 is resolved this assertion + // should be Assert.Equal(8, manifestFilenames.Count); + Assert.InRange(manifestFilenames.Count, 2, 8); + Assert.Contains("Project.csproj", manifestFilenames); + Assert.Contains("packages.config", manifestFilenames); + } + + private void AssertManifest(string fixturePath, string expectedManifest) + { + var historyService = new FileHistoryService(FileHistoryFinderRegistry); + var fileFinder = historyService.SelectFinderFor(fixturePath); + var manifestService = new ManifestService(); + var finders = manifestService.SelectFindersFor(fixturePath, fileFinder); + + Assert.Equal(expectedManifest, finders.First().GetManifestFilenames(fixturePath).First()); + } } } diff --git a/Corgibytes.Freshli.Lib.Test/Unit/RunnerTest.cs b/Corgibytes.Freshli.Lib.Test/Unit/RunnerTest.cs new file mode 100644 index 00000000..ae828095 --- /dev/null +++ b/Corgibytes.Freshli.Lib.Test/Unit/RunnerTest.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using Xunit; + +namespace Corgibytes.Freshli.Lib.Test.Unit; + +public class RunnerTest +{ + [Fact] + public void RunCSharp() + { + string fixturePath = Fixtures.Path( + "csharp" + ); + Runner runner = new(); + IList scanResults = runner.Run(fixturePath); + Assert.Equal(2, scanResults.Count); + Assert.Contains(scanResults, result => result.Filename.Equals("csproj/Project.csproj")); + Assert.Contains(scanResults, result => result.Filename.Equals("config/packages.config")); + } + +} diff --git a/Corgibytes.Freshli.Lib.Test/fixtures/csharp/config/packages.config b/Corgibytes.Freshli.Lib.Test/fixtures/csharp/config/packages.config new file mode 100644 index 00000000..ba445d9c --- /dev/null +++ b/Corgibytes.Freshli.Lib.Test/fixtures/csharp/config/packages.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Corgibytes.Freshli.Lib.Test/fixtures/csharp/csproj/Project.csproj b/Corgibytes.Freshli.Lib.Test/fixtures/csharp/csproj/Project.csproj new file mode 100644 index 00000000..13a3e368 --- /dev/null +++ b/Corgibytes.Freshli.Lib.Test/fixtures/csharp/csproj/Project.csproj @@ -0,0 +1,21 @@ + + + Exe + net5.0 + 1.0.0 + dev-$([System.DateTime]::Now.ToString("yyyyMMddTHHmm")) + 9 + + + + + + + + + + + PreserveNewest + + + diff --git a/Corgibytes.Freshli.Lib/ManifestService.cs b/Corgibytes.Freshli.Lib/ManifestService.cs index d322a72b..7c838162 100644 --- a/Corgibytes.Freshli.Lib/ManifestService.cs +++ b/Corgibytes.Freshli.Lib/ManifestService.cs @@ -1,9 +1,6 @@ -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; -using System.Reflection; -using NLog; namespace Corgibytes.Freshli.Lib { @@ -22,9 +19,6 @@ public IEnumerable SelectFindersFor(string analysisPath, if (finder.GetManifestFilenames(analysisPath).Any()) { yield return finder; - - // TODO: Remove this break to add support for multiple manifests from different providers - yield break; } } } diff --git a/Corgibytes.Freshli.Lib/Runner.cs b/Corgibytes.Freshli.Lib/Runner.cs index 28dd26ec..f403a0a9 100644 --- a/Corgibytes.Freshli.Lib/Runner.cs +++ b/Corgibytes.Freshli.Lib/Runner.cs @@ -53,8 +53,7 @@ public IList Run(string analysisPath, DateTimeOffset asOf) asOf, abstractManifestFinders, fileHistoryFinder - // TODO: Remove the call to `Take(1)` to support results from multiple manifest files - ).Take(1).ToList(); + ).ToList(); } DotNetEnv.Env.Load(); @@ -90,9 +89,6 @@ private IEnumerable ProcessManifestFiles(string analysisPath, DateTi ).ToList(); yield return new ScanResult(manifestFile, metricsResults); - - // TODO: Remove this break to enable multi-manifest file support, I _think_ ^_^ - yield break; } } } From e9cba0116ea2a159f708c1b4739c539d7ce6e57a Mon Sep 17 00:00:00 2001 From: Mike Dougherty Date: Wed, 31 May 2023 16:53:27 -0400 Subject: [PATCH 3/3] increase the threshold for duplicate code Resolves #628 --- .codeclimate.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.codeclimate.yml b/.codeclimate.yml index a107b39e..2ebdcf75 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -4,7 +4,13 @@ checks: method-lines: config: threshold: 30 - +engines: + duplication: + enabled: true + config: + languages: + csharp: + mass_threshold: 70 # default is 60 exclude_patterns: - "**/obj/" - "Corgibytes.Freshli.Lib.Test/"