Skip to content

Commit 68d951e

Browse files
author
Anthony Sneed
authored
Merge pull request #49 from TrackableEntities/helper-action-type
Make context argument of Handlebars helper method strongly typed
2 parents 92eec82 + 9e42672 commit 68d951e

File tree

10 files changed

+30
-19
lines changed

10 files changed

+30
-19
lines changed

README.md

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ Scaffold EF Core models using Handlebars templates.
7171

7272
You can register Handlebars helpers in the `ScaffoldingDesignTimeServices` where setup takes place.
7373
- Create a named tuple as shown with `myHelper` below.
74+
- The `context` parameter of the helper method provides model data injected by the Handlebars scaffolding extension.
7475
- Pass the tuple to the `AddHandlebarsHelpers` extension method.
76+
- To use Handlebars helper defined above, add the following to any of the .hbs files within the CodeTemplates folder: `{{my-helper}}`
7577
- You may register as many helpers as you wish.
7678

7779
You can pass transform functions to `AddHandlebarsTransformers` in order to customize generation of entity type definitions, including class names, constructors and properties.
@@ -93,23 +95,29 @@ public class ScaffoldingDesignTimeServices : IDesignTimeServices
9395
// Add optional Handlebars helpers
9496
services.AddHandlebarsHelpers(myHelper);
9597

96-
// Add optional Handlebars transformers
98+
// Add Handlebars transformer for Country property
9799
services.AddHandlebarsTransformers(
98-
entityNameTransformer: n => n + "Foo",
99-
entityFileNameTransformer: n => n + "Foo",
100-
constructorTransformer: e => new EntityPropertyInfo(e.PropertyType + "Foo", e.PropertyName + "Foo"),
101-
propertyTransformer: e => new EntityPropertyInfo(e.PropertyType, e.PropertyName + "Foo"),
102-
navPropertyTransformer: e => new EntityPropertyInfo(e.PropertyType + "Foo", e.PropertyName + "Foo"));
100+
propertyTransformer: e =>
101+
e.PropertyName == "Country"
102+
? new EntityPropertyInfo("Country", e.PropertyName)
103+
: new EntityPropertyInfo(e.PropertyType, e.PropertyName));
104+
105+
// Add optional Handlebars transformers
106+
//services.AddHandlebarsTransformers(
107+
// entityNameTransformer: n => n + "Foo",
108+
// entityFileNameTransformer: n => n + "Foo",
109+
// constructorTransformer: e => new EntityPropertyInfo(e.PropertyType + "Foo", e.PropertyName + "Foo"),
110+
// propertyTransformer: e => new EntityPropertyInfo(e.PropertyType, e.PropertyName + "Foo"),
111+
// navPropertyTransformer: e => new EntityPropertyInfo(e.PropertyType + "Foo", e.PropertyName + "Foo"));
103112
}
104113

