Browse Source

Implemented VirtualFileTemplateContributor and added tests.

pull/3792/head
Halil İbrahim Kalkan 6 years ago
parent
commit
07aaaa0469
  1. 4
      framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj
  2. 4
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs
  3. 4
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContributorInitializationContext.cs
  4. 12
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateDefinition.cs
  5. 84
      framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor.cs
  6. 5
      framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj
  7. 9
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs
  8. 1
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/ForgotPasswordEmail.tpl
  9. 1
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/WelcomeEmail/en.tpl
  10. 1
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/WelcomeEmail/tr.tpl
  11. 23
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs
  12. 50
      framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor_Tests.cs

4
framework/src/Volo.Abp.TextTemplating/Volo.Abp.TextTemplating.csproj

@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\configureawait.props" />
<Import Project="..\..\..\common.props" />
@ -15,7 +15,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Core\Volo.Abp.Core.csproj" />
<ProjectReference Include="..\Volo.Abp.VirtualFileSystem\Volo.Abp.VirtualFileSystem.csproj" />
</ItemGroup>
</Project>

4
framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/AbpTextTemplatingModule.cs

@ -2,9 +2,13 @@
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.TextTemplating
{
[DependsOn(
typeof(AbpVirtualFileSystemModule)
)]
public class AbpTextTemplatingModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)

4
framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateContributorInitializationContext.cs

@ -12,8 +12,8 @@ namespace Volo.Abp.TextTemplating
public IServiceProvider ServiceProvider { get; }
public TemplateContributorInitializationContext(
TemplateDefinition templateDefinition,
IServiceProvider serviceProvider)
[NotNull] TemplateDefinition templateDefinition,
[NotNull] IServiceProvider serviceProvider)
{
TemplateDefinition = Check.NotNull(templateDefinition, nameof(templateDefinition));
ServiceProvider = Check.NotNull(serviceProvider, nameof(serviceProvider));

12
framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/TemplateDefinition.cs

@ -22,15 +22,12 @@ namespace Volo.Abp.TextTemplating
[CanBeNull]
public string DefaultCultureName { get; }
public bool SingleTemplateFile { get; } //TODO: ???
public TemplateDefinition(
[NotNull] string name,
Type localizationResource = null,
bool isLayout = false,
string layout = DefaultLayoutPlaceHolder,
string defaultCultureName = null,
bool singleTemplateFile = false)
string defaultCultureName = null)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name));
LocalizationResource = localizationResource;
@ -38,7 +35,12 @@ namespace Volo.Abp.TextTemplating
IsLayout = isLayout;
Layout = layout;
DefaultCultureName = defaultCultureName;
SingleTemplateFile = singleTemplateFile;
}
public virtual TemplateDefinition AddContributor(ITemplateContributor contributor)
{
Contributors.Add(contributor);
return this;
}
}
}

84
framework/src/Volo.Abp.TextTemplating/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor.cs

@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.Threading;
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.TextTemplating.VirtualFiles
{
public class VirtualFileTemplateContributor : ITemplateContributor
{
private readonly string _virtualPath;
private IVirtualFileProvider _virtualFileProvider;
private volatile Dictionary<string, string> _templateDictionary;
private readonly object _syncObj = new object();
public VirtualFileTemplateContributor(string virtualPath)
{
_virtualPath = virtualPath;
}
public void Initialize(TemplateContributorInitializationContext context)
{
_virtualFileProvider = context.ServiceProvider.GetRequiredService<IVirtualFileProvider>();
}
public string GetOrNull([CanBeNull] string cultureName = null)
{
var dictionary = GetTemplateDictionary();
if (cultureName == null)
{
return dictionary.GetOrDefault("__default");
}
else
{
return dictionary.GetOrDefault(cultureName) ??
dictionary.GetOrDefault("__default");
}
}
private Dictionary<string, string> GetTemplateDictionary()
{
if (_templateDictionary != null)
{
return _templateDictionary;
}
lock (_syncObj)
{
if (_templateDictionary != null)
{
return _templateDictionary;
}
var dictionary = new Dictionary<string, string>();
var fileInfo = _virtualFileProvider.GetFileInfo(_virtualPath);
if (!fileInfo.IsDirectory)
{
//TODO: __default to consts
dictionary.Add("__default", fileInfo.ReadAsString());
}
else
{
foreach (var file in _virtualFileProvider.GetDirectoryContents(_virtualPath))
{
if (file.IsDirectory)
{
continue;
}
// TODO: How to normalize file names?
dictionary.Add(file.Name.RemovePostFix(".tpl"), file.ReadAsString());
}
}
_templateDictionary = dictionary;
return dictionary;
}
}
}
}

