Skip to content

Commit be2c3ff

Browse files
authored
Merge pull request #22 from MobileTeleSystems/hotfix/3.0.0
Fixed TemplateDirectory setting
2 parents 41b2e7e + 8756dfd commit be2c3ff

File tree

13 files changed

+107
-32
lines changed

13 files changed

+107
-32
lines changed

src/ApiCodeGenerator.AsyncApi/Amqp/CSharp/CSharpAmqpServiceGeneratorSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public CSharpAmqpServiceGeneratorSettings()
1111
CodeGeneratorSettings,
1212
[
1313
new EmbededResourceTemplateProvider(GetType().Assembly, $"{asmName}.TemplatesAmqp"),
14-
.. DefaultTemplateFactory.CreateProviders(CodeGeneratorSettings,
14+
.. DefaultTemplateFactory.CreateProviders(
1515
[
1616
typeof(CSharpClientGeneratorSettings).Assembly,
1717
typeof(NJsonSchema.CodeGeneration.CSharp.CSharpGenerator).Assembly

src/ApiCodeGenerator.OpenApi/CSharpClientContentGenerator.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,5 @@ namespace ApiCodeGenerator.OpenApi
88
internal sealed class CSharpClientContentGenerator
99
: ContentGeneratorBase<CSharpClientContentGenerator, CSharpClientGenerator, CSharpClientGeneratorSettings>
1010
{
11-
public override string Generate()
12-
{
13-
Generator.Settings.CodeGeneratorSettings.TemplateFactory =
14-
new DefaultTemplateFactory(
15-
Generator.Settings.CodeGeneratorSettings,
16-
[typeof(CSharpClientGenerator).Assembly, typeof(NJsonSchema.CodeGeneration.CSharp.CSharpGenerator).Assembly]);
17-
return base.Generate();
18-
}
1911
}
2012
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace ApiCodeGenerator.OpenApi;
2+
3+
public class CSharpClientGeneratorSettings : NSwag.CodeGeneration.CSharp.CSharpClientGeneratorSettings
4+
{
5+
public CSharpClientGeneratorSettings()
6+
: base()
7+
{
8+
CSharpGeneratorSettings.TemplateFactory = new DefaultTemplateFactory(
9+
CSharpGeneratorSettings,
10+
[
11+
typeof(NSwag.CodeGeneration.CSharp.CSharpClientGenerator).Assembly,
12+
typeof(NJsonSchema.CodeGeneration.CSharp.CSharpGenerator).Assembly]);
13+
}
14+
}

src/ApiCodeGenerator.OpenApi/CSharpControllerContentGenerator.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,5 @@ namespace ApiCodeGenerator.OpenApi
88
internal sealed class CSharpControllerContentGenerator
99
: ContentGeneratorBase<CSharpControllerContentGenerator, CSharpControllerGenerator, CSharpControllerGeneratorSettings>
1010
{
11-
public override string Generate()
12-
{
13-
Generator.Settings.CodeGeneratorSettings.TemplateFactory =
14-
new DefaultTemplateFactory(
15-
Generator.Settings.CodeGeneratorSettings,
16-
[typeof(CSharpClientGenerator).Assembly, typeof(NJsonSchema.CodeGeneration.CSharp.CSharpGenerator).Assembly]);
17-
return base.Generate();
18-
}
1911
}
2012
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace ApiCodeGenerator.OpenApi;
2+
3+
public class CSharpControllerGeneratorSettings : NSwag.CodeGeneration.CSharp.CSharpControllerGeneratorSettings
4+
{
5+
public CSharpControllerGeneratorSettings()
6+
: base()
7+
{
8+
CSharpGeneratorSettings.TemplateFactory = new DefaultTemplateFactory(
9+
CodeGeneratorSettings,
10+
[
11+
typeof(NSwag.CodeGeneration.CSharp.CSharpClientGenerator).Assembly,
12+
typeof(NJsonSchema.CodeGeneration.CSharp.CSharpGenerator).Assembly
13+
]);
14+
}
15+
}

src/ApiCodeGenerator.OpenApi/DefaultTemplateFactory.cs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,38 +22,33 @@ namespace ApiCodeGenerator.OpenApi;
2222
public partial class DefaultTemplateFactory : ITemplateFactory
2323
{
2424
private const string BASE_TMPL_SUFFIX = ".base";
25-
25+
private readonly CodeGeneratorSettingsBase _settings;
2626
private readonly ITemplateProvider[] _providers;
2727

2828
private readonly InternalTemplateFactory _internalTemplateFactory;
2929

3030
public DefaultTemplateFactory(CodeGeneratorSettingsBase settings, params Assembly[] assemblies)
31-
: this(settings, CreateProviders(settings, assemblies).ToArray())
31+
: this(settings, CreateProviders(assemblies).ToArray())
3232
{
3333
}
3434

3535
public DefaultTemplateFactory(CodeGeneratorSettingsBase settings, ITemplateProvider[] providers)
3636
{
37+
_settings = settings;
3738
_providers = providers;
3839
_internalTemplateFactory = new(settings, GetLiquidTemplate, GetToolchainVersion);
3940
}
4041

42+
[Obsolete("Use CreateProviders(Assembly[] assemblies)")]
4143
public static IEnumerable<ITemplateProvider> CreateProviders(CodeGeneratorSettingsBase settings, Assembly[] assemblies)
42-
{
43-
if (!string.IsNullOrEmpty(settings.TemplateDirectory))
44-
{
45-
yield return new DirectoryTemplateProvider(settings.TemplateDirectory!);
46-
}
44+
=> CreateProviders(assemblies);
4745

48-
foreach (var assembly in assemblies)
49-
{
50-
yield return new EmbededResourceTemplateProvider(assembly, $"{assembly.GetName().Name}.Templates");
51-
}
52-
}
46+
public static IEnumerable<ITemplateProvider> CreateProviders(Assembly[] assemblies)
47+
=> assemblies.Select(a => new EmbededResourceTemplateProvider(a, $"{a.GetName().Name}.Templates"));
5348

5449
public ITemplate CreateTemplate(string language, string template, object model)
5550
{
56-
IEnumerable<ITemplateProvider> providers = _providers;
51+
IEnumerable<ITemplateProvider> providers = GetProviders();
5752
if (template.EndsWith(BASE_TMPL_SUFFIX))
5853
{
5954
if (model is Fluid.TemplateContext templateContext)
@@ -78,13 +73,24 @@ public ITemplate CreateTemplate(string language, string template, object model)
7873

7974
private string GetLiquidTemplate(string language, string name)
8075
{
81-
var text = _providers
76+
var text = GetProviders()
8277
.Select(p => p.GetTemplateText(name.TrimEnd('!'), language))
8378
.FirstOrDefault(t => t is not null);
8479

8580
return text ?? string.Empty;
8681
}
8782

83+
private IEnumerable<ITemplateProvider> GetProviders()
84+
{
85+
var providers = _providers.AsEnumerable();
86+
if (!string.IsNullOrEmpty(_settings.TemplateDirectory))
87+
{
88+
providers = providers.Prepend(new DirectoryTemplateProvider(_settings.TemplateDirectory!));
89+
}
90+
91+
return providers;
92+
}
93+
8894
private sealed class InternalTemplateFactory
8995
#if ASYNC_API
9096
: NJsonSchema.CodeGeneration.DefaultTemplateFactory

test/ApiCodeGenerator.AsyncApi.Tests/ApiCodeGenerator.AsyncApi.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
<Content Include="asyncApi\**\*.*">
1616
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
1717
</Content>
18+
<Content Include="Templates\**\*.*">
19+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
20+
</Content>
1821
</ItemGroup>
1922

2023
<ItemGroup>

test/ApiCodeGenerator.AsyncApi.Tests/FunctionalTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,23 @@ public async Task GenerateMultipleClients()
169169
Assert.AreEqual(expected, actual);
170170
}
171171

172+
[TestCaseSource(nameof(TemplateDirectorySource))]
173+
public void TemplateDirectory<T>(T settings)
174+
where T : CSharpGeneratorBaseSettings
175+
{
176+
settings.CodeGeneratorSettings.TemplateDirectory = "Templates";
177+
var template = settings.CodeGeneratorSettings.TemplateFactory.CreateTemplate("CSharp", "File", new());
178+
var actual = template.Render();
179+
180+
Assert.That(actual, Is.EqualTo("overrided"));
181+
}
182+
183+
[SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1204:Static elements should appear before instance elements", Justification = "After tests")]
184+
public static IEnumerable<TestCaseData> TemplateDirectorySource()
185+
{
186+
yield return new TestCaseData(new CSharpClientGeneratorSettings()).SetName($"{nameof(TemplateDirectory)}_Client");
187+
}
188+
172189
private static string[] GetExpectedOperationsCode(string[]? bodyLines) => [
173190
TestHelpers.GetExpectedSummary("Inform about environmental lighting conditions of a particular streetlight.", 4 + 4) +
174191
GetExpectedPublisherCode("ReceiveLightMeasurement", "LightMeasuredPayload", 4 + 4, bodyLines),
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
overrided

test/ApiCodeGenerator.OpenApi.Tests/ApiCodeGenerator.OpenApi.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
<Content Include="swagger\**\*.*">
1717
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
1818
</Content>
19+
<Content Include="Templates\**\*.*">
20+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
21+
</Content>
1922
</ItemGroup>
2023

2124
<ItemGroup>

test/ApiCodeGenerator.OpenApi.Tests/DefaultTemplateFactoryTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,20 @@ public void CallBase()
3939
Assert.AreEqual("template1\ntemplate2\ntemplate3", actual);
4040
}
4141

42+
[Test]
43+
public void TemplateDir()
44+
{
45+
var settings = new NJsonSchema.CodeGeneration.CSharp.CSharpGeneratorSettings();
46+
var src1 = new TestTemplateProvider("template1\n{% template Class.base %}");
47+
var factory = new DefaultTemplateFactory(settings, [src1]);
48+
settings.TemplateFactory = factory;
49+
settings.TemplateDirectory = "Templates";
50+
51+
var actual = factory.CreateTemplate("CSharp", "File", new object()).Render();
52+
53+
Assert.AreEqual("overrided", actual);
54+
}
55+
4256
private class TestTemplateProvider : ITemplateProvider
4357
{
4458
private readonly string _providerKey = Guid.NewGuid().ToString();

test/ApiCodeGenerator.OpenApi.Tests/FunctionalTests.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,18 @@ public async Task GenerateClientInterface_SingleClientFromLastSegmentOfOperation
129129
Assert.That(actual, Does.Contain(expectedClientDeclartion));
130130
}
131131

132-
[System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1204:Static elements should appear before instance elements", Justification = "After tests")]
132+
[TestCaseSource(nameof(TemplateDirectorySource))]
133+
public void TemplateDirectory<T>(T settings)
134+
where T : CSharpGeneratorBaseSettings
135+
{
136+
settings.CodeGeneratorSettings.TemplateDirectory = "Templates";
137+
var template = settings.CodeGeneratorSettings.TemplateFactory.CreateTemplate("CSharp", "File", new());
138+
var actual = template.Render();
139+
140+
Assert.That(actual, Is.EqualTo("overrided"));
141+
}
142+
143+
[SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1204:Static elements should appear before instance elements", Justification = "After tests")]
133144
public static IEnumerable<TestCaseData> TestCaseSource()
134145
{
135146
const string schemaName = "ReplaceChars.json";
@@ -196,6 +207,12 @@ public static IEnumerable<TestCaseData> TestCaseSource()
196207
.SetName($"{{m}}(\"{replaceParmas}\")");
197208
}
198209

210+
public static IEnumerable<TestCaseData> TemplateDirectorySource()
211+
{
212+
yield return new TestCaseData(new CSharpClientGeneratorSettings()).SetName($"{nameof(TemplateDirectory)}_Client");
213+
yield return new TestCaseData(new CSharpControllerGeneratorSettings()).SetName($"{nameof(TemplateDirectory)}_Controller");
214+
}
215+
199216
private static GenerationTask CreateGenerator(Mock<IFileProvider> fileProviderMock, string settingsJson, string schema)
200217
{
201218
var settings = JObject.Parse(settingsJson);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
overrided

0 commit comments

Comments
 (0)