Browse Source

Cache package repositories.

pull/15/head
mrward 15 years ago
parent
commit
d4fccb2f42
  1. 2
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 11
      src/AddIns/Misc/PackageManagement/Project/Src/IPackageRepositoryCache.cs
  3. 12
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementService.cs
  4. 56
      src/AddIns/Misc/PackageManagement/Project/Src/PackageRepositoryCache.cs
  5. 1
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  6. 6
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageRepositoryFactory.cs
  7. 6
      src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementServiceTests.cs
  8. 79
      src/AddIns/Misc/PackageManagement/Test/Src/PackageRepositoryCacheTests.cs

2
src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj

@ -80,6 +80,8 @@
<Compile Include="Src\Design\FakePackageRepository.cs" /> <Compile Include="Src\Design\FakePackageRepository.cs" />
<Compile Include="Src\Design\FakeProjectManager.cs" /> <Compile Include="Src\Design\FakeProjectManager.cs" />
<Compile Include="Src\Design\WpfDesigner.cs" /> <Compile Include="Src\Design\WpfDesigner.cs" />
<Compile Include="Src\IPackageRepositoryCache.cs" />
<Compile Include="Src\PackageRepositoryCache.cs" />
<Compile Include="Src\PackagesForSelectedPageResult.cs" /> <Compile Include="Src\PackagesForSelectedPageResult.cs" />
<Compile Include="Src\ILicenseAcceptanceService.cs" /> <Compile Include="Src\ILicenseAcceptanceService.cs" />
<Compile Include="Src\InstalledPackagesViewModel.cs" /> <Compile Include="Src\InstalledPackagesViewModel.cs" />

11
src/AddIns/Misc/PackageManagement/Project/Src/IPackageRepositoryCache.cs

@ -0,0 +1,11 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
namespace ICSharpCode.PackageManagement
{
public interface IPackageRepositoryCache : ISharpDevelopPackageRepositoryFactory
{
}
}

12
src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementService.cs

@ -13,26 +13,26 @@ namespace ICSharpCode.PackageManagement
public class PackageManagementService : IPackageManagementService public class PackageManagementService : IPackageManagementService
{ {
PackageManagementOptions options; PackageManagementOptions options;
ISharpDevelopPackageRepositoryFactory packageRepositoryFactory; IPackageRepositoryCache packageRepositoryCache;
IPackageManagerFactory packageManagerFactory; IPackageManagerFactory packageManagerFactory;
IPackageManagementProjectService projectService; IPackageManagementProjectService projectService;
IPackageRepository activePackageRepository; IPackageRepository activePackageRepository;
PackageSource activePackageSource; PackageSource activePackageSource;
public PackageManagementService(PackageManagementOptions options, public PackageManagementService(PackageManagementOptions options,
ISharpDevelopPackageRepositoryFactory packageRepositoryFactory, IPackageRepositoryCache packageRepositoryCache,
IPackageManagerFactory packageManagerFactory, IPackageManagerFactory packageManagerFactory,
IPackageManagementProjectService projectService) IPackageManagementProjectService projectService)
{ {
this.options = options; this.options = options;
this.packageRepositoryFactory = packageRepositoryFactory; this.packageRepositoryCache = packageRepositoryCache;
this.packageManagerFactory = packageManagerFactory; this.packageManagerFactory = packageManagerFactory;
this.projectService = projectService; this.projectService = projectService;
} }
public PackageManagementService() public PackageManagementService()
: this(new PackageManagementOptions(), : this(new PackageManagementOptions(),
new SharpDevelopPackageRepositoryFactory(), new PackageRepositoryCache(),
new SharpDevelopPackageManagerFactory(), new SharpDevelopPackageManagerFactory(),
new PackageManagementProjectService()) new PackageManagementProjectService())
{ {
@ -67,7 +67,7 @@ namespace ICSharpCode.PackageManagement
IPackageRepository GetActivePackageRepository() IPackageRepository GetActivePackageRepository()
{ {
if (activePackageRepository == null) { if (activePackageRepository == null) {
activePackageRepository = packageRepositoryFactory.CreateRepository(ActivePackageSource); activePackageRepository = packageRepositoryCache.CreateRepository(ActivePackageSource);
} }
return activePackageRepository; return activePackageRepository;
} }
@ -141,7 +141,7 @@ namespace ICSharpCode.PackageManagement
IPackageRepository CreatePackageRepository(PackageSource source) IPackageRepository CreatePackageRepository(PackageSource source)
{ {
return packageRepositoryFactory.CreateRepository(source); return packageRepositoryCache.CreateRepository(source);
} }
} }
} }

