Skip to content

Commit 7ca523f

Browse files
committed
Merge branch 'Hedi-s-feature/customize-context-file-name' into master
2 parents 373d94d + 740319e commit 7ca523f

8 files changed

+176
-8
lines changed

src/EntityFrameworkCore.Scaffolding.Handlebars/HbsCSharpModelGenerator.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ public class HbsCSharpModelGenerator : CSharpModelGenerator
4848
/// </summary>
4949
protected virtual IEntityTypeTransformationService EntityTypeTransformationService { get; }
5050

51+
/// <summary>
52+
/// Service for transforming context definitions.
53+
/// </summary>
54+
protected IContextTransformationService ContextTransformationService { get; }
55+
5156
/// <summary>
5257
/// CSharp helper.
5358
/// </summary>
@@ -64,6 +69,7 @@ public class HbsCSharpModelGenerator : CSharpModelGenerator
6469
/// <param name="dbContextTemplateService">Template service for DbContext generator.</param>
6570
/// <param name="entityTypeTemplateService">Template service for the entity types generator.</param>
6671
/// <param name="entityTypeTransformationService">Service for transforming entity definitions.</param>
72+
/// <param name="contextTransformationService">Service for transforming context definitions.</param>
6773
/// <param name="cSharpHelper">CSharp helper.</param>
6874
/// <param name="options">Handlebar scaffolding options.</param>
6975
public HbsCSharpModelGenerator(
@@ -75,6 +81,7 @@ public HbsCSharpModelGenerator(
7581
[NotNull] IDbContextTemplateService dbContextTemplateService,
7682
[NotNull] IEntityTypeTemplateService entityTypeTemplateService,
7783
[NotNull] IEntityTypeTransformationService entityTypeTransformationService,
84+
[NotNull] IContextTransformationService contextTransformationService,
7885
[NotNull] ICSharpHelper cSharpHelper,
7986
[NotNull] IOptions<HandlebarsScaffoldingOptions> options)
8087
: base(dependencies, cSharpDbContextGenerator, cSharpEntityTypeGenerator)
@@ -84,6 +91,7 @@ public HbsCSharpModelGenerator(
8491
DbContextTemplateService = dbContextTemplateService;
8592
EntityTypeTemplateService = entityTypeTemplateService;
8693
EntityTypeTransformationService = entityTypeTransformationService;
94+
ContextTransformationService = contextTransformationService;
8795
CSharpHelper = cSharpHelper;
8896
_options = options;
8997
}
@@ -120,7 +128,7 @@ public override ScaffoldedModel GenerateModel(IModel model, ModelCodeGenerationO
120128
options.UseDataAnnotations,
121129
options.SuppressConnectionStringWarning);
122130

123-
var dbContextFileName = options.ContextName + FileExtension;
131+
var dbContextFileName = ContextTransformationService.TransformContextFileName(options.ContextName) + FileExtension;
124132
resultingFiles.ContextFile = new ScaffoldedFile
125133
{
126134
Path = options.ContextDir != null
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System;
2+
namespace EntityFrameworkCore.Scaffolding.Handlebars
3+
{
4+
/// <summary>
5+
/// Default service for transforming context definitions.
6+
/// </summary>
7+
public class HbsContextTransformationService : IContextTransformationService
8+
{
9+
/// <summary>
10+
/// Context file name transformer.
11+
/// </summary>
12+
public Func<string, string> ContextFileNameTransformer { get; }
13+
14+
/// <summary>
15+
/// HbsContextTransformationService constructor.
16+
/// </summary>
17+
/// <param name="contextFileNameTransformer">Context file name transformer.</param>
18+
public HbsContextTransformationService(
19+
Func<string, string> contextFileNameTransformer = null)
20+
{
21+
ContextFileNameTransformer = contextFileNameTransformer;
22+
}
23+
24+
/// <summary>
25+
/// Transform context file name.
26+
/// </summary>
27+
/// <param name="contextFileName">Context file name.</param>
28+
/// <returns>Transformed context file name.</returns>
29+
public string TransformContextFileName(string contextFileName) =>
30+
ContextFileNameTransformer?.Invoke(contextFileName) ?? contextFileName;
31+
}
32+
}

src/EntityFrameworkCore.Scaffolding.Handlebars/HbsTypeScriptModelGenerator.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
// Modifications copyright(C) 2019 Tony Sneed.
55

6+
using System.IO;
67
using EntityFrameworkCore.Scaffolding.Handlebars.Internal;
78
using JetBrains.Annotations;
89
using Microsoft.EntityFrameworkCore;
910
using Microsoft.EntityFrameworkCore.Metadata;
1011
using Microsoft.EntityFrameworkCore.Scaffolding;
1112
using Microsoft.EntityFrameworkCore.Scaffolding.Internal;
1213
using Microsoft.Extensions.Options;
13-
using System.IO;
1414

1515
namespace EntityFrameworkCore.Scaffolding.Handlebars
1616
{
@@ -46,6 +46,11 @@ public class HbsTypeScriptModelGenerator : CSharpModelGenerator
4646
/// </summary>
4747
protected virtual IEntityTypeTransformationService EntityTypeTransformationService { get; }
4848

49+
/// <summary>
50+
/// Service for transforming context definitions.
51+
/// </summary>
52+
protected IContextTransformationService ContextTransformationService { get; }
53+
4954
private readonly IOptions<HandlebarsScaffoldingOptions> _options;
5055

5156
/// <summary>
@@ -59,6 +64,7 @@ public class HbsTypeScriptModelGenerator : CSharpModelGenerator
5964
/// <param name="dbContextTemplateService"></param>
6065
/// <param name="entityTypeTemplateService"></param>
6166
/// <param name="entityTypeTransformationService"></param>
67+
/// <param name="contextTransformationService">Service for transforming context definitions.</param>
6268
/// <param name="options">Handlebar scaffolding options</param>
6369
public HbsTypeScriptModelGenerator(
6470
[NotNull] ModelCodeGeneratorDependencies dependencies,
@@ -69,6 +75,7 @@ public HbsTypeScriptModelGenerator(
6975
[NotNull] IDbContextTemplateService dbContextTemplateService,
7076
[NotNull] IEntityTypeTemplateService entityTypeTemplateService,
7177
[NotNull] IEntityTypeTransformationService entityTypeTransformationService,
78+
[NotNull] IContextTransformationService contextTransformationService,
7279
[NotNull] IOptions<HandlebarsScaffoldingOptions> options)
7380
: base(dependencies, cSharpDbContextGenerator, cSharpEntityTypeGenerator)
7481
{
@@ -77,6 +84,7 @@ public HbsTypeScriptModelGenerator(
7784
DbContextTemplateService = dbContextTemplateService;
7885
EntityTypeTemplateService = entityTypeTemplateService;
7986
EntityTypeTransformationService = entityTypeTransformationService;
87+
ContextTransformationService = contextTransformationService;
8088
_options = options;
8189
}
8290

@@ -112,7 +120,7 @@ public override ScaffoldedModel GenerateModel(IModel model, ModelCodeGenerationO
112120
options.UseDataAnnotations,
113121
options.SuppressConnectionStringWarning);
114122

115-
var dbContextFileName = options.ContextName + ".cs";
123+
var dbContextFileName = ContextTransformationService.TransformContextFileName(options.ContextName) + ".cs";
116124
resultingFiles.ContextFile = new ScaffoldedFile
117125
{
118126
Path = options.ContextDir != null
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace EntityFrameworkCore.Scaffolding.Handlebars
2+
{
3+
/// <summary>
4+
/// Service for transforming context definitions.
5+
/// </summary>
6+
public interface IContextTransformationService
7+
{
8+
/// <summary>
9+
/// Transform context file name.
10+
/// </summary>
11+
/// <param name="contextFileName">Context file name.</param>
12+
/// <returns>Transformed entity file name.</returns>
13+
string TransformContextFileName(string contextFileName);
14+
}
15+
}

src/EntityFrameworkCore.Scaffolding.Handlebars/ServiceCollectionExtensions.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,13 +197,15 @@ public static IServiceCollection AddHandlebarsBlockHelpers(this IServiceCollecti
197197
/// <param name="constructorTransformer"></param>
198198
/// <param name="propertyTransformer">Property name transformer.</param>
199199
/// <param name="navPropertyTransformer">Navigation property name transformer.</param>
200+
/// <param name="contextFileNameTransformer">Context file name transformer.</param>
200201
/// <returns>The same service collection so that multiple calls can be chained.</returns>
201202
public static IServiceCollection AddHandlebarsTransformers(this IServiceCollection services,
202203
Func<string, string> entityNameTransformer = null,
203204
Func<string, string> entityFileNameTransformer = null,
204205
Func<EntityPropertyInfo, EntityPropertyInfo> constructorTransformer = null,
205206
Func<EntityPropertyInfo, EntityPropertyInfo> propertyTransformer = null,
206-
Func<EntityPropertyInfo, EntityPropertyInfo> navPropertyTransformer = null)
207+
Func<EntityPropertyInfo, EntityPropertyInfo> navPropertyTransformer = null,
208+
Func<string, string> contextFileNameTransformer = null)
207209
{
208210
services.AddSingleton<IEntityTypeTransformationService>(provider =>
209211
new HbsEntityTypeTransformationService(
@@ -212,6 +214,8 @@ public static IServiceCollection AddHandlebarsTransformers(this IServiceCollecti
212214
constructorTransformer,
213215
propertyTransformer,
214216
navPropertyTransformer));
217+
services.AddSingleton<IContextTransformationService>(provider =>
218+
new HbsContextTransformationService(contextFileNameTransformer));
215219
return services;
216220
}
217221
}

test/Scaffolding.Handlebars.Tests/HbsCSharpScaffoldingGeneratorTests.cs

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,43 @@ public void Save_Should_Write_Entity_Files()
365365
}
366366
}
367367

368+
[Fact]
369+
public void Save_Should_Write_Context_and_Entity_Files_With_Prefix()
370+
{
371+
using (var directory = new TempDirectory())
372+
{
373+
// Arrange
374+
var filenamePrefix = "prefix.";
375+
var scaffolder = CreateScaffolder(ReverseEngineerOptions.DbContextAndEntities, false, filenamePrefix);
376+
var model = scaffolder.ScaffoldModel(
377+
connectionString: Constants.Connections.SqlServerConnection,
378+
databaseOptions: new DatabaseModelFactoryOptions(),
379+
modelOptions: new ModelReverseEngineerOptions(),
380+
codeOptions: new ModelCodeGenerationOptions
381+
{
382+
ContextNamespace = Constants.Parameters.RootNamespace,
383+
ModelNamespace = Constants.Parameters.RootNamespace,
384+
ContextName = Constants.Parameters.ContextName,
385+
ContextDir = Path.Combine(directory.Path, "Contexts"),
386+
UseDataAnnotations = false,
387+
Language = "C#",
388+
});
389+
390+
// Act
391+
var result = scaffolder.Save(model,
392+
Path.Combine(directory.Path, "Models"),
393+
overwriteFiles: false);
394+
395+
// Assert
396+
var expectedContextPath = Path.Combine(directory.Path, "Contexts", $"{filenamePrefix}{Constants.Files.CSharpFiles.DbContextFile}");
397+
var expectedCategoryPath = Path.Combine(directory.Path, "Models", $"{filenamePrefix}{Constants.Files.CSharpFiles.CategoryFile}");
398+
var expectedProductPath = Path.Combine(directory.Path, "Models", $"{filenamePrefix}{ Constants.Files.CSharpFiles.ProductFile}");
399+
Assert.Equal(expectedContextPath, result.ContextFile);
400+
Assert.Equal(expectedCategoryPath, result.AdditionalFiles[0]);
401+
Assert.Equal(expectedProductPath, result.AdditionalFiles[1]);
402+
}
403+
}
404+
368405
[Fact]
369406
public void Save_Should_Write_Context_and_Entity_Files()
370407
{
@@ -401,7 +438,7 @@ public void Save_Should_Write_Context_and_Entity_Files()
401438
}
402439
}
403440

404-
private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions options, bool usePluralizer)
441+
private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions options, bool usePluralizer, string filenamePrefix = null)
405442
{
406443
var fileService = new InMemoryTemplateFileService();
407444
fileService.InputFiles(ContextClassTemplate, ContextImportsTemplate,
@@ -412,7 +449,6 @@ private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions optio
412449
.AddEntityFrameworkDesignTimeServices()
413450
.AddSingleton<IDbContextTemplateService, FakeHbsDbContextTemplateService>()
414451
.AddSingleton<IEntityTypeTemplateService, FakeHbsEntityTypeTemplateService>()
415-
.AddSingleton<IEntityTypeTransformationService, HbsEntityTypeTransformationService>()
416452
.AddSingleton<ITemplateFileService>(fileService)
417453
.AddSingleton<ITemplateLanguageService, FakeCSharpTemplateLanguageService>()
418454
.AddSingleton<IModelCodeGenerator, HbsCSharpModelGenerator>()
@@ -451,6 +487,20 @@ private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions optio
451487
new HbsBlockHelperService(new Dictionary<string, Action<TextWriter, HelperOptions, Dictionary<string, object>, object[]>>()))
452488
.AddSingleton<IReverseEngineerScaffolder, HbsReverseEngineerScaffolder>();
453489

490+
491+
if (string.IsNullOrWhiteSpace(filenamePrefix))
492+
{
493+
services
494+
.AddSingleton<IContextTransformationService, HbsContextTransformationService>()
495+
.AddSingleton<IEntityTypeTransformationService, HbsEntityTypeTransformationService>();
496+
}
497+
else
498+
{
499+
services
500+
.AddSingleton<IContextTransformationService>(y => new HbsContextTransformationService(contextName => $"{filenamePrefix}{contextName}"))
501+
.AddSingleton<IEntityTypeTransformationService>(y => new HbsEntityTypeTransformationService(entityFileNameTransformer: entityName => $"{filenamePrefix}{entityName}"));
502+
}
503+
454504
if (usePluralizer)
455505
services.AddSingleton<IPluralizer, HumanizerPluralizer>();
456506

test/Scaffolding.Handlebars.Tests/HbsTypeScriptScaffoldingGeneratorTests.cs

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,43 @@ public void Save_Should_Write_Entity_Files()
285285
}
286286
}
287287

