Skip to content

Commit

Permalink
Added functionality for configuring default naming options for differ…
Browse files Browse the repository at this point in the history
…ent catalogs.

Breaking change: Added NugetFeedPluginCatalogOptions and changed NugetFeedPluginCatalog to use the options class instead of NugetPluginCatalogOptions.
  • Loading branch information
mikoskinen committed Dec 30, 2020
1 parent c728a0f commit 39a45a2
Show file tree
Hide file tree
Showing 15 changed files with 363 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ public class NugetFeedPluginCatalog : IPluginCatalog
private readonly HashSet<string> _pluginAssemblyNames = new HashSet<string>();

private List<NugetPackagePluginCatalog> _pluginCatalogs = new List<NugetPackagePluginCatalog>();
private readonly NugetPluginCatalogOptions _options;
private readonly NugetFeedPluginCatalogOptions _options;

public string PackagesFolder { get; }

public NugetFeedPluginCatalog(NuGetFeed packageFeed, string searchTerm = null,
bool includePrereleases = false, int maxPackages = 128,
string packagesFolder = null, Action<TypeFinderCriteriaBuilder> configureFinder = null, Dictionary<string, TypeFinderCriteria> criterias = null, NugetPluginCatalogOptions options = null)
string packagesFolder = null, Action<TypeFinderCriteriaBuilder> configureFinder = null, Dictionary<string, TypeFinderCriteria> criterias = null, NugetFeedPluginCatalogOptions options = null)
{
_packageFeed = packageFeed;
_searchTerm = searchTerm;
Expand All @@ -46,7 +46,7 @@ public NugetFeedPluginCatalog(NuGetFeed packageFeed, string searchTerm = null,
criterias = new Dictionary<string, TypeFinderCriteria>();
}

_options = options ?? new NugetPluginCatalogOptions();
_options = options ?? new NugetFeedPluginCatalogOptions();

if (configureFinder != null)
{
Expand Down Expand Up @@ -93,7 +93,7 @@ public async Task Initialize()

foreach (var packageAndRepo in packages)
{
var options = new NugetPluginCatalogOptions() { TypeFinderOptions = _options.TypeFinderOptions };
var options = new NugetPluginCatalogOptions() { TypeFinderOptions = _options.TypeFinderOptions, PluginNameOptions = _options.PluginNameOptions};

var packageCatalog = new NugetPackagePluginCatalog(packageAndRepo.Package.Identity.Id, packageAndRepo.Package.Identity.Version.ToString(),
_includePrereleases, _packageFeed, PackagesFolder, options: options);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System;
using NuGet.Common;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.Catalogs.NuGet.PackageManagement;
using Weikio.PluginFramework.TypeFinding;

namespace Weikio.PluginFramework.Catalogs.NuGet
{
public class NugetFeedPluginCatalogOptions
{
/// <summary>
/// Gets or sets the function which is used to create the logger for Nuget activities
/// </summary>
public Func <ILogger> LoggerFactory { get; set; } = Defaults.LoggerFactory;

/// <summary>
/// Gets or sets the <see cref="TypeFinderOptions"/>.
/// </summary>
public TypeFinderOptions TypeFinderOptions { get; set; } = new TypeFinderOptions();

/// <summary>
/// Gets or sets how the plugin names and version should be defined. <seealso cref="PluginNameOptions"/>.
/// </summary>
public PluginNameOptions PluginNameOptions { get; set; } = Defaults.PluginNameOptions;

public static class Defaults
{
/// <summary>
/// Gets or sets the default function which is used to create the logger for PluginLoadContextOptions
/// </summary>
public static Func<ILogger> LoggerFactory { get; set; } = () => new ConsoleLogger();

public static PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public async Task Initialize()

foreach (var pluginAssemblyFilePath in _pluginAssemblyFilePaths)
{
var options = new AssemblyPluginCatalogOptions { TypeFinderOptions = _options.TypeFinderOptions };
var options = new AssemblyPluginCatalogOptions { TypeFinderOptions = _options.TypeFinderOptions, PluginNameOptions = _options.PluginNameOptions};

var assemblyCatalog = new AssemblyPluginCatalog(pluginAssemblyFilePath, options);
await assemblyCatalog.Initialize();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using NuGet.Common;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.Catalogs.NuGet.PackageManagement;
using Weikio.PluginFramework.TypeFinding;

Expand All @@ -17,12 +18,19 @@ public class NugetPluginCatalogOptions
/// </summary>
public TypeFinderOptions TypeFinderOptions { get; set; } = new TypeFinderOptions();

/// <summary>
/// Gets or sets how the plugin names and version should be defined. <seealso cref="PluginNameOptions"/>.
/// </summary>
public PluginNameOptions PluginNameOptions { get; set; } = Defaults.PluginNameOptions;

public static class Defaults
{
/// <summary>
/// Gets or sets the default function which is used to create the logger for PluginLoadContextOptions
/// </summary>
public static Func<ILogger> LoggerFactory { get; set; } = () => new ConsoleLogger();

public static PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<PackageReference Include="NuGet.Protocol" Version="5.6.0" />
<PackageReference Include="NuGet.Resolver" Version="5.6.0" />
<PackageReference Include="MinVer" Version="2.0.*" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.5"/>
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.5" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,20 @@ public class AssemblyPluginCatalogOptions

[Obsolete("Please use TypeFinderOptions. This will be removed in a future release.")]
public Dictionary<string, TypeFinderCriteria> TypeFinderCriterias = new Dictionary<string, TypeFinderCriteria>();

/// <summary>
/// Gets or sets how the plugin names and version should be defined. <seealso cref="PluginNameOptions"/>.
/// </summary>
public PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions();
public PluginNameOptions PluginNameOptions { get; set; } = Defaults.PluginNameOptions;

/// <summary>
/// Gets or sets the <see cref="TypeFinderOptions"/>.
/// </summary>
public TypeFinderOptions TypeFinderOptions { get; set; } = new TypeFinderOptions();

public static class Defaults
{
public static PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Weikio.PluginFramework.Abstractions;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,12 @@ public class FolderPluginCatalogOptions
/// <summary>
/// Gets or sets how the plugin names and version should be defined. <seealso cref="PluginNameOptions"/>
/// </summary>
public PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions();
public PluginNameOptions PluginNameOptions { get; set; } = Defaults.PluginNameOptions;

public static class Defaults
{
public static PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions();
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class TypePluginCatalogOptions
/// <summary>
/// Gets or sets how the plugin names and version should be defined. <seealso cref="PluginNameOptions"/>.
/// </summary>
public PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions();
public PluginNameOptions PluginNameOptions { get; set; } = Defaults.PluginNameOptions;

[Obsolete("Please use TypeFinderOptions. This will be removed in a future release.")]
public Dictionary<string, TypeFinderCriteria> TypeFinderCriterias = new Dictionary<string, TypeFinderCriteria>();
Expand All @@ -27,5 +27,10 @@ public class TypePluginCatalogOptions
/// Gets or sets the <see cref="ITypeFindingContext"/>.
/// </summary>
public ITypeFindingContext TypeFindingContext { get; set; } = null;

public static class Defaults
{
public static PluginNameOptions PluginNameOptions { get; set; } = new PluginNameOptions();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Threading.Tasks;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.Catalogs;
using Weikio.PluginFramework.Catalogs.NuGet;
using Xunit;

namespace PluginFramework.Catalogs.NuGet.Tests
Expand Down Expand Up @@ -70,5 +71,51 @@ public async Task CanTag()
// Assert
Assert.Equal("MockSolutions", plugin.Tag);
}

[Fact]
public async Task CanConfigureNamingOptions()
{
var options = new NugetFeedPluginCatalogOptions()
{
PluginNameOptions = new PluginNameOptions() { PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" }
};

// Arrange
var feed = new NuGetFeed("nuget.org", "https://api.nuget.org/v3/index.json");
var catalog = new NugetFeedPluginCatalog(feed, searchTerm: "tags:mocking", maxPackages: 1, configureFinder: configure =>
{
configure.HasName("Moq.Range");
}, options: options);

// Act
await catalog.Initialize();
var plugin = catalog.Single();

// Assert
Assert.EndsWith("Modified", plugin.Name);
}

[Fact]
public async Task CanConfigureDefaultNamingOptions()
{
NugetFeedPluginCatalogOptions.Defaults.PluginNameOptions = new PluginNameOptions()
{
PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified"
};

// Arrange
var feed = new NuGetFeed("nuget.org", "https://api.nuget.org/v3/index.json");
var catalog = new NugetFeedPluginCatalog(feed, searchTerm: "tags:mocking", maxPackages: 1, configureFinder: configure =>
{
configure.HasName("Moq.Range");
});

// Act
await catalog.Initialize();
var plugin = catalog.Single();

// Assert
Assert.EndsWith("Modified", plugin.Name);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using System.Threading.Tasks;
using Weikio.PluginFramework.Abstractions;
using Weikio.PluginFramework.Catalogs;
using Weikio.PluginFramework.Catalogs.NuGet;
using Xunit;

namespace PluginFramework.Catalogs.NuGet.Tests
Expand Down Expand Up @@ -50,7 +51,7 @@ public async Task InstallPackageWithoutDepencencies()
Assert.StartsWith("2.9.0", plugins[0].Version.ToString());
AssertAssemblyFrameWork(".NETStandard,Version=v2.0", catalog.Single().Assembly);
}

[Fact]
public async Task CanTag()
{
Expand All @@ -69,6 +70,48 @@ public async Task CanTag()
Assert.Equal("CustomTag", plugin.Tag);
}

[Fact]
public async Task CanConfigureNamingOptions()
{
var options = new NugetPluginCatalogOptions()
{
PluginNameOptions = new PluginNameOptions() { PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" }
};

// Arrange
var catalog = new NugetPackagePluginCatalog("Serilog", "2.9.0", configureFinder: configure =>
{
configure.HasName("Serilog.Core.Logger");
}, options: options);

// Act
await catalog.Initialize();
var plugin = catalog.Single();

// Assert
Assert.EndsWith("Modified", plugin.Name);
}

[Fact]
public async Task CanConfigureDefaultNamingOptions()
{
NugetPluginCatalogOptions.Defaults.PluginNameOptions =
new PluginNameOptions() { PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified" };

// Arrange
var catalog = new NugetPackagePluginCatalog("Serilog", "2.9.0", configureFinder: configure =>
{
configure.HasName("Serilog.Core.Logger");
});

// Act
await catalog.Initialize();
var plugin = catalog.Single();

// Assert
Assert.EndsWith("Modified", plugin.Name);
}

[Fact]
public async Task InstallPackageWithDepencencies()
{
Expand Down Expand Up @@ -136,7 +179,6 @@ public async Task InstallPackageFromFeed()
Assert.NotEmpty(plugins);
}


[Fact]
public async Task InstallPackageFromFeedUsingFeedName()
{
Expand All @@ -155,7 +197,8 @@ public async Task InstallPackageFromFeedUsingFeedName()
public async Task InstallPackageFromFeedUsingCustomNuGetConfig()
{
// Arrange
var catalog = new NugetPackagePluginCatalog("Serilog", "2.9.0", packageFeed: new NuGetFeed("nuget.org_test"), packagesFolder: _packagesFolderInTestsBin);
var catalog = new NugetPackagePluginCatalog("Serilog", "2.9.0", packageFeed: new NuGetFeed("nuget.org_test"),
packagesFolder: _packagesFolderInTestsBin);

// Act
await catalog.Initialize();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,63 @@ public async Task CanConfigureNamingOptions()
}
}

[Fact]
public async Task CanConfigureDefaultNamingOptions()
{
AssemblyPluginCatalogOptions.Defaults.PluginNameOptions = new PluginNameOptions()
{
PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified"
};

var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll");

await catalog.Initialize();

var allPlugins = catalog.GetPlugins();

foreach (var plugin in allPlugins)
{
Assert.EndsWith("Modified", plugin.Name);
}
}

[Fact]
public async Task CanOverrideDefaultNamingOptions()
{
AssemblyPluginCatalogOptions.Defaults.PluginNameOptions = new PluginNameOptions()
{
PluginNameGenerator = (nameOptions, type) => type.FullName + "Modified"
};

var options = new AssemblyPluginCatalogOptions()
{
PluginNameOptions = new PluginNameOptions()
{
PluginNameGenerator = (nameOptions, type) => type.FullName + "Overridden"
}
};

var catalog = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly1.dll");
var catalog2 = new AssemblyPluginCatalog(@"..\..\..\..\..\Assemblies\bin\netstandard2.0\TestAssembly2.dll", options);

await catalog.Initialize();
await catalog2.Initialize();

var catalog1Plugins = catalog.GetPlugins();

foreach (var plugin in catalog1Plugins)
{
Assert.EndsWith("Modified", plugin.Name);
}

var catalog2Plugins = catalog2.GetPlugins();

foreach (var plugin in catalog2Plugins)
{
Assert.EndsWith("Overridden", plugin.Name);
}
}

[Fact]
public async Task ByDefaultOnlyContainsPublicNonAbstractClasses()
{
Expand Down
Loading

0 comments on commit 39a45a2

Please sign in to comment.