Skip to content

Commit

Permalink
Add filtering for gallery and library packages
Browse files Browse the repository at this point in the history
  • Loading branch information
glopesdev committed Sep 3, 2024
1 parent 61aa039 commit ee99810
Show file tree
Hide file tree
Showing 11 changed files with 250 additions and 11 deletions.
4 changes: 2 additions & 2 deletions Bonsai.NuGet.Design/GalleryDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ public GalleryDialog(NuGetFramework projectFramework, string path)
searchComboBox,
prereleaseCheckBox,
() => false,
value => { },
new[] { Constants.GalleryPackageType });
value => { });
packageViewController.SearchPrefix = $"tags:{Constants.GalleryDirectory} ";
packageViewController.PackageTypes = new[] { Constants.GalleryPackageType };
packageViewController.PackageManager.PackageManagerPlugins.Add(new GalleryPackagePlugin(this));
InitializePackageSourceItems();
}
Expand Down
15 changes: 15 additions & 0 deletions Bonsai.NuGet.Design/PackageManagerDialog.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 11 additions & 2 deletions Bonsai.NuGet.Design/PackageManagerDialog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ public PackageManagerDialog(NuGetFramework projectFramework, string path)
searchComboBox,
prereleaseCheckBox,
() => updatesButton.Checked,
value => multiOperationPanel.Visible = value,
Enumerable.Empty<string>());
value => multiOperationPanel.Visible = value);
packageViewController.PackageTypes = new[] { Constants.LibraryPackageType };
packageViewController.PackageManager.PackageManagerPlugins.Add(new ExecutablePackagePlugin(this));
InitializePackageSourceItems();
multiOperationPanel.Visible = false;
Expand Down Expand Up @@ -234,6 +234,15 @@ private void closeButton_Click(object sender, EventArgs e)
{
Close();
}

private void dependencyCheckBox_CheckedChanged(object sender, EventArgs e)
{
var packageType = dependencyCheckBox.Checked
? PackageType.Dependency.Name
: Constants.LibraryPackageType;
packageViewController.PackageTypes = new[] { packageType };
packageViewController.UpdatePackageQuery();
}
}

public enum PackageManagerTab
Expand Down
11 changes: 5 additions & 6 deletions Bonsai.NuGet.Design/PackageViewController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ class PackageViewController

bool loaded;
readonly string packageManagerPath;
readonly IEnumerable<string> packageTypes;
readonly PackageSourceProvider packageSourceProvider;
readonly List<IDisposable> activeRequests;
PackageQuery packageQuery;
Expand Down Expand Up @@ -52,8 +51,7 @@ public PackageViewController(
CueBannerComboBox search,
CheckBox prerelease,
Func<bool> updateFeed,
Action<bool> multiOperationVisible,
IEnumerable<string> packageTypeFilter)
Action<bool> multiOperationVisible)
{
ProjectFramework = projectFramework ?? throw new ArgumentNullException(nameof(projectFramework));
control = owner ?? throw new ArgumentNullException(nameof(owner));
Expand All @@ -65,7 +63,6 @@ public PackageViewController(
prereleaseCheckBox = prerelease ?? throw new ArgumentNullException(nameof(prerelease));
getUpdateFeed = updateFeed ?? throw new ArgumentNullException(nameof(updateFeed));
setMultiOperationVisible = multiOperationVisible ?? throw new ArgumentNullException(nameof(multiOperationVisible));
packageTypes = packageTypeFilter;
control.KeyDown += control_KeyDown;
packageDetails.PackageLinkClicked += packageDetails_PackageLinkClicked;
prereleaseCheckBox.CheckedChanged += prereleaseFilterCheckBox_CheckedChanged;
Expand All @@ -91,6 +88,8 @@ public PackageViewController(

public string SearchPrefix { get; set; }

public IEnumerable<string> PackageTypes { get; set; }

public SourceRepository SelectedRepository { get; set; }

public NuGetFramework ProjectFramework { get; private set; }
Expand Down Expand Up @@ -211,8 +210,8 @@ QueryContinuation<IEnumerable<IPackageSearchMetadata>> GetPackageQuery(string se
QueryContinuation<IEnumerable<IPackageSearchMetadata>> GetPackageQuery(SourceRepository repository, string searchTerm, int pageSize, bool includePrerelease, bool updateFeed)
{
return updateFeed
? new UpdateQuery(repository, PackageManager.LocalRepository, searchTerm, includePrerelease, packageTypes)
: new SearchQuery(repository, searchTerm, pageSize, includePrerelease, packageTypes);
? new UpdateQuery(repository, PackageManager.LocalRepository, searchTerm, includePrerelease, PackageTypes)
: new SearchQuery(repository, searchTerm, pageSize, includePrerelease, PackageTypes);
}

IObservable<Image> GetPackageIcon(Uri iconUrl)
Expand Down
1 change: 1 addition & 0 deletions Bonsai.NuGet/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ public static class Constants
public const string GalleryDirectory = "Gallery";
public const string BonsaiExtension = ".bonsai";
public const string LayoutExtension = ".layout";
public const string LibraryPackageType = "BonsaiLibrary";
public const string GalleryPackageType = "BonsaiGallery";
}
}
2 changes: 1 addition & 1 deletion Bonsai.NuGet/PackageManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public PackageManager(ISettings settings, IPackageSourceProvider packageSourcePr
{
if (packageSourceProvider == null) throw new ArgumentNullException(nameof(packageSourceProvider));
if (localRepository == null) throw new ArgumentNullException(nameof(localRepository));
SourceRepositoryProvider = new SourceRepositoryProvider(packageSourceProvider, Repository.Provider.GetCoreV3());
SourceRepositoryProvider = new SourceRepositoryProvider(packageSourceProvider, Search.Repository.Provider.GetCoreV3());
PathResolver = pathResolver ?? new PackagePathResolver(localRepository.Source);
LocalRepository = SourceRepositoryProvider.CreateRepository(localRepository);
Settings = settings ?? throw new ArgumentNullException(nameof(settings));
Expand Down
98 changes: 98 additions & 0 deletions Bonsai.NuGet/Search/LocalPackageTypeSearchResource.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using NuGet.Common;
using NuGet.Packaging.Core;
using NuGet.Protocol;
using NuGet.Protocol.Core.Types;

namespace Bonsai.NuGet.Search
{
internal class LocalPackageTypeSearchResource : PackageSearchResource
{
readonly FindLocalPackagesResource findLocalPackagesResource;
readonly Lazy<LocalPackageSearchResource> defaultSearchResource;

public LocalPackageTypeSearchResource(FindLocalPackagesResource localResource)
{
findLocalPackagesResource = localResource ?? throw new ArgumentNullException(nameof(localResource));
defaultSearchResource = new Lazy<LocalPackageSearchResource>(
() => new LocalPackageSearchResource(findLocalPackagesResource));
}

public override async Task<IEnumerable<IPackageSearchMetadata>> SearchAsync(
string searchTerm,
SearchFilter filters,
int skip,
int take,
ILogger log,
CancellationToken cancellationToken)
{
LocalPackageSearchResource searchResource;
if (filters?.PackageTypes != null
&& filters.PackageTypes.SingleOrDefault() is string packageType)
{
var wrapperResource = new FindLocalPackageWrapperResource(findLocalPackagesResource, packageType);
searchResource = new LocalPackageSearchResource(wrapperResource);
}
else searchResource = defaultSearchResource.Value;

return await searchResource.SearchAsync(searchTerm, filters, skip, take, log, cancellationToken);
}

class FindLocalPackageWrapperResource : FindLocalPackagesResource
{
readonly FindLocalPackagesResource baseLocalResource;

public FindLocalPackageWrapperResource(FindLocalPackagesResource localResource, string packageType)
{
baseLocalResource = localResource ?? throw new ArgumentNullException(nameof(localResource));
Root = baseLocalResource.Root;
PackageTypeFilter = packageType;
}

public string PackageTypeFilter { get; }

private bool MatchesPackageType(LocalPackageInfo package)
{
var packageTypes = package.Nuspec.GetPackageTypes();
if (packageTypes.Count == 0
&& PackageType.PackageTypeNameComparer.Equals(PackageTypeFilter, PackageType.Dependency.Name))
{
return true;
}

return package.Nuspec
.GetPackageTypes()
.Any(packageType => PackageType.PackageTypeNameComparer.Equals(packageType.Name, PackageTypeFilter));
}

public override IEnumerable<LocalPackageInfo> FindPackagesById(string id, ILogger logger, CancellationToken token)
{
return baseLocalResource.FindPackagesById(id, logger, token);
}

public override LocalPackageInfo GetPackage(Uri path, ILogger logger, CancellationToken token)
{
throw new NotSupportedException();
}

public override LocalPackageInfo GetPackage(PackageIdentity identity, ILogger logger, CancellationToken token)
{
throw new NotSupportedException();
}

public override IEnumerable<LocalPackageInfo> GetPackages(ILogger logger, CancellationToken token)
{
var result = baseLocalResource.GetPackages(logger, token);
if (!string.IsNullOrEmpty(PackageTypeFilter))
{
result = result.Where(MatchesPackageType);
}
return result;
}
}
}
}
28 changes: 28 additions & 0 deletions Bonsai.NuGet/Search/LocalPackageTypeSearchResourceProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using NuGet.Protocol;
using NuGet.Protocol.Core.Types;

namespace Bonsai.NuGet.Search
{
internal class LocalPackageTypeSearchResourceProvider : ResourceProvider
{
public LocalPackageTypeSearchResourceProvider()
: base(typeof(PackageSearchResource), nameof(LocalPackageTypeSearchResourceProvider), nameof(LocalPackageSearchResourceProvider))
{
}

public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token)
{
INuGetResource resource = null;
var localResource = await source.GetResourceAsync<FindLocalPackagesResource>(token);
if (localResource != null)
{
resource = new LocalPackageTypeSearchResource(localResource);
}

return new Tuple<bool, INuGetResource>(resource != null, resource);
}
}
}
32 changes: 32 additions & 0 deletions Bonsai.NuGet/Search/PackageTypeSearchResourceV3.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using NuGet.Common;
using NuGet.Protocol;
using NuGet.Protocol.Core.Types;

namespace Bonsai.NuGet.Search
{
internal class PackageTypeSearchResourceV3 : PackageSearchResource
{
readonly PackageSearchResourceV3 packageSearchResource;

public PackageTypeSearchResourceV3(PackageSearchResourceV3 searchResource)
{
packageSearchResource = searchResource ?? throw new ArgumentNullException(nameof(searchResource));
}

public override Task<IEnumerable<IPackageSearchMetadata>> SearchAsync(string searchTerm, SearchFilter filters, int skip, int take, ILogger log, CancellationToken cancellationToken)
{
if (filters?.PackageTypes != null
&& filters.PackageTypes.SingleOrDefault() is string packageType)
{
searchTerm += "&packageType=" + packageType;
}

return packageSearchResource.SearchAsync(searchTerm, filters, skip, take, log, cancellationToken);
}
}
}
31 changes: 31 additions & 0 deletions Bonsai.NuGet/Search/PackageTypeSearchResourceV3Provider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using NuGet.Protocol;
using NuGet.Protocol.Core.Types;

namespace Bonsai.NuGet.Search
{
internal class PackageTypeSearchResourceV3Provider : ResourceProvider
{
readonly PackageSearchResourceV3Provider searchResourceV3Provider = new();

public PackageTypeSearchResourceV3Provider()
: base(typeof(PackageSearchResource), nameof(PackageTypeSearchResourceV3Provider), nameof(PackageSearchResourceV3Provider))
{
}

public override async Task<Tuple<bool, INuGetResource>> TryCreate(SourceRepository source, CancellationToken token)
{
INuGetResource resource = null;
var result = await searchResourceV3Provider.TryCreate(source, token);
if (result.Item1)
{
var searchResource = (PackageSearchResourceV3)result.Item2;
resource = new PackageTypeSearchResourceV3(searchResource);
}

return new Tuple<bool, INuGetResource>(resource != null, resource);
}
}
}
26 changes: 26 additions & 0 deletions Bonsai.NuGet/Search/Repository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using NuGet.Protocol.Core.Types;

namespace Bonsai.NuGet.Search
{
internal static class Repository
{
public static ProviderFactory Provider => ProviderFactory.Instance;

public class ProviderFactory : global::NuGet.Protocol.Core.Types.Repository.ProviderFactory
{
internal static readonly ProviderFactory Instance = new();

public override IEnumerable<Lazy<INuGetResourceProvider>> GetCoreV3()
{
yield return new Lazy<INuGetResourceProvider>(() => new PackageTypeSearchResourceV3Provider());
yield return new Lazy<INuGetResourceProvider>(() => new LocalPackageTypeSearchResourceProvider());
foreach (var provider in base.GetCoreV3())
{
yield return provider;
}
}
}
}
}

0 comments on commit ee99810

Please sign in to comment.