From 8f3bc1b8dba1f5158881daa365b2f085e2008b04 Mon Sep 17 00:00:00 2001 From: Adam Ralph Date: Sat, 7 Feb 2015 18:55:11 +0100 Subject: [PATCH 1/5] refactor: simplify conditional, fix whitespace, remove and sort usings --- src/ScriptCs.Core/AssemblyUtility.cs | 13 ++++++------- test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs | 12 +++--------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/ScriptCs.Core/AssemblyUtility.cs b/src/ScriptCs.Core/AssemblyUtility.cs index f2357870..f2a2d1a6 100644 --- a/src/ScriptCs.Core/AssemblyUtility.cs +++ b/src/ScriptCs.Core/AssemblyUtility.cs @@ -1,18 +1,17 @@ using System; +using System.IO; using System.Reflection; - using ScriptCs.Contracts; namespace ScriptCs { - using System.IO; - - public class AssemblyUtility : IAssemblyUtility + public class AssemblyUtility : IAssemblyUtility { public bool IsManagedAssembly(string path) { - if (!Path.IsPathRooted(path) && !(path.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) || - path.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase))) + if (!Path.IsPathRooted(path) && + !path.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) && + !path.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase)) { return true; } @@ -43,4 +42,4 @@ public AssemblyName GetAssemblyName(string path) return AssemblyName.GetAssemblyName(path); } } -} \ No newline at end of file +} diff --git a/test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs b/test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs index 0e50c115..be156c2c 100644 --- a/test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs +++ b/test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs @@ -1,16 +1,10 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using ScriptCs.Contracts; +using Should; +using Xunit; namespace ScriptCs.Tests { - using System.IO; - using Contracts; - using Xunit; - using Should; - public class AssemblyUtilityTests { public class TheIsManagedAssemblyMethod From ddca0e743fe17c257439578bb0897dcc56cef9f1 Mon Sep 17 00:00:00 2001 From: Adam Ralph Date: Sat, 7 Feb 2015 19:33:23 +0100 Subject: [PATCH 2/5] green: add scenario Packages.PackageContainsAFrameworkAssemblyReference --- ScriptCs.sln | 5 ++- test/ScriptCs.Tests.Acceptance/Packages.cs | 31 ++++++++++++++++++ .../ScriptCs.Tests.Acceptance.csproj | 4 +++ .../FrameworkAssemblyReferencer.1.0.0.nupkg | Bin 0 -> 2505 bytes 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 test/ScriptCs.Tests.Acceptance/Packages.cs create mode 100644 test/ScriptCs.Tests.Acceptance/Support/Gallery/FrameworkAssemblyReferencer.1.0.0.nupkg diff --git a/ScriptCs.sln b/ScriptCs.sln index b1d3dd0e..ef4d90bc 100644 --- a/ScriptCs.sln +++ b/ScriptCs.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30501.0 +VisualStudioVersion = 12.0.31101.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScriptCs", "src\ScriptCs\ScriptCs.csproj", "{25080671-1A80-4041-B9C7-260578FF4849}" EndProject @@ -37,6 +37,9 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScriptCs.Engine.Mono.Tests", "test\ScriptCs.Engine.Mono.Tests\ScriptCs.Engine.Mono.Tests.csproj", "{D0723C2D-D3B4-40B7-8E5A-84FB3A6E5092}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScriptCs.Tests.Acceptance", "test\ScriptCs.Tests.Acceptance\ScriptCs.Tests.Acceptance.csproj", "{10684649-2922-41F5-AB9B-20B127CBF92C}" + ProjectSection(ProjectDependencies) = postProject + {25080671-1A80-4041-B9C7-260578FF4849} = {25080671-1A80-4041-B9C7-260578FF4849} + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{B138045D-DC04-4A04-A2BA-F771173BCC32}" ProjectSection(SolutionItems) = preProject diff --git a/test/ScriptCs.Tests.Acceptance/Packages.cs b/test/ScriptCs.Tests.Acceptance/Packages.cs new file mode 100644 index 00000000..acd813a2 --- /dev/null +++ b/test/ScriptCs.Tests.Acceptance/Packages.cs @@ -0,0 +1,31 @@ +namespace ScriptCs.Tests.Acceptance +{ + using System; + using System.Reflection; + using ScriptCs.Tests.Acceptance.Support; + using Should; + using Should.Core.Assertions; + using Xbehave; + + public static class Packages + { + [Scenario] + public static void PackageContainsAFrameworkAssemblyReference(ScenarioDirectory directory, Exception exception) + { + var scenario = MethodBase.GetCurrentMethod().GetFullName(); + + "Given a simple script" + .f(() => directory = ScenarioDirectory.Create(scenario) + .WriteLine("foo.csx", "Console.WriteLine();")); + + "When I install a package which contains a framework assembly reference" + .f(() => ScriptCsExe.Install("FrameworkAssemblyReferencer", directory)); + + "And I execute the script" + .f(() => exception = Record.Exception(() => ScriptCsExe.Run("foo.csx", directory))); + + "Then there should be no errors" + .f(() => exception.ShouldBeNull()); + } + } +} diff --git a/test/ScriptCs.Tests.Acceptance/ScriptCs.Tests.Acceptance.csproj b/test/ScriptCs.Tests.Acceptance/ScriptCs.Tests.Acceptance.csproj index 71102bf6..3cfc1be8 100644 --- a/test/ScriptCs.Tests.Acceptance/ScriptCs.Tests.Acceptance.csproj +++ b/test/ScriptCs.Tests.Acceptance/ScriptCs.Tests.Acceptance.csproj @@ -45,6 +45,7 @@ + @@ -75,6 +76,9 @@ + + Always + Always diff --git a/test/ScriptCs.Tests.Acceptance/Support/Gallery/FrameworkAssemblyReferencer.1.0.0.nupkg b/test/ScriptCs.Tests.Acceptance/Support/Gallery/FrameworkAssemblyReferencer.1.0.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..25061b6777258cc5a819e88bad1012805ac17dd4 GIT binary patch literal 2505 zcmb_edrTZf99}4BizaGI)jkrI?Gx$U?j3h<#k(We7D{;Jz{X$+ZI{{EyM^1^b!U!) z+N34aM6EQWwh1a)p+-p)|3Ir$p*5CNV~B~CAc@slVxzGtf=%nA@iDvij z`}=+KoB4h7ed{S-l$Js1zwf(BOM07fk5j2+K(0He)zoec`Vni^?{x3|)W(-HjnL%V zPlN9{i&|tq-3&D(DFGK_F>?$J13(d^fY-$Yv1oEIMQ&#e^z)cRAfKcnnxq7fi}7Ks z7P2e?J}C3Ztf(+R-iV4O^Oy`ZFRSvPiT6U*%5nKDsV0uW%*3R3w5sqQh_VDU1t}sn z14WL2k-7++g=4t_R^|he2oYxJ9lYj+*u}6V8ZX0;qBRvG1my;QYYh~kMpgthb0COR z2pGCda4|KGf&#k;th~bxtv1m@md!4tr2n)?R)&}tc+9gv(V$7yNVbM0h!P5pZV`f7 zvjiZTGl%8uHj%UNP=LT;vx?TuoJDY0Y(k#JZi6wNZP&BVdIlzUHiC3x%Y_VJ#NFFK~yo;}c02D7hToP5UX{qWDg- z`sqz#dS=1py;nVlTw~6s`td90`x=*z)&6y(qTZDTANzJ#EIxQ6_@I+-&wlhAojtMQ zaa_M{w6~Kxwqncm{_AZITzDT>FB`pde$TF(UGFYk?-;yi>h*$@td5e>)1Ryy?7J{^ zvbye}B^#zIPJA#tl$AGf>GQVAi63{KsJr*ojwf?ItGH>kn>Ve!lJT5+ZNsYecYfKQ zGhE$#?7)$tyD~q08fLuoX5YD$Ut6Y+92)y$qIj$&)3C5dPWDAmFu%S@M9Lh6*iN09a+RBQD4Jk570fc#S{Z0@*`Jl%VFG=ad?$38Bu2%)5!on>i;N9Xgv}E0IhA=@LlL zQLv#A0_?5|mO@N>!WvF*Yf=5A(VBr84RIRE7H_^GDRBaSaq9WWCy1oz*D^xjx-Dd@ zNa?$ExkvS8-Ft3{KN)!c)0g!2k(x|cuZj55Rw(j8KPC$%kHfa88!1CaiVs^Aud03t z7>33+2ZSW|Gew%LTX5X;a>;rP9iC;1s5#9!i2^VrPDffaOLkQH=ggj`#3XNu70DW# zN;;a7YNFyjo%yYi{7I4UR!r;w literal 0 HcmV?d00001 From 1c546d9b729b34c769800ca73193a7c9263e000e Mon Sep 17 00:00:00 2001 From: Adam Ralph Date: Sat, 7 Feb 2015 19:33:54 +0100 Subject: [PATCH 3/5] red: revert 923 AssemblyUtility changes --- src/ScriptCs.Core/AssemblyUtility.cs | 8 -------- test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs | 4 ++-- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/ScriptCs.Core/AssemblyUtility.cs b/src/ScriptCs.Core/AssemblyUtility.cs index f2a2d1a6..5e1b1f9c 100644 --- a/src/ScriptCs.Core/AssemblyUtility.cs +++ b/src/ScriptCs.Core/AssemblyUtility.cs @@ -1,5 +1,4 @@ using System; -using System.IO; using System.Reflection; using ScriptCs.Contracts; @@ -9,13 +8,6 @@ public class AssemblyUtility : IAssemblyUtility { public bool IsManagedAssembly(string path) { - if (!Path.IsPathRooted(path) && - !path.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) && - !path.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase)) - { - return true; - } - try { AssemblyName.GetAssemblyName(path); diff --git a/test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs b/test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs index be156c2c..4e1a8834 100644 --- a/test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs +++ b/test/ScriptCs.Core.Tests/AssemblyUtilityTests.cs @@ -12,9 +12,9 @@ public class TheIsManagedAssemblyMethod private readonly IAssemblyUtility _assemblyUtility = new AssemblyUtility(); [Fact] - public void ShouldReturnTrueWhenThePathIsNotRootedAndDoesNotHaveADllOrExeExtension() + public void ShouldReturnFalseWhenThePathDoesNotPointToAManagedAssembly() { - _assemblyUtility.IsManagedAssembly("System.Data").ShouldBeTrue(); + _assemblyUtility.IsManagedAssembly("ScriptCs.Core.Tests.dll.config").ShouldBeFalse(); } [Fact] From 759560a4d4400c28d6ed22d6cf17da7a218dc9bb Mon Sep 17 00:00:00 2001 From: Adam Ralph Date: Sat, 7 Feb 2015 21:16:33 +0100 Subject: [PATCH 4/5] green: implement scenario Packages.PackageContainsAFrameworkAssemblyReference --- src/ScriptCs.Core/AssemblyResolver.cs | 1 - src/ScriptCs.Core/PackageAssemblyResolver.cs | 7 ++- .../PackageAssemblyResolverTests.cs | 51 +++++++++++++------ 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/ScriptCs.Core/AssemblyResolver.cs b/src/ScriptCs.Core/AssemblyResolver.cs index a129deac..eda96d4b 100644 --- a/src/ScriptCs.Core/AssemblyResolver.cs +++ b/src/ScriptCs.Core/AssemblyResolver.cs @@ -89,7 +89,6 @@ private IEnumerable GetPackageAssemblies(string path) } var assemblies = _packageAssemblyResolver.GetAssemblyNames(path) - .Where(f => _assemblyUtility.IsManagedAssembly(f)) .ToList(); foreach (var packageAssembly in assemblies) diff --git a/src/ScriptCs.Core/PackageAssemblyResolver.cs b/src/ScriptCs.Core/PackageAssemblyResolver.cs index a84016b2..6ddbc29d 100644 --- a/src/ScriptCs.Core/PackageAssemblyResolver.cs +++ b/src/ScriptCs.Core/PackageAssemblyResolver.cs @@ -12,17 +12,21 @@ public class PackageAssemblyResolver : IPackageAssemblyResolver private readonly IFileSystem _fileSystem; private readonly IPackageContainer _packageContainer; private readonly ILog _logger; + private readonly IAssemblyUtility _assemblyUtility; private List _topLevelPackages; - public PackageAssemblyResolver(IFileSystem fileSystem, IPackageContainer packageContainer, ILog logger) + public PackageAssemblyResolver(IFileSystem fileSystem, IPackageContainer packageContainer, ILog logger, IAssemblyUtility assemblyUtility) { Guard.AgainstNullArgument("fileSystem", fileSystem); Guard.AgainstNullArgumentProperty("fileSystem", "PackagesFolder", fileSystem.PackagesFolder); Guard.AgainstNullArgumentProperty("fileSystem", "PackagesFile", fileSystem.PackagesFile); + Guard.AgainstNullArgument("assemblyUtility", assemblyUtility); + _fileSystem = fileSystem; _packageContainer = packageContainer; _logger = logger; + _assemblyUtility = assemblyUtility; } public void SavePackages() @@ -101,6 +105,7 @@ private void LoadFiles( var compatibleFilePaths = compatibleFiles .Select(packageFile => Path.Combine(packageDir, nugetPackage.FullName, packageFile)) + .Where(path => _assemblyUtility.IsManagedAssembly(path)) .Concat(nugetPackage.FrameworkAssemblies); foreach (var path in compatibleFilePaths) diff --git a/test/ScriptCs.Core.Tests/PackageAssemblyResolverTests.cs b/test/ScriptCs.Core.Tests/PackageAssemblyResolverTests.cs index c8db0014..7d01c0ad 100644 --- a/test/ScriptCs.Core.Tests/PackageAssemblyResolverTests.cs +++ b/test/ScriptCs.Core.Tests/PackageAssemblyResolverTests.cs @@ -21,6 +21,7 @@ public class GetAssemblyNamesMethod private readonly Mock _filesystem; private readonly Mock _package; private readonly Mock _packageContainer; + private readonly Mock _assemblyUtility; private readonly List _packageIds; private readonly string _workingDirectory; @@ -56,12 +57,15 @@ public GetAssemblyNamesMethod() _packageContainer = new Mock(); _packageContainer.Setup(i => i.FindReferences(It.IsAny())).Returns(_packageIds); _packageContainer.Setup(i => i.FindPackage(It.IsAny(), It.IsAny())).Returns(_package.Object); + + _assemblyUtility = new Mock(); + _assemblyUtility.Setup(u => u.IsManagedAssembly(It.IsAny())).Returns(true); } [Fact] public void WhenManyPackagesAreMatchedAllMatchingDllsWithUniquePathsShouldBeReturned() { - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); _packageIds.Add(new PackageReference("testId2", VersionUtility.ParseFrameworkName("net40"), new Version("3.0"))); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); @@ -84,7 +88,7 @@ public void WhenManyPackagesAreMatchedAllMatchingDllsShouldBeReturned() _packageContainer.Setup(i => i.FindPackage(It.IsAny(), It.Is(x => x.PackageId == "testId2"))).Returns(p.Object); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); found.ShouldNotBeEmpty(); @@ -100,7 +104,7 @@ public void WhenPackageIsMatchedItsNonMatchingDllsShouldBeExcluded() It.Is(x => x.FullName == VersionUtility.ParseFrameworkName("net40").FullName))) .Returns(new List { "test.dll" }); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); @@ -128,7 +132,7 @@ public void WhenManyPackagesAreMatchedAllNonMatchingDllsShouldBeExcluded() _packageContainer.Setup(i => i.FindPackage(It.IsAny(), It.Is(x => x.PackageId == "testId2"))).Returns(p.Object); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); @@ -139,7 +143,7 @@ public void WhenManyPackagesAreMatchedAllNonMatchingDllsShouldBeExcluded() [Fact] public void WhenDllsAreMatchedDllFilePathsAreCorrectlyConcatenated() { - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory); @@ -156,7 +160,7 @@ public void WhenNoPackagesAreFoundShouldLogWarning() _packageContainer.Setup(i => i.FindPackage(It.IsAny(), It.IsAny())) .Returns>(null); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); // act resolver.GetAssemblyNames(_workingDirectory); @@ -176,7 +180,7 @@ public void WhenPackagesAreFoundButNoMatchingDllsExistShouldLogWarning() // arrange _package.Setup(i => i.GetCompatibleDlls(It.IsAny())).Returns>(null); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); // act resolver.GetAssemblyNames(_workingDirectory); @@ -194,7 +198,7 @@ public void WhenPackagesAreFoundButNoMatchingDllsExistShouldLogWarning() [Fact] public void WhenPackageDirectoryDoesNotExistShouldReturnEmptyPackagesList() { - var resolver = new PackageAssemblyResolver(_filesystem.Object, new Mock().Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, new Mock().Object, _logger.Object, _assemblyUtility.Object); _filesystem.Setup(i => i.DirectoryExists(It.IsAny())).Returns(false); var found = resolver.GetAssemblyNames(_workingDirectory); @@ -204,7 +208,7 @@ public void WhenPackageDirectoryDoesNotExistShouldReturnEmptyPackagesList() [Fact] public void WhenPackagesConfigDoesNotExistShouldReturnEmptyPackagesList() { - var resolver = new PackageAssemblyResolver(_filesystem.Object, new Mock().Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, new Mock().Object, _logger.Object, _assemblyUtility.Object); _filesystem.Setup(i => i.FileExists(It.IsAny())).Returns(false); var found = resolver.GetAssemblyNames(_workingDirectory); @@ -227,7 +231,7 @@ public void ShouldLoadAllDependenciesIfPackageHasAny() i => i.FindPackage(It.IsAny(), It.Is(x => x.PackageId == "p2"))) .Returns(p.Object); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); @@ -254,7 +258,7 @@ public void ShouldNotLoadDuplicateDependencies() i => i.FindPackage(It.IsAny(), It.Is(x => x.PackageId == "p2"))) .Returns(p.Object); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); @@ -279,7 +283,7 @@ public void ShouldNotLoadIncompatibleDependenciesDlls() i => i.FindPackage(It.IsAny(), It.Is(x => x.PackageId == "p2"))) .Returns(p.Object); - var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); @@ -287,6 +291,19 @@ public void ShouldNotLoadIncompatibleDependenciesDlls() found.ShouldNotBeEmpty(); found.Count.ShouldEqual(4); } + + [Fact] + public void ShouldIgnoreUnmanagedAssemblies() + { + var resolver = new PackageAssemblyResolver(_filesystem.Object, _packageContainer.Object, _logger.Object, _assemblyUtility.Object); + _packageIds.Add(new PackageReference("testId2", VersionUtility.ParseFrameworkName("net40"), new Version("3.0"))); + _assemblyUtility.Setup(u => u.IsManagedAssembly(It.Is(s => Path.GetFileName(s) == "test.dll"))).Returns(false); + + var found = resolver.GetAssemblyNames(_workingDirectory).ToList(); + + found.ShouldNotBeEmpty(); + found.Count.ShouldEqual(3); + } } public class GetPackagesMethod @@ -294,6 +311,7 @@ public class GetPackagesMethod private Mock _fs; private Mock _pc; private Mock _logger; + private Mock _assemblyUtility; public GetPackagesMethod() { @@ -303,6 +321,7 @@ public GetPackagesMethod() _pc = new Mock(); _logger = new Mock(); + _assemblyUtility = new Mock(); } [Fact] @@ -310,7 +329,7 @@ public void ShouldReturnEmptyIfPackagesConfigDoesNotExist() { _fs.Setup(i => i.FileExists(It.IsAny())).Returns(false); - var resolver = new PackageAssemblyResolver(_fs.Object, _pc.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_fs.Object, _pc.Object, _logger.Object, _assemblyUtility.Object); var result = resolver.GetPackages(@"c:/"); result.ShouldBeEmpty(); @@ -322,7 +341,7 @@ public void ShouldGetReferencesToPackages() _fs.Setup(i => i.FileExists(It.IsAny())).Returns(true); _pc.Setup(i => i.FindReferences(It.IsAny())).Returns(new List { new PackageReference("id", VersionUtility.ParseFrameworkName("net40"), new Version("3.0")) }); - var resolver = new PackageAssemblyResolver(_fs.Object, _pc.Object, _logger.Object); + var resolver = new PackageAssemblyResolver(_fs.Object, _pc.Object, _logger.Object, _assemblyUtility.Object); var result = resolver.GetPackages(@"c:/"); _pc.Verify(i => i.FindReferences(It.IsAny()), Times.Once()); @@ -335,6 +354,7 @@ public class SavePackagesMethod private Mock _fs; private Mock _pc; private Mock _logger; + private Mock _assemblyUtility; public SavePackagesMethod() { @@ -344,11 +364,12 @@ public SavePackagesMethod() _pc = new Mock(); _logger = new Mock(); + _assemblyUtility = new Mock(); } private IPackageAssemblyResolver GetResolver() { - return new PackageAssemblyResolver(_fs.Object, _pc.Object, _logger.Object); + return new PackageAssemblyResolver(_fs.Object, _pc.Object, _logger.Object, _assemblyUtility.Object); } [Fact] From d4c0cf9282c76e14672f50bdc0960a5eb3a5b691 Mon Sep 17 00:00:00 2001 From: Adam Ralph Date: Sat, 7 Feb 2015 23:26:24 +0100 Subject: [PATCH 5/5] refactor: AssemblyResolver and PackageAssemblyResolver internals --- src/ScriptCs.Core/AssemblyResolver.cs | 61 +++++--------- src/ScriptCs.Core/PackageAssemblyResolver.cs | 86 +++++++++----------- 2 files changed, 60 insertions(+), 87 deletions(-) diff --git a/src/ScriptCs.Core/AssemblyResolver.cs b/src/ScriptCs.Core/AssemblyResolver.cs index eda96d4b..75b3a5c8 100644 --- a/src/ScriptCs.Core/AssemblyResolver.cs +++ b/src/ScriptCs.Core/AssemblyResolver.cs @@ -10,14 +10,10 @@ namespace ScriptCs public class AssemblyResolver : IAssemblyResolver { private readonly Dictionary> _assemblyPathCache = new Dictionary>(); - private readonly IFileSystem _fileSystem; - private readonly IPackageAssemblyResolver _packageAssemblyResolver; - - private readonly ILog _logger; - private readonly IAssemblyUtility _assemblyUtility; + private readonly ILog _logger; public AssemblyResolver( IFileSystem fileSystem, @@ -29,11 +25,14 @@ public AssemblyResolver( Guard.AgainstNullArgumentProperty("fileSystem", "PackagesFolder", fileSystem.PackagesFolder); Guard.AgainstNullArgumentProperty("fileSystem", "BinFolder", fileSystem.BinFolder); + Guard.AgainstNullArgument("packageAssemblyResolver", packageAssemblyResolver); + Guard.AgainstNullArgument("assemblyUtility", assemblyUtility); + Guard.AgainstNullArgument("logger", logger); + _fileSystem = fileSystem; _packageAssemblyResolver = packageAssemblyResolver; - _logger = logger; _assemblyUtility = assemblyUtility; - + _logger = logger; } public IEnumerable GetAssemblyPaths(string path, bool binariesOnly = false) @@ -43,21 +42,15 @@ public IEnumerable GetAssemblyPaths(string path, bool binariesOnly = fal List assemblies; if (!_assemblyPathCache.TryGetValue(path, out assemblies)) { - var packageAssemblies = GetPackageAssemblies(path); - var binAssemblies = GetBinAssemblyPaths(path); - - assemblies = packageAssemblies.Union(binAssemblies).ToList(); - + assemblies = GetPackageAssemblyNames(path).Union(GetBinAssemblyPaths(path)).ToList(); _assemblyPathCache.Add(path, assemblies); } - if (binariesOnly) - { - return assemblies.Where( - m => m.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) || m.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase)); - } - - return assemblies; + return binariesOnly + ? assemblies.Where(m => + m.EndsWith(".dll", StringComparison.InvariantCultureIgnoreCase) || + m.EndsWith(".exe", StringComparison.InvariantCultureIgnoreCase)) + : assemblies.ToArray(); } private IEnumerable GetBinAssemblyPaths(string path) @@ -65,38 +58,24 @@ private IEnumerable GetBinAssemblyPaths(string path) var binFolder = Path.Combine(path, _fileSystem.BinFolder); if (!_fileSystem.DirectoryExists(binFolder)) { - return Enumerable.Empty(); + yield break; } - var assemblies = _fileSystem.EnumerateBinaries(binFolder, SearchOption.TopDirectoryOnly) - .Where(f => _assemblyUtility.IsManagedAssembly(f)) - .ToList(); - - foreach (var assembly in assemblies) + foreach (var assembly in _fileSystem.EnumerateBinaries(binFolder, SearchOption.TopDirectoryOnly) + .Where(f => _assemblyUtility.IsManagedAssembly(f))) { _logger.DebugFormat("Found assembly in bin folder: {0}", Path.GetFileName(assembly)); + yield return assembly; } - - return assemblies; } - private IEnumerable GetPackageAssemblies(string path) + private IEnumerable GetPackageAssemblyNames(string path) { - var packagesFolder = Path.Combine(path, _fileSystem.PackagesFolder); - if (!_fileSystem.DirectoryExists(packagesFolder)) + foreach (var assembly in _packageAssemblyResolver.GetAssemblyNames(path)) { - return Enumerable.Empty(); + _logger.DebugFormat("Found package assembly: {0}", Path.GetFileName(assembly)); + yield return assembly; } - - var assemblies = _packageAssemblyResolver.GetAssemblyNames(path) - .ToList(); - - foreach (var packageAssembly in assemblies) - { - _logger.DebugFormat("Found package assembly: {0}", Path.GetFileName(packageAssembly)); - } - - return assemblies; } } } diff --git a/src/ScriptCs.Core/PackageAssemblyResolver.cs b/src/ScriptCs.Core/PackageAssemblyResolver.cs index 6ddbc29d..86819c36 100644 --- a/src/ScriptCs.Core/PackageAssemblyResolver.cs +++ b/src/ScriptCs.Core/PackageAssemblyResolver.cs @@ -13,14 +13,18 @@ public class PackageAssemblyResolver : IPackageAssemblyResolver private readonly IPackageContainer _packageContainer; private readonly ILog _logger; private readonly IAssemblyUtility _assemblyUtility; + private List _topLevelPackages; - public PackageAssemblyResolver(IFileSystem fileSystem, IPackageContainer packageContainer, ILog logger, IAssemblyUtility assemblyUtility) + public PackageAssemblyResolver( + IFileSystem fileSystem, IPackageContainer packageContainer, ILog logger, IAssemblyUtility assemblyUtility) { Guard.AgainstNullArgument("fileSystem", fileSystem); Guard.AgainstNullArgumentProperty("fileSystem", "PackagesFolder", fileSystem.PackagesFolder); Guard.AgainstNullArgumentProperty("fileSystem", "PackagesFile", fileSystem.PackagesFile); + Guard.AgainstNullArgument("packageContainer", packageContainer); + Guard.AgainstNullArgument("logger", logger); Guard.AgainstNullArgument("assemblyUtility", assemblyUtility); _fileSystem = fileSystem; @@ -32,7 +36,6 @@ public PackageAssemblyResolver(IFileSystem fileSystem, IPackageContainer package public void SavePackages() { var packagesFolder = Path.Combine(_fileSystem.CurrentDirectory, _fileSystem.PackagesFolder); - if (!_fileSystem.DirectoryExists(packagesFolder)) { _logger.Info("Packages directory does not exist!"); @@ -44,12 +47,9 @@ public void SavePackages() public IEnumerable GetPackages(string workingDirectory) { - var packageFile = Path.Combine(workingDirectory, _fileSystem.PackagesFile); - var packages = _packageContainer.FindReferences(packageFile).ToList(); - - _topLevelPackages = packages; - - return packages; + var packagesFile = Path.Combine(workingDirectory, _fileSystem.PackagesFile); + _topLevelPackages = _packageContainer.FindReferences(packagesFile).ToList(); + return _topLevelPackages.ToArray(); } public IEnumerable GetAssemblyNames(string workingDirectory) @@ -60,76 +60,70 @@ public IEnumerable GetAssemblyNames(string workingDirectory) return Enumerable.Empty(); } - var packageFile = Path.Combine(workingDirectory, _fileSystem.PackagesFile); - var packageDir = Path.Combine(workingDirectory, _fileSystem.PackagesFolder); + var packagesFile = Path.Combine(workingDirectory, _fileSystem.PackagesFile); + var packagesFolder = Path.Combine(workingDirectory, _fileSystem.PackagesFolder); - var foundAssemblyPaths = new List(); - - LoadFiles(packageDir, packages, foundAssemblyPaths, _fileSystem.FileExists(packageFile)); - - return foundAssemblyPaths; + var names = new List(); + GetAssemblyNames(packagesFolder, packages, names, _fileSystem.FileExists(packagesFile)); + return names; } - private void LoadFiles( + private void GetAssemblyNames( string packageDir, IEnumerable packageReferences, - List foundAssemblies, - bool strictLoad = true) + ICollection names, + bool strictLoad) { - foreach (var packageRef in packageReferences) + foreach (var packageReference in packageReferences) { - var nugetPackage = _packageContainer.FindPackage(packageDir, packageRef); - if (nugetPackage == null) + var packageObject = _packageContainer.FindPackage(packageDir, packageReference); + if (packageObject == null) { _logger.WarnFormat( CultureInfo.InvariantCulture, "Cannot find: {0} {1}", - packageRef.PackageId, - packageRef.Version); + packageReference.PackageId, + packageReference.Version); continue; } - var compatibleFiles = nugetPackage.GetCompatibleDlls(packageRef.FrameworkName); - if (compatibleFiles == null) + var compatibleDlls = packageObject.GetCompatibleDlls(packageReference.FrameworkName); + if (compatibleDlls == null) { _logger.WarnFormat( CultureInfo.InvariantCulture, "Cannot find compatible binaries for {0} in: {1} {2}", - packageRef.FrameworkName, - packageRef.PackageId, - packageRef.Version); + packageReference.FrameworkName, + packageReference.PackageId, + packageReference.Version); continue; } - var compatibleFilePaths = compatibleFiles - .Select(packageFile => Path.Combine(packageDir, nugetPackage.FullName, packageFile)) + foreach (var name in compatibleDlls + .Select(packageFile => Path.Combine(packageDir, packageObject.FullName, packageFile)) .Where(path => _assemblyUtility.IsManagedAssembly(path)) - .Concat(nugetPackage.FrameworkAssemblies); - - foreach (var path in compatibleFilePaths) + .Concat(packageObject.FrameworkAssemblies) + .Where(name => !names.Contains(name))) { - if (foundAssemblies.Contains(path)) - { - continue; - } - - foundAssemblies.Add(path); - _logger.Debug("Found: " + path); + names.Add(name); + _logger.Debug("Found: " + name); } - if (nugetPackage.Dependencies == null || !nugetPackage.Dependencies.Any() || !strictLoad) + if (packageObject.Dependencies == null || !packageObject.Dependencies.Any() || !strictLoad) { continue; } - var dependencyReferences = nugetPackage.Dependencies - .Where(i => _topLevelPackages.All(x => x.PackageId != i.Id)) - .Select(i => new PackageReference(i.Id, i.FrameworkName, i.Version)); + var dependencyReferences = packageObject.Dependencies + .Where(dependency => + _topLevelPackages.All(topLevelPackage => topLevelPackage.PackageId != dependency.Id)) + .Select(dependency => + new PackageReference(dependency.Id, dependency.FrameworkName, dependency.Version)); - LoadFiles(packageDir, dependencyReferences, foundAssemblies, true); + GetAssemblyNames(packageDir, dependencyReferences, names, true); } } } -} \ No newline at end of file +}