288+
[Fact]
289+
public void Save_Should_Write_Context_and_Entity_Files_With_Prefix()
290+
{
291+
using (var directory = new TempDirectory())
292+
{
293+
// Arrange
294+
var filenamePrefix = "prefix.";
295+
var scaffolder = CreateScaffolder(ReverseEngineerOptions.DbContextAndEntities, filenamePrefix);
296+
var model = scaffolder.ScaffoldModel(
297+
connectionString: Constants.Connections.SqlServerConnection,
298+
databaseOptions: new DatabaseModelFactoryOptions(),
299+
modelOptions: new ModelReverseEngineerOptions(),
300+
codeOptions: new ModelCodeGenerationOptions
301+
{
302+
ContextNamespace = Constants.Parameters.RootNamespace,
303+
ModelNamespace = Constants.Parameters.RootNamespace,
304+
ContextName = Constants.Parameters.ContextName,
305+
ContextDir = Path.Combine(directory.Path, "Contexts"),
306+
UseDataAnnotations = false,
307+
Language = "C#",
308+
});
309+
310+
// Act
311+
var result = scaffolder.Save(model,
312+
Path.Combine(directory.Path, "Models"),
313+
overwriteFiles: false);
314+
315+
// Assert
316+
var expectedContextPath = Path.Combine(directory.Path, "Contexts", $"{filenamePrefix}{Constants.Files.TypeScriptFiles.DbContextFile}");
317+
var expectedCategoryPath = Path.Combine(directory.Path, "Models", $"{filenamePrefix}{Constants.Files.TypeScriptFiles.CategoryFile}");
318+
var expectedProductPath = Path.Combine(directory.Path, "Models", $"{filenamePrefix}{ Constants.Files.TypeScriptFiles.ProductFile}");
319+
Assert.Equal(expectedContextPath, result.ContextFile);
320+
Assert.Equal(expectedCategoryPath, result.AdditionalFiles[0]);
321+
Assert.Equal(expectedProductPath, result.AdditionalFiles[1]);
322+
}
323+
}
324+
288325
[Fact]
289326
public void Save_Should_Write_Context_and_Entity_Files()
290327
{
@@ -321,7 +358,7 @@ public void Save_Should_Write_Context_and_Entity_Files()
321358
}
322359
}
323360