105114
// Sample Handlebars helper
106-
void MyHbsHelper(TextWriter writer, object context, object[] parameters)
115+
void MyHbsHelper(TextWriter writer, Dictionary<string, object> context, object[] parameters)
107116
{
108117
writer.Write("// My Handlebars Helper");
109118
}
110119
}
111120
```
112-
- To use Handlebars helper defined above, add the following to any of the .hbs files within the CodeTemplates folder: `{{my-helper}}`
113121

114122
## Extending the OnModelCreating Method
115123

sample/ScaffoldingSample/Sample.ReadMe.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public class ScaffoldingDesignTimeServices : IDesignTimeServices
5454
}
5555

5656
// Sample Handlebars helper
57-
void MyHbsHelper(TextWriter writer, object context, object[] parameters)
57+
void MyHbsHelper(TextWriter writer, Dictionary<string, object> context, object[] parameters)
5858
{
5959
writer.Write("// My Handlebars Helper");
6060
}

sample/ScaffoldingSample/ScaffoldingDesignTimeServices.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Diagnostics;
34
using System.IO;
45
using EntityFrameworkCore.Scaffolding.Handlebars;
@@ -22,7 +23,7 @@ public void ConfigureDesignTimeServices(IServiceCollection services)
2223
var options = ReverseEngineerOptions.DbContextAndEntities;
2324

2425
// Register Handlebars helper
25-
var myHelper = (helperName: "my-helper", helperFunction: (Action<TextWriter, object, object[]>) MyHbsHelper);
26+
var myHelper = (helperName: "my-helper", helperFunction: (Action<TextWriter, Dictionary<string, object>, object[]>) MyHbsHelper);
2627

2728
// Add Handlebars scaffolding templates
2829
services.AddHandlebarsScaffolding(options);
@@ -47,7 +48,7 @@ public void ConfigureDesignTimeServices(IServiceCollection services)
4748
}
4849

4950
// Sample Handlebars helper
50-
void MyHbsHelper(TextWriter writer, object context, object[] parameters)
51+
void MyHbsHelper(TextWriter writer, Dictionary<string, object> context, object[] parameters)
5152
{
5253
writer.Write("// My Handlebars Helper");
5354
}

src/EntityFrameworkCore.Scaffolding.Handlebars/HbsHelperService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ public class HbsHelperService : IHbsHelperService
1313
/// <summary>
1414
/// Handlebars helpers.
1515
/// </summary>
16-
public Dictionary<string, Action<TextWriter, object, object[]>> Helpers { get; }
16+
public Dictionary<string, Action<TextWriter, Dictionary<string, object>, object[]>> Helpers { get; }
1717

1818
/// <summary>
1919
/// Constructor for the Handlebars helper service.
2020
/// </summary>
2121
/// <param name="helpers">Dictionary of Handlebars helpers.</param>
2222
public HbsHelperService(
23-
Dictionary<string, Action<TextWriter, object, object[]>> helpers)
23+
Dictionary<string, Action<TextWriter, Dictionary<string, object>, object[]>> helpers)
2424
{
2525
Helpers = helpers;
2626
}

src/EntityFrameworkCore.Scaffolding.Handlebars/Helpers/HandlebarsHelpers.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public static class HandlebarsHelpers
1212
/// Get the spaces Handlebars helper.
1313
/// </summary>
1414
/// <returns>Spaces Handlebars helper.</returns>
15-
public static Action<TextWriter, object, object[]> SpacesHelper
15+
public static Action<TextWriter, dynamic, object[]> SpacesHelper
1616
=> (writer, context, parameters) =>
1717
{
1818
var spaces = string.Empty;

src/EntityFrameworkCore.Scaffolding.Handlebars/IHbsHelperService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public interface IHbsHelperService
1212
/// <summary>
1313
/// Handlebars helpers.
1414
/// </summary>
15-
Dictionary<string, Action<TextWriter, object, object[]>> Helpers { get; }
15+
Dictionary<string, Action<TextWriter, Dictionary<string, object>, object[]>> Helpers { get; }
1616

1717
/// <summary>
1818
/// Register Handlebars helpers.

src/EntityFrameworkCore.Scaffolding.Handlebars/ServiceCollectionExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ public static IServiceCollection AddHandlebarsScaffolding(this IServiceCollectio
7272
/// <param name="handlebarsHelpers">Handlebars helpers.</param>
7373
/// <returns>The same service collection so that multiple calls can be chained.</returns>
7474
public static IServiceCollection AddHandlebarsHelpers(this IServiceCollection services,
75-
params (string helperName, Action<TextWriter, object, object[]> helperFunction)[] handlebarsHelpers)
75+
params (string helperName, Action<TextWriter, Dictionary<string, object>, object[]> helperFunction)[] handlebarsHelpers)
7676
{
7777
services.AddSingleton<IHbsHelperService>(provider =>
7878
{
79-
var helpers = new Dictionary<string, Action<TextWriter, object, object[]>>
79+
var helpers = new Dictionary<string, Action<TextWriter, Dictionary<string, object>, object[]>>
8080
{
8181
{Constants.SpacesHelper, HandlebarsHelpers.SpacesHelper}
8282
};

test/Scaffolding.Handlebars.Tests/Fakes/TestProviderCodeGenerator.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ public TestProviderCodeGenerator(ProviderCodeGeneratorDependencies dependencies)
1515
{
1616
}
1717

18+
#pragma warning disable 672
1819
public override MethodCallCodeFragment GenerateUseProvider(string connectionString)
20+
#pragma warning restore 672
1921
=> new MethodCallCodeFragment("UseTestProvider", connectionString);
2022
}
2123
}

test/Scaffolding.Handlebars.Tests/HbsCSharpScaffoldingGeneratorTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions optio
351351
: new NullCSharpEntityTypeGenerator();
352352
})
353353
.AddSingleton<IHbsHelperService>(provider =>
354-
new HbsHelperService(new Dictionary<string, Action<TextWriter, object, object[]>>
354+
new HbsHelperService(new Dictionary<string, Action<TextWriter, Dictionary<string, object>, object[]>>
355355
{
356356
{EntityFrameworkCore.Scaffolding.Handlebars.Helpers.Constants.SpacesHelper, HandlebarsHelpers.SpacesHelper}
357357
}))

test/Scaffolding.Handlebars.Tests/ReverseEngineeringConfigurationTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public void ValidateContextNameInReverseEngineerGenerator(string contextName)
4444
.AddSingleton<IReverseEngineerScaffolder, HbsReverseEngineerScaffolder>()
4545
.AddSingleton<IEntityTypeTransformationService, HbsEntityTypeTransformationService>()
4646
.AddSingleton<IHbsHelperService>(provider => new HbsHelperService(
47-
new Dictionary<string, Action<TextWriter, object, object[]>>
47+
new Dictionary<string, Action<TextWriter, Dictionary<string, object>, object[]>>
4848
{
4949
{Constants.SpacesHelper, HandlebarsHelpers.SpacesHelper}
5050
}))

0 commit comments

Comments
 (0)