Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public CSharpAmqpServiceGeneratorSettings()
CodeGeneratorSettings,
[
new EmbededResourceTemplateProvider(GetType().Assembly, $"{asmName}.TemplatesAmqp"),
.. DefaultTemplateFactory.CreateProviders(CodeGeneratorSettings,
.. DefaultTemplateFactory.CreateProviders(
[
typeof(CSharpClientGeneratorSettings).Assembly,
typeof(NJsonSchema.CodeGeneration.CSharp.CSharpGenerator).Assembly
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
<_Temporary Include="**/*.nswag" Exclude="%(OpenApiReference.Options)">
<DocumentDir>$(ProjectDir)%(RecursiveDir)</DocumentDir>
</_Temporary>
<_Temporary Update="@(_Temporary)" Condition="'$(AcgApiDocumentDir)' == 'true'">
<_Temporary Update="@(_Temporary)" Condition="'$(AcgApiDocumentDir)' != ''">
<DocumentDir>$([MSBuild]::EnsureTrailingSlash('$(AcgApiDocumentDir)'))</DocumentDir>
</_Temporary>

Expand Down
8 changes: 0 additions & 8 deletions src/ApiCodeGenerator.OpenApi/CSharpClientContentGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,5 @@ namespace ApiCodeGenerator.OpenApi
internal sealed class CSharpClientContentGenerator
: ContentGeneratorBase<CSharpClientContentGenerator, CSharpClientGenerator, CSharpClientGeneratorSettings>
{
public override string Generate()
{
Generator.Settings.CodeGeneratorSettings.TemplateFactory =
new DefaultTemplateFactory(
Generator.Settings.CodeGeneratorSettings,
[typeof(CSharpClientGenerator).Assembly, typeof(NJsonSchema.CodeGeneration.CSharp.CSharpGenerator).Assembly]);
return base.Generate();
}
}
}
14 changes: 14 additions & 0 deletions src/ApiCodeGenerator.OpenApi/CSharpClientGeneratorSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace ApiCodeGenerator.OpenApi;

public class CSharpClientGeneratorSettings : NSwag.CodeGeneration.CSharp.CSharpClientGeneratorSettings
{
public CSharpClientGeneratorSettings()
: base()
{
CSharpGeneratorSettings.TemplateFactory = new DefaultTemplateFactory(
CSharpGeneratorSettings,
[
typeof(NSwag.CodeGeneration.CSharp.CSharpClientGenerator).Assembly,
typeof(NJsonSchema.CodeGeneration.CSharp.CSharpGenerator).Assembly]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,5 @@ namespace ApiCodeGenerator.OpenApi
internal sealed class CSharpControllerContentGenerator
: ContentGeneratorBase<CSharpControllerContentGenerator, CSharpControllerGenerator, CSharpControllerGeneratorSettings>
{
public override string Generate()
{
Generator.Settings.CodeGeneratorSettings.TemplateFactory =
new DefaultTemplateFactory(
Generator.Settings.CodeGeneratorSettings,
[typeof(CSharpClientGenerator).Assembly, typeof(NJsonSchema.CodeGeneration.CSharp.CSharpGenerator).Assembly]);
return base.Generate();
}
}
}
15 changes: 15 additions & 0 deletions src/ApiCodeGenerator.OpenApi/CSharpControllerGeneratorSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace ApiCodeGenerator.OpenApi;

public class CSharpControllerGeneratorSettings : NSwag.CodeGeneration.CSharp.CSharpControllerGeneratorSettings
{
public CSharpControllerGeneratorSettings()
: base()
{
CSharpGeneratorSettings.TemplateFactory = new DefaultTemplateFactory(
CodeGeneratorSettings,
[
typeof(NSwag.CodeGeneration.CSharp.CSharpClientGenerator).Assembly,
typeof(NJsonSchema.CodeGeneration.CSharp.CSharpGenerator).Assembly
]);
}
}
34 changes: 20 additions & 14 deletions src/ApiCodeGenerator.OpenApi/DefaultTemplateFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,38 +22,33 @@ namespace ApiCodeGenerator.OpenApi;
public partial class DefaultTemplateFactory : ITemplateFactory
{
private const string BASE_TMPL_SUFFIX = ".base";

private readonly CodeGeneratorSettingsBase _settings;
private readonly ITemplateProvider[] _providers;

private readonly InternalTemplateFactory _internalTemplateFactory;

public DefaultTemplateFactory(CodeGeneratorSettingsBase settings, params Assembly[] assemblies)
: this(settings, CreateProviders(settings, assemblies).ToArray())
: this(settings, CreateProviders(assemblies).ToArray())
{
}

public DefaultTemplateFactory(CodeGeneratorSettingsBase settings, ITemplateProvider[] providers)
{
_settings = settings;
_providers = providers;
_internalTemplateFactory = new(settings, GetLiquidTemplate, GetToolchainVersion);
}

[Obsolete("Use CreateProviders(Assembly[] assemblies)")]
public static IEnumerable<ITemplateProvider> CreateProviders(CodeGeneratorSettingsBase settings, Assembly[] assemblies)
{
if (!string.IsNullOrEmpty(settings.TemplateDirectory))
{
yield return new DirectoryTemplateProvider(settings.TemplateDirectory!);
}
=> CreateProviders(assemblies);

foreach (var assembly in assemblies)
{
yield return new EmbededResourceTemplateProvider(assembly, $"{assembly.GetName().Name}.Templates");
}
}
public static IEnumerable<ITemplateProvider> CreateProviders(Assembly[] assemblies)
=> assemblies.Select(a => new EmbededResourceTemplateProvider(a, $"{a.GetName().Name}.Templates"));

public ITemplate CreateTemplate(string language, string template, object model)
{
IEnumerable<ITemplateProvider> providers = _providers;
IEnumerable<ITemplateProvider> providers = GetProviders();
if (template.EndsWith(BASE_TMPL_SUFFIX))
{
if (model is Fluid.TemplateContext templateContext)
Expand All @@ -78,13 +73,24 @@ public ITemplate CreateTemplate(string language, string template, object model)

private string GetLiquidTemplate(string language, string name)
{
var text = _providers
var text = GetProviders()
.Select(p => p.GetTemplateText(name.TrimEnd('!'), language))
.FirstOrDefault(t => t is not null);

return text ?? string.Empty;
}

private IEnumerable<ITemplateProvider> GetProviders()
{
var providers = _providers.AsEnumerable();
if (!string.IsNullOrEmpty(_settings.TemplateDirectory))
{
providers = providers.Prepend(new DirectoryTemplateProvider(_settings.TemplateDirectory!));
}

return providers;
}

private sealed class InternalTemplateFactory
#if ASYNC_API
: NJsonSchema.CodeGeneration.DefaultTemplateFactory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
<Content Include="asyncApi\**\*.*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Templates\**\*.*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>

<ItemGroup>
Expand Down
17 changes: 17 additions & 0 deletions test/ApiCodeGenerator.AsyncApi.Tests/FunctionalTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,23 @@ public async Task GenerateMultipleClients()
Assert.AreEqual(expected, actual);
}

[TestCaseSource(nameof(TemplateDirectorySource))]
public void TemplateDirectory<T>(T settings)
where T : CSharpGeneratorBaseSettings
{
settings.CodeGeneratorSettings.TemplateDirectory = "Templates";
var template = settings.CodeGeneratorSettings.TemplateFactory.CreateTemplate("CSharp", "File", new());
var actual = template.Render();

Assert.That(actual, Is.EqualTo("overrided"));
}

[SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1204:Static elements should appear before instance elements", Justification = "After tests")]
public static IEnumerable<TestCaseData> TemplateDirectorySource()
{
yield return new TestCaseData(new CSharpClientGeneratorSettings()).SetName($"{nameof(TemplateDirectory)}_Client");
}

private static string[] GetExpectedOperationsCode(string[]? bodyLines) => [
TestHelpers.GetExpectedSummary("Inform about environmental lighting conditions of a particular streetlight.", 4 + 4) +
GetExpectedPublisherCode("ReceiveLightMeasurement", "LightMeasuredPayload", 4 + 4, bodyLines),
Expand Down
1 change: 1 addition & 0 deletions test/ApiCodeGenerator.AsyncApi.Tests/Templates/File.liquid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
overrided
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
<Content Include="swagger\**\*.*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Templates\**\*.*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>

<ItemGroup>
Expand Down
14 changes: 14 additions & 0 deletions test/ApiCodeGenerator.OpenApi.Tests/DefaultTemplateFactoryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,20 @@ public void CallBase()
Assert.AreEqual("template1\ntemplate2\ntemplate3", actual);
}

[Test]
public void TemplateDir()
{
var settings = new NJsonSchema.CodeGeneration.CSharp.CSharpGeneratorSettings();
var src1 = new TestTemplateProvider("template1\n{% template Class.base %}");
var factory = new DefaultTemplateFactory(settings, [src1]);
settings.TemplateFactory = factory;
settings.TemplateDirectory = "Templates";

var actual = factory.CreateTemplate("CSharp", "File", new object()).Render();

Assert.AreEqual("overrided", actual);
}

private class TestTemplateProvider : ITemplateProvider
{
private readonly string _providerKey = Guid.NewGuid().ToString();
Expand Down
19 changes: 18 additions & 1 deletion test/ApiCodeGenerator.OpenApi.Tests/FunctionalTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,18 @@ public async Task GenerateClientInterface_SingleClientFromLastSegmentOfOperation
Assert.That(actual, Does.Contain(expectedClientDeclartion));
}

[System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1204:Static elements should appear before instance elements", Justification = "After tests")]
[TestCaseSource(nameof(TemplateDirectorySource))]
public void TemplateDirectory<T>(T settings)
where T : CSharpGeneratorBaseSettings
{
settings.CodeGeneratorSettings.TemplateDirectory = "Templates";
var template = settings.CodeGeneratorSettings.TemplateFactory.CreateTemplate("CSharp", "File", new());
var actual = template.Render();

Assert.That(actual, Is.EqualTo("overrided"));
}

[SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1204:Static elements should appear before instance elements", Justification = "After tests")]
public static IEnumerable<TestCaseData> TestCaseSource()
{
const string schemaName = "ReplaceChars.json";
Expand Down Expand Up @@ -196,6 +207,12 @@ public static IEnumerable<TestCaseData> TestCaseSource()
.SetName($"{{m}}(\"{replaceParmas}\")");
}

public static IEnumerable<TestCaseData> TemplateDirectorySource()
{
yield return new TestCaseData(new CSharpClientGeneratorSettings()).SetName($"{nameof(TemplateDirectory)}_Client");
yield return new TestCaseData(new CSharpControllerGeneratorSettings()).SetName($"{nameof(TemplateDirectory)}_Controller");
}

private static GenerationTask CreateGenerator(Mock<IFileProvider> fileProviderMock, string settingsJson, string schema)
{
var settings = JObject.Parse(settingsJson);
Expand Down
1 change: 1 addition & 0 deletions test/ApiCodeGenerator.OpenApi.Tests/Templates/File.liquid
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
overrided
Loading