324-
private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions options)
361+
private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions options, string filenamePrefix = null)
325362
{
326363
var fileService = new InMemoryTemplateFileService();
327364
fileService.InputFiles(ContextClassTemplate, ContextImportsTemplate,
@@ -332,7 +369,6 @@ private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions optio
332369
.AddEntityFrameworkDesignTimeServices()
333370
.AddSingleton<IDbContextTemplateService, FakeHbsDbContextTemplateService>()
334371
.AddSingleton<IEntityTypeTemplateService, FakeHbsEntityTypeTemplateService>()
335-
.AddSingleton<IEntityTypeTransformationService, HbsEntityTypeTransformationService>()
336372
.AddSingleton<ITypeScriptHelper, TypeScriptHelper>()
337373
.AddSingleton<ITemplateFileService>(fileService)
338374
.AddSingleton<ITemplateLanguageService, FakeTypeScriptTemplateLanguageService>()
@@ -373,6 +409,20 @@ private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions optio
373409
new HbsBlockHelperService(new Dictionary<string, Action<TextWriter, HelperOptions, Dictionary<string, object>, object[]>>()))
374410
.AddSingleton<IReverseEngineerScaffolder, HbsReverseEngineerScaffolder>();
375411

412+
413+
if (string.IsNullOrWhiteSpace(filenamePrefix))
414+
{
415+
services
416+
.AddSingleton<IContextTransformationService, HbsContextTransformationService>()
417+
.AddSingleton<IEntityTypeTransformationService, HbsEntityTypeTransformationService>();
418+
}
419+
else
420+
{
421+
services
422+
.AddSingleton<IContextTransformationService>(y => new HbsContextTransformationService(contextName => $"{filenamePrefix}{contextName}"))
423+
.AddSingleton<IEntityTypeTransformationService>(y => new HbsEntityTypeTransformationService(entityFileNameTransformer: entityName => $"{filenamePrefix}{entityName}"));
424+
}
425+
376426
new SqlServerDesignTimeServices().ConfigureDesignTimeServices(services);
377427
var scaffolder = services
378428
.BuildServiceProvider()

test/Scaffolding.Handlebars.Tests/ReverseEngineeringConfigurationTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public void ValidateContextNameInReverseEngineerGenerator(string contextName)
4949
.AddSingleton<IEntityTypeTemplateService, HbsEntityTypeTemplateService>()
5050
.AddSingleton<IReverseEngineerScaffolder, HbsReverseEngineerScaffolder>()
5151
.AddSingleton<IEntityTypeTransformationService, HbsEntityTypeTransformationService>()
52+
.AddSingleton<IContextTransformationService, HbsContextTransformationService>()
5253
.AddSingleton<IHbsHelperService>(provider => new HbsHelperService(
5354
new Dictionary<string, Action<TextWriter, Dictionary<string, object>, object[]>>
5455
{

0 commit comments

Comments
 (0)