5
framework/test/Volo.Abp.TextTemplating.Tests/Volo.Abp.TextTemplating.Tests.csproj

@ -7,6 +7,11 @@
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Volo\Abp\TextTemplating\SampleTemplates\**\*.tpl" />
<None Remove="Volo\Abp\TextTemplating\SampleTemplates\**\*.tpl" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.TextTemplating\Volo.Abp.TextTemplating.csproj" />

9
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/AbpTextTemplatingTestModule.cs

@ -1,5 +1,6 @@
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.TextTemplating
{
@ -10,6 +11,12 @@ namespace Volo.Abp.TextTemplating
)]
public class AbpTextTemplatingTestModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpTextTemplatingTestModule>("Volo.Abp.TextTemplating");
});
}
}
}

1
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/ForgotPasswordEmail.tpl

@ -0,0 +1 @@
Please click to the following link to get an email to reset your password!

1
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/WelcomeEmail/en.tpl

@ -0,0 +1 @@
Welcome to the abp.io!

1
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/SampleTemplates/WelcomeEmail/tr.tpl

@ -0,0 +1 @@
abp.io'ya hoşgeldiniz!

23
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/TestTemplateDefinitionProvider.cs

@ -1,17 +1,22 @@
namespace Volo.Abp.TextTemplating
using Volo.Abp.TextTemplating.VirtualFiles;
namespace Volo.Abp.TextTemplating
{
public class TestTemplateDefinitionProvider : TemplateDefinitionProvider
{
public override void Define(ITemplateDefinitionContext context)
{
context
.Add(
new TemplateDefinition(
TestTemplates.TestTemplate1
), new TemplateDefinition(
TestTemplates.TestTemplateLayout1
)
);
context.Add(
new TemplateDefinition(
TestTemplates.TestTemplate1
).AddContributor(
new VirtualFileTemplateContributor("/SampleTemplates/WelcomeEmail")
)
);
context.Add(new TemplateDefinition(
TestTemplates.TestTemplateLayout1
));
}
}
}

50
framework/test/Volo.Abp.TextTemplating.Tests/Volo/Abp/TextTemplating/VirtualFiles/VirtualFileTemplateContributor_Tests.cs

@ -0,0 +1,50 @@
using Shouldly;
using Xunit;
namespace Volo.Abp.TextTemplating.VirtualFiles
{
public class VirtualFileTemplateContributor_Tests : AbpTextTemplatingTestBase
{
[Fact]
public void Should_Get_Localized_Content_By_Culture()
{
var contributor = new VirtualFileTemplateContributor(
"/SampleTemplates/WelcomeEmail"
);
contributor.Initialize(
new TemplateContributorInitializationContext(
new TemplateDefinition("Test"),
ServiceProvider
)
);
contributor
.GetOrNull("en")
.ShouldBe("Welcome to the abp.io!");
contributor
.GetOrNull("tr")
.ShouldBe("abp.io'ya hoşgeldiniz!");
}
[Fact]
public void Should_Get_Non_Localized_Template_Content()
{
var contributor = new VirtualFileTemplateContributor(
"/SampleTemplates/ForgotPasswordEmail.tpl"
);
contributor.Initialize(
new TemplateContributorInitializationContext(
new TemplateDefinition("Test"),
ServiceProvider
)
);
contributor
.GetOrNull()
.ShouldBe("Please click to the following link to get an email to reset your password!");
}
}
}
Loading…
Cancel
Save