Skip to content

Commit

Permalink
Add RepositoryResolverFactory and revert behaviour change with no sea…
Browse files Browse the repository at this point in the history
…rch path
  • Loading branch information
adamreeve committed Jul 8, 2024
1 parent 2bfbfa6 commit 1fe88c9
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 18 deletions.
9 changes: 9 additions & 0 deletions src/Generation/GirLoader/Helper/NullRepositoryResolver.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace GirLoader;

public class NullRepositoryResolver : IRepositoryResolver
{
public Input.Repository? ResolveRepository(string fileName)
{
return null;
}
}
39 changes: 39 additions & 0 deletions src/Generation/GirLoader/Helper/RepositoryResolverFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System.Reflection;

namespace GirLoader;

public class RepositoryResolverFactory
{
private readonly string _platform;
private readonly string? _platformSearchPath;
private readonly Assembly _assembly;

/// <summary>
/// Construct a new RepositoryResolverFactory
/// </summary>
/// <param name="platform">The platform to resolve repositories for</param>
/// <param name="platformSearchPath">Directory containing repository files for this platform.
/// If null, no repositories will be resolved for this platform.</param>
/// <param name="assembly">Assembly containing embedded repository files.
/// These are used as a fallback if no repository file is found in the search path.</param>
public RepositoryResolverFactory(string platform, string? platformSearchPath, Assembly assembly)
{
_platform = platform;
_platformSearchPath = platformSearchPath;
_assembly = assembly;
}

public IRepositoryResolver Create()
{
if (_platformSearchPath == null)
{
return new NullRepositoryResolver();
}

var directoryResolver = new DirectoryRepositoryResolver(_platformSearchPath);
var embeddedResolver = new EmbeddedRepositoryResolver(_assembly, _platform);

return new ChainedRepositoryResolver(
new IRepositoryResolver[] { directoryResolver, embeddedResolver });
}
}
20 changes: 2 additions & 18 deletions src/Generation/GirTool/GenerateCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,8 @@ private static (DeserializedInput, DeserializedInput, DeserializedInput) LoadRep

private static DeserializedInput DeserializeInput(string platformName, string? searchPath, string[] input)
{
var repositoryResolver = GetRepositoryResolver(platformName, searchPath);
var repositoryResolver = new RepositoryResolverFactory(
platformName, searchPath, typeof(GenerateCommand).Assembly).Create();

var inputRepositories = input
.Select(fileName => repositoryResolver.ResolveRepository(fileName))
Expand All @@ -159,23 +160,6 @@ private static DeserializedInput DeserializeInput(string platformName, string? s
return new DeserializedInput(outputRepositories, inputNamespaces);
}

private static IRepositoryResolver GetRepositoryResolver(string platformName, string? searchPath)
{
var assembly = typeof(GenerateCommand).Assembly;
var embeddedResolver = new EmbeddedRepositoryResolver(assembly, platformName);

if (searchPath == null)
{
return embeddedResolver;
}
else
{
var directoryResolver = new DirectoryRepositoryResolver(searchPath);
return new ChainedRepositoryResolver(
new IRepositoryResolver[] { directoryResolver, embeddedResolver });
}
}

private static string GetNamespaceName(GirModel.Namespace ns)
{
return $"{ns.Name}-{ns.Version}";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System.IO;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace GirLoader.Test;

[TestClass, TestCategory("UnitTest")]
public class RepositoryResolverFactoryTests
{
[TestMethod]
public void RepositoriesNotResolvedWithNullSearchPath()
{
var assembly = typeof(RepositoryResolverFactoryTests).Assembly;
var factory = new RepositoryResolverFactory("linux", null, assembly);

var resolver = factory.Create();
var repository = resolver.ResolveRepository("GObject-2.0.gir");

repository.Should().BeNull();
}

[TestMethod]
public void RepositoriesResolvedFromSearchPath()
{
using var directory = new DisposableTempDirectory();
var filePath = Path.Join(directory.Path, "NewLibrary-1.0.gir");
File.WriteAllText(filePath, InputRepositoryHelper.CreateXml("NewLibrary", "1.0"));
var assembly = typeof(RepositoryResolverFactoryTests).Assembly;
var factory = new RepositoryResolverFactory("linux", directory.Path, assembly);

var resolver = factory.Create();
var repository = resolver.ResolveRepository("NewLibrary-1.0.gir");

repository!.Namespace!.Name.Should().Be("NewLibrary");
}

[TestMethod]
public void RepositoriesResolvedFromEmbeddedFilesWhenSearchPathSet()
{
using var directory = new DisposableTempDirectory();
var assembly = typeof(RepositoryResolverFactoryTests).Assembly;
var factory = new RepositoryResolverFactory("linux", directory.Path, assembly);

var resolver = factory.Create();
var repository = resolver.ResolveRepository("GObject-2.0.gir");

repository!.Namespace!.Name.Should().Be("GObject");
}
}

0 comments on commit 1fe88c9

Please sign in to comment.