56
src/AddIns/Misc/PackageManagement/Project/Src/PackageRepositoryCache.cs

@ -0,0 +1,56 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using NuGet;
namespace ICSharpCode.PackageManagement
{
public class PackageRepositoryCache : IPackageRepositoryCache
{
ISharpDevelopPackageRepositoryFactory factory;
Dictionary<PackageSource, IPackageRepository> repositories =
new Dictionary<PackageSource, IPackageRepository>();
public PackageRepositoryCache(ISharpDevelopPackageRepositoryFactory factory)
{
this.factory = factory;
}
public PackageRepositoryCache()
: this(new SharpDevelopPackageRepositoryFactory())
{
}
public IPackageRepository CreateRepository(PackageSource packageSource)
{
IPackageRepository repository = GetExistingRepository(packageSource);
if (repository != null) {
return repository;
}
return CreateNewCachedRepository(packageSource);
}
IPackageRepository GetExistingRepository(PackageSource packageSource)
{
IPackageRepository repository = null;
if (repositories.TryGetValue(packageSource, out repository)) {
return repository;
}
return null;
}
IPackageRepository CreateNewCachedRepository(PackageSource packageSource)
{
IPackageRepository repository = factory.CreateRepository(packageSource);
repositories.Add(packageSource, repository);
return repository;
}
public ISharedPackageRepository CreateSharedRepository(string path)
{
return factory.CreateSharedRepository(path);
}
}
}

1
src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj

@ -110,6 +110,7 @@
<Compile Include="Src\PackageManagementOptionsTests.cs" /> <Compile Include="Src\PackageManagementOptionsTests.cs" />
<Compile Include="Src\PackageManagementOptionsViewModelTests.cs" /> <Compile Include="Src\PackageManagementOptionsViewModelTests.cs" />
<Compile Include="Src\PackageManagementServiceTests.cs" /> <Compile Include="Src\PackageManagementServiceTests.cs" />
<Compile Include="Src\PackageRepositoryCacheTests.cs" />
<Compile Include="Src\PackageRepositoryPathsTests.cs" /> <Compile Include="Src\PackageRepositoryPathsTests.cs" />
<Compile Include="Src\PackageSourceViewModelTests.cs" /> <Compile Include="Src\PackageSourceViewModelTests.cs" />
<Compile Include="Src\PackagesViewModelTests.cs" /> <Compile Include="Src\PackagesViewModelTests.cs" />

6
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/FakePackageRepositoryFactory.cs

@ -9,11 +9,15 @@ using NuGet;
namespace PackageManagement.Tests.Helpers namespace PackageManagement.Tests.Helpers
{ {
public class FakePackageRepositoryFactory : ISharpDevelopPackageRepositoryFactory public class FakePackageRepositoryFactory : IPackageRepositoryCache
{ {
public List<PackageSource> PackageSourcesPassedToCreateRepository public List<PackageSource> PackageSourcesPassedToCreateRepository
= new List<PackageSource>(); = new List<PackageSource>();
public PackageSource FirstPackageSourcePassedToCreateRepository {
get { return PackageSourcesPassedToCreateRepository[0]; }
}
public FakePackageRepository FakePackageRepository = new FakePackageRepository(); public FakePackageRepository FakePackageRepository = new FakePackageRepository();
public Dictionary<PackageSource, FakePackageRepository> FakePackageRepositories = public Dictionary<PackageSource, FakePackageRepository> FakePackageRepositories =

6
src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementServiceTests.cs

@ -125,7 +125,7 @@ namespace PackageManagement.Tests
CreatePackageManagementService(); CreatePackageManagementService();
IPackageRepository activeRepository = packageManagementService.ActivePackageRepository; IPackageRepository activeRepository = packageManagementService.ActivePackageRepository;
PackageSource actualPackageSource = fakePackageRepositoryFactory.PackageSourcesPassedToCreateRepository[0]; PackageSource actualPackageSource = fakePackageRepositoryFactory.FirstPackageSourcePassedToCreateRepository;
Assert.AreEqual(packageSourcesHelper.PackageSource, actualPackageSource); Assert.AreEqual(packageSourcesHelper.PackageSource, actualPackageSource);
} }
@ -287,7 +287,7 @@ namespace PackageManagement.Tests
packageManagementService.ActivePackageSource = expectedPackageSource; packageManagementService.ActivePackageSource = expectedPackageSource;
IPackageRepository repository = packageManagementService.ActivePackageRepository; IPackageRepository repository = packageManagementService.ActivePackageRepository;
var packageSource = fakePackageRepositoryFactory.PackageSourcesPassedToCreateRepository[0]; var packageSource = fakePackageRepositoryFactory.FirstPackageSourcePassedToCreateRepository;
Assert.AreEqual(expectedPackageSource, packageSource); Assert.AreEqual(expectedPackageSource, packageSource);
} }
@ -305,7 +305,7 @@ namespace PackageManagement.Tests
packageManagementService.ActivePackageSource = expectedPackageSource; packageManagementService.ActivePackageSource = expectedPackageSource;
IPackageRepository repository = packageManagementService.ActivePackageRepository; IPackageRepository repository = packageManagementService.ActivePackageRepository;
var packageSource = fakePackageRepositoryFactory.PackageSourcesPassedToCreateRepository[0]; var packageSource = fakePackageRepositoryFactory.FirstPackageSourcePassedToCreateRepository;
Assert.AreEqual(expectedPackageSource, packageSource); Assert.AreEqual(expectedPackageSource, packageSource);
} }

79
src/AddIns/Misc/PackageManagement/Test/Src/PackageRepositoryCacheTests.cs

@ -0,0 +1,79 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.PackageManagement;
using NuGet;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests
{
[TestFixture]
public class PackageRepositoryCacheTests
{
PackageRepositoryCache cache;
FakePackageRepositoryFactory fakePackageRepositoryFactory;
PackageSource nuGetPackageSource;
void CreateCache()
{
nuGetPackageSource = new PackageSource("http://nuget.org", "NuGet");
fakePackageRepositoryFactory = new FakePackageRepositoryFactory();
cache = new PackageRepositoryCache(fakePackageRepositoryFactory);
}
[Test]
public void CreateRepository_CacheCastToISharpDevelopPackageRepositoryFactory_CreatesPackageRepositoryUsingPackageRepositoryFactoryPassedInConstructor()
{
CreateCache();
var factory = cache as ISharpDevelopPackageRepositoryFactory;
IPackageRepository repository = factory.CreateRepository(nuGetPackageSource);
Assert.AreEqual(fakePackageRepositoryFactory.FakePackageRepository, repository);
}
[Test]
public void CreateRepository_PackageSourcePassed_PackageSourceUsedToCreateRepository()
{
CreateCache();
cache.CreateRepository(nuGetPackageSource);
var actualPackageSource = fakePackageRepositoryFactory.FirstPackageSourcePassedToCreateRepository;
Assert.AreEqual(nuGetPackageSource, actualPackageSource);
}
[Test]
public void CreateRepository_RepositoryAlreadyCreatedForPackageSource_NoRepositoryCreated()
{
CreateCache();
cache.CreateRepository(nuGetPackageSource);
fakePackageRepositoryFactory.PackageSourcesPassedToCreateRepository.Clear();
cache.CreateRepository(nuGetPackageSource);
Assert.AreEqual(0, fakePackageRepositoryFactory.PackageSourcesPassedToCreateRepository.Count);
}
[Test]
public void CreateRepository_RepositoryAlreadyCreatedForPackageSource_RepositoryOriginallyCreatedIsReturned()
{
CreateCache();
IPackageRepository originallyCreatedRepository = cache.CreateRepository(nuGetPackageSource);
fakePackageRepositoryFactory.PackageSourcesPassedToCreateRepository.Clear();
IPackageRepository repository = cache.CreateRepository(nuGetPackageSource);
Assert.AreSame(originallyCreatedRepository, repository);
}
[Test]
public void CreatedSharedRepository_PathPassed_PathUsedToCreatedSharedRepository()
{
CreateCache();
FakeSharedPackageRepository repository = cache.CreateSharedRepository("abc") as FakeSharedPackageRepository;
Assert.AreEqual("abc", repository.PathPassedToConstructor);
}
}
}
Loading…
Cancel
Save