Browse Source

Add recent packages to Add Package Reference dialog.

pull/15/head
mrward 15 years ago
parent
commit
6e703ce950
  1. 2
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 5
      src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceView.xaml
  3. 11
      src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceViewModel.cs
  4. 6
      src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementService.cs
  5. 1
      src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementService.cs
  6. 30
      src/AddIns/Misc/PackageManagement/Project/Src/PackageManagementService.cs
  7. 77
      src/AddIns/Misc/PackageManagement/Project/Src/RecentPackageRepository.cs
  8. 31
      src/AddIns/Misc/PackageManagement/Project/Src/RecentPackagesViewModel.cs
  9. 2
      src/AddIns/Misc/PackageManagement/Test/PackageManagement.Tests.csproj
  10. 14
      src/AddIns/Misc/PackageManagement/Test/Src/AddPackageReferenceViewModelTests.cs
  11. 16
      src/AddIns/Misc/PackageManagement/Test/Src/PackageManagementServiceTests.cs
  12. 111
      src/AddIns/Misc/PackageManagement/Test/Src/RecentPackageRepositoryTests.cs
  13. 67
      src/AddIns/Misc/PackageManagement/Test/Src/RecentPackagesViewModelTests.cs

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

@ -143,6 +143,8 @@ @@ -143,6 +143,8 @@
</Compile>
<Compile Include="Src\Pages.cs" />
<Compile Include="Src\ProjectTargetFramework.cs" />
<Compile Include="Src\RecentPackageRepository.cs" />
<Compile Include="Src\RecentPackagesViewModel.cs" />
<Compile Include="Src\RegisteredPackageSource.cs" />
<Compile Include="Src\RegisteredPackageSources.cs" />
<Compile Include="Src\SelectedListBoxItemScrollingBehaviour.cs" />

5
src/AddIns/Misc/PackageManagement/Project/Src/AddPackageReferenceView.xaml

@ -48,6 +48,11 @@ @@ -48,6 +48,11 @@
x:Name="packageUpdatesView"
DataContext="{Binding Path=PackageUpdatesViewModel}"/>
</TabItem>
<TabItem Header="Recent">
<pm:PackagesView
x:Name="recentPackagesView"
DataContext="{Binding Path=RecentPackagesViewModel}"/>
</TabItem>
</TabControl>
</DockPanel>
</Window>

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

@ -14,6 +14,7 @@ namespace ICSharpCode.PackageManagement @@ -14,6 +14,7 @@ namespace ICSharpCode.PackageManagement
InstalledPackagesViewModel installedPackagesViewModel;
AvailablePackagesViewModel availablePackagesViewModel;
PackageUpdatesViewModel packageUpdatesViewModel;
RecentPackagesViewModel recentPackagesViewModel;
public AddPackageReferenceViewModel(
IPackageManagementService packageManagementService,
@ -22,13 +23,15 @@ namespace ICSharpCode.PackageManagement @@ -22,13 +23,15 @@ namespace ICSharpCode.PackageManagement
this.packageManagementService = packageManagementService;
this.packageManagementService.OutputMessagesView.Clear();
installedPackagesViewModel = new InstalledPackagesViewModel(packageManagementService, taskFactory);
availablePackagesViewModel = new AvailablePackagesViewModel(packageManagementService, taskFactory);
installedPackagesViewModel = new InstalledPackagesViewModel(packageManagementService, taskFactory);
packageUpdatesViewModel = new PackageUpdatesViewModel(packageManagementService, taskFactory);
recentPackagesViewModel = new RecentPackagesViewModel(packageManagementService, taskFactory);
installedPackagesViewModel.ReadPackages();
availablePackagesViewModel.ReadPackages();
installedPackagesViewModel.ReadPackages();
packageUpdatesViewModel.ReadPackages();
recentPackagesViewModel.ReadPackages();
}
public InstalledPackagesViewModel InstalledPackagesViewModel {
@ -42,5 +45,9 @@ namespace ICSharpCode.PackageManagement @@ -42,5 +45,9 @@ namespace ICSharpCode.PackageManagement
public PackageUpdatesViewModel PackageUpdatesViewModel {
get { return packageUpdatesViewModel; }
}
public RecentPackagesViewModel RecentPackagesViewModel {
get { return recentPackagesViewModel; }
}
}
}

6
src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementService.cs

@ -133,5 +133,11 @@ namespace ICSharpCode.PackageManagement.Design @@ -133,5 +133,11 @@ namespace ICSharpCode.PackageManagement.Design
public IPackageManagementOutputMessagesView OutputMessagesView {
get { return FakeOutputMessagesView; }
}
public FakePackageRepository FakeRecentPackageRepository = new FakePackageRepository();
public IPackageRepository RecentPackageRepository {
get { return FakeRecentPackageRepository; }
}
}
}

1
src/AddIns/Misc/PackageManagement/Project/Src/IPackageManagementService.cs

@ -15,6 +15,7 @@ namespace ICSharpCode.PackageManagement @@ -15,6 +15,7 @@ namespace ICSharpCode.PackageManagement
IPackageRepository CreateAggregatePackageRepository();
IPackageRepository ActivePackageRepository { get; }
IProjectManager ActiveProjectManager { get; }
IPackageRepository RecentPackageRepository { get; }
void InstallPackage(IPackageRepository repository, IPackage package, IEnumerable<PackageOperation> operations);
void UninstallPackage(IPackageRepository repository, IPackage package);

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

@ -19,6 +19,7 @@ namespace ICSharpCode.PackageManagement @@ -19,6 +19,7 @@ namespace ICSharpCode.PackageManagement
IPackageManagementProjectService projectService;
IPackageRepository activePackageRepository;
PackageSource activePackageSource;
RecentPackageRepository recentPackageRepository;
public PackageManagementService(
PackageManagementOptions options,
@ -70,16 +71,32 @@ namespace ICSharpCode.PackageManagement @@ -70,16 +71,32 @@ namespace ICSharpCode.PackageManagement
}
}
public IPackageRepository ActivePackageRepository {
get { return GetActivePackageRepository(); }
public IPackageRepository RecentPackageRepository {
get {
if (recentPackageRepository == null) {
CreateRecentPackageRepository();
}
return recentPackageRepository;
}
}
IPackageRepository GetActivePackageRepository()
void CreateRecentPackageRepository()
{
if (activePackageRepository == null) {
activePackageRepository = packageRepositoryCache.CreateRepository(ActivePackageSource);
recentPackageRepository = new RecentPackageRepository();
}
public IPackageRepository ActivePackageRepository {
get {
if (activePackageRepository == null) {
CreateActivePackageRepository();
}
return activePackageRepository;
}
return activePackageRepository;
}
void CreateActivePackageRepository()
{
activePackageRepository = packageRepositoryCache.CreateRepository(ActivePackageSource);
}
public IProjectManager ActiveProjectManager {
@ -101,6 +118,7 @@ namespace ICSharpCode.PackageManagement @@ -101,6 +118,7 @@ namespace ICSharpCode.PackageManagement
ISharpDevelopPackageManager packageManager = CreatePackageManager(packageRepository);
packageManager.InstallPackage(package, operations);
projectService.RefreshProjectBrowser();
RecentPackageRepository.AddPackage(package);
OnPackageInstalled();
}

77
src/AddIns/Misc/PackageManagement/Project/Src/RecentPackageRepository.cs

@ -0,0 +1,77 @@ @@ -0,0 +1,77 @@
// 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 System.Linq;
using NuGet;
namespace ICSharpCode.PackageManagement
{
public class RecentPackageRepository : IPackageRepository
{
public const int DefaultMaximumPackagesCount = 20;
List<IPackage> packages = new List<IPackage>();
int maximumPackagesCount = DefaultMaximumPackagesCount;
public RecentPackageRepository()
{
}
public string Source {
get { return "RecentPackages"; }
}
public void AddPackage(IPackage package)
{
RemovePackageIfAlreadyAdded(package);
AddPackageAtBeginning(package);
RemoveLastPackageIfCurrentPackageCountExceedsMaximum();
}
void RemovePackageIfAlreadyAdded(IPackage package)
{
int index = FindPackage(package);
if (index >= 0) {
packages.RemoveAt(index);
}
}
int FindPackage(IPackage package)
{
return packages.FindIndex(p => PackageEqualityComparer.IdAndVersion.Equals(package, p));
}
void AddPackageAtBeginning(IPackage package)
{
packages.Insert(0, package);
}
void RemoveLastPackageIfCurrentPackageCountExceedsMaximum()
{
if (packages.Count > maximumPackagesCount) {
RemoveLastPackage();
}
}
void RemoveLastPackage()
{
packages.RemoveAt(packages.Count - 1);
}
public void RemovePackage(IPackage package)
{
}
public IQueryable<IPackage> GetPackages()
{
return packages.AsQueryable();
}
public int MaximumPackagesCount {
get { return maximumPackagesCount; }
set { maximumPackagesCount = value; }
}
}
}

31
src/AddIns/Misc/PackageManagement/Project/Src/RecentPackagesViewModel.cs

@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
// 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.Linq;
using NuGet;
namespace ICSharpCode.PackageManagement
{
public class RecentPackagesViewModel : PackagesViewModel
{
IPackageRepository recentPackageRepository;
public RecentPackagesViewModel(IPackageManagementService packageManagementService, ITaskFactory taskFactory)
: base(packageManagementService, taskFactory)
{
recentPackageRepository = packageManagementService.RecentPackageRepository;
packageManagementService.PackageInstalled += PackageInstalled;
}
void PackageInstalled(object sender, EventArgs e)
{
ReadPackages();
}
protected override IQueryable<IPackage> GetAllPackages()
{
return recentPackageRepository.GetPackages();
}
}
}

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

@ -123,6 +123,8 @@ @@ -123,6 +123,8 @@
<Compile Include="Src\PackageUpdatesViewModelTests.cs" />
<Compile Include="Src\PackageViewModelTests.cs" />
<Compile Include="Src\PagesTests.cs" />
<Compile Include="Src\RecentPackageRepositoryTests.cs" />
<Compile Include="Src\RecentPackagesViewModelTests.cs" />
<Compile Include="Src\RegisteredPackageSourcesTests.cs" />
<Compile Include="Src\SelectedListBoxItemScrollingBehaviourTests.cs" />
<Compile Include="Src\SharpDevelopPackageManagerFactoryTests.cs" />

14
src/AddIns/Misc/PackageManagement/Test/Src/AddPackageReferenceViewModelTests.cs

@ -98,5 +98,19 @@ namespace PackageManagement.Tests @@ -98,5 +98,19 @@ namespace PackageManagement.Tests
Assert.IsTrue(fakePackageManagementService.FakeOutputMessagesView.IsClearCalled);
}
[Test]
public void RecentPackagesViewModel_RecentRepositoryHasOnePackage_HasOnePackageViewModel()
{
CreatePackageManagementService();
var package = new FakePackage();
package.Id = "Test";
fakePackageManagementService.FakeRecentPackageRepository.FakePackages.Add(package);
CreateViewModel(fakePackageManagementService);
List<FakePackage> expectedPackages = fakePackageManagementService.FakeRecentPackageRepository.FakePackages;
PackageCollectionAssert.AreEqual(expectedPackages, viewModel.RecentPackagesViewModel.PackageViewModels);
}
}
}

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

@ -468,5 +468,21 @@ namespace PackageManagement.Tests @@ -468,5 +468,21 @@ namespace PackageManagement.Tests
Assert.AreEqual(expectedLogger, actualLogger);
}
[Test]
public void InstallPackage_OnePackageOperation_PackageInstalledAddedToRecentPackagesRepository()
{
CreatePackageManagementService();
installPackageHelper.AddPackageInstallOperation();
installPackageHelper.InstallTestPackage();
var recentPackages = packageManagementService.RecentPackageRepository.GetPackages();
var expectedPackages = new FakePackage[] {
installPackageHelper.TestPackage
};
PackageCollectionAssert.AreEqual(expectedPackages, recentPackages);
}
}
}

111
src/AddIns/Misc/PackageManagement/Test/Src/RecentPackageRepositoryTests.cs

@ -0,0 +1,111 @@ @@ -0,0 +1,111 @@
// 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 System.Linq;
using ICSharpCode.PackageManagement;
using ICSharpCode.PackageManagement.Design;
using NuGet;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests
{
[TestFixture]
public class RecentPackageRepositoryTests
{
RecentPackageRepository repository;
void CreateRepository()
{
repository = new RecentPackageRepository();
}
FakePackage AddOnePackageToRepository(string id)
{
var package = new FakePackage(id);
repository.AddPackage(package);
return package;
}
IEnumerable<IPackage> AddTwoDifferentPackagesToRepository()
{
yield return AddOnePackageToRepository("Test.Package.1");
yield return AddOnePackageToRepository("Test.Package.2");
}
IEnumerable<IPackage> AddFourDifferentPackagesToRepository()
{
yield return AddOnePackageToRepository("Test.Package.1");
yield return AddOnePackageToRepository("Test.Package.2");
yield return AddOnePackageToRepository("Test.Package.3");
yield return AddOnePackageToRepository("Test.Package.4");
}
[Test]
public void Source_NewRecentRepositoryCreated_IsRecentPackages()
{
CreateRepository();
Assert.AreEqual("RecentPackages", repository.Source);
}
[Test]
public void GetPackages_RepositoryIsEmptyAndOnePackageAdded_ReturnsPackageAdded()
{
CreateRepository();
var package = AddOnePackageToRepository("Test.Package");
var packages = repository.GetPackages();
var expectedPackages = new FakePackage[] {
package
};
PackageCollectionAssert.AreEqual(expectedPackages, packages);
}
[Test]
public void GetPackages_RepositoryIsEmptyAndTwoDifferentPackagesAdded_ReturnsPackagesInReverseOrderWithLastAddedFirst()
{
CreateRepository();
var packagesAdded = AddTwoDifferentPackagesToRepository();
var packages = repository.GetPackages();
var expectedPackages = packagesAdded.Reverse();
PackageCollectionAssert.AreEqual(expectedPackages, packages);
}
[Test]
public void GetPackages_RepositoryCanHoldThreePackagesAndFourPackagesAdded_ReturnsLastThreePackagesAddedInReverseOrder()
{
CreateRepository();
repository.MaximumPackagesCount = 3;
var packagesAdded = AddFourDifferentPackagesToRepository();
var packages = repository.GetPackages();
var expectedPackages = packagesAdded.Reverse().Take(3);
PackageCollectionAssert.AreEqual(expectedPackages, packages);
}
[Test]
public void GetPackages_RepositoryIsEmptyAndSamePackageIsAddedTwice_OnePackageReturned()
{
CreateRepository();
AddOnePackageToRepository("Test");
var package = AddOnePackageToRepository("Test");
var packages = repository.GetPackages();
var expectedPackages = new FakePackage[] {
package
};
PackageCollectionAssert.AreEqual(expectedPackages, packages);
}
}
}

67
src/AddIns/Misc/PackageManagement/Test/Src/RecentPackagesViewModelTests.cs

@ -0,0 +1,67 @@ @@ -0,0 +1,67 @@
// 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 ICSharpCode.PackageManagement.Design;
using NUnit.Framework;
using PackageManagement.Tests.Helpers;
namespace PackageManagement.Tests
{
[TestFixture]
public class RecentPackagesViewModelTests
{
RecentPackagesViewModel viewModel;
FakePackageManagementService packageManagementService;
FakeTaskFactory taskFactory;
void CreateViewModel()
{
CreatePackageManagementService();
CreateViewModel(packageManagementService);
}
void CreatePackageManagementService()
{
packageManagementService = new FakePackageManagementService();
}
void CreateViewModel(FakePackageManagementService packageManagementService)
{
taskFactory = new FakeTaskFactory();
viewModel = new RecentPackagesViewModel(packageManagementService, taskFactory);
}
void CompleteReadPackagesTask()
{
taskFactory.ExecuteAllFakeTasks();
}
void ClearReadPackagesTasks()
{
taskFactory.ClearAllFakeTasks();
}
[Test]
public void PackageViewModels_PackageIsInstalledAfterRecentPackagesDisplayed_PackagesOnDisplayAreUpdated()
{
CreateViewModel();
viewModel.ReadPackages();
CompleteReadPackagesTask();
var package = new FakePackage("Test");
FakePackageRepository repository = packageManagementService.FakeRecentPackageRepository;
repository.FakePackages.Add(package);
ClearReadPackagesTasks();
packageManagementService.FirePackageInstalled();
CompleteReadPackagesTask();
var expectedPackages = new FakePackage[] {
package
};
PackageCollectionAssert.AreEqual(expectedPackages, viewModel.PackageViewModels);
}
}
}
Loading…
Cancel
Save