Skip to content

Commit

Permalink
Logger Message Action support (#200)
Browse files Browse the repository at this point in the history
* initial generator for crud controller log message action

* add sample generator for log message action

* tidied up logger naming consistency

* generate logger message action properties

* clean up series of sonarcloud warnings

* add unit tests for crud controller log message action generator
  • Loading branch information
dpvreony committed Jan 10, 2022
1 parent 5c3b82a commit 679ffb3
Show file tree
Hide file tree
Showing 9 changed files with 220 additions and 12 deletions.
Expand Up @@ -7,7 +7,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Whipstaff.AspNetCore" Version="6.0.45" />
<PackageReference Include="Whipstaff.AspNetCore" Version="6.0.48" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.1" />
</ItemGroup>

Expand Down
Expand Up @@ -33,14 +33,6 @@ protected override string[] GetInterfaceSummary(ReferencedByEntityGenerationMode
/// <inheritdoc />
protected override PropertyDeclarationSyntax[] GetPropertyDeclarations(ReferencedByEntityGenerationModel entityGenerationModel, string prefix)
{
var accessorList = new[]
{
SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),
SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration)
.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),
};

var pocoSummary = GetSummary(new[] { $"Gets or Sets the Foreign Entity for {entityGenerationModel.ClassName}" });

var pocoType = SyntaxFactory.ParseTypeName($"global::System.Collections.Generic.ICollection<EfModels.{entityGenerationModel.EntityType}EfModel>");
Expand Down
@@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace Dhgms.Nucleotide.Generators.Features.Logging
{
public class CrudControllerLoggerMessageActionFeatureFlags
{
}
}
@@ -0,0 +1,14 @@
using Dhgms.Nucleotide.Generators.Generators;
using Dhgms.Nucleotide.Generators.Models;

namespace Dhgms.Nucleotide.Generators.Features.Logging
{
public abstract class CrudControllerLoggerMessageActionGenerator : BaseClassLevelCodeGenerator<CrudControllerLoggerMessageActionFeatureFlags, CrudControllerLoggerMessageActionGeneratorProcessor, IEntityGenerationModel>
{
/// <inheritdoc />
protected override string GetNamespace()
{
return "LoggerMessageActions";
}
}
}
@@ -0,0 +1,138 @@
using System;
using System.Collections.Generic;
using Dhgms.Nucleotide.Generators.GeneratorProcessors;
using Dhgms.Nucleotide.Generators.Models;
using Dhgms.Nucleotide.Generators.PropertyInfo;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace Dhgms.Nucleotide.Generators.Features.Logging
{
public class CrudControllerLoggerMessageActionGeneratorProcessor : BaseClassLevelCodeGeneratorProcessor<IEntityGenerationModel>
{
/// <inheritdoc />
protected override string[] GetClassPrefixes()
{
return Array.Empty<string>();
}

/// <inheritdoc />
protected override string GetClassSuffix()
{
return "LoggerMessageActions";
}

/// <inheritdoc />
protected override IList<string> GetUsings()
{
return new List<string>
{
"System",
"Microsoft.Extensions.Logging",
};
}

/// <inheritdoc />
protected override bool GetWhetherClassShouldBePartialClass()
{
return false;
}

/// <inheritdoc />
protected override bool GetWhetherClassShouldBeSealedClass()
{
return true;
}

/// <inheritdoc />
protected override string[] GetClassLevelCommentSummary(string entityName)
{
return new[]
{
$"Log Message Actions for the {entityName} Controller."
};
}

/// <inheritdoc />
protected override string[] GetClassLevelCommentRemarks(string entityName)
{
return Array.Empty<string>();
}

/// <inheritdoc />
protected override IList<Tuple<string, IList<string>>> GetClassAttributes(IEntityGenerationModel entityDeclaration)
{
return new List<Tuple<string, IList<string>>>();
}

/// <inheritdoc />
protected override IList<string> GetBaseConstructorArguments()
{
return new List<string>();
}

/// <inheritdoc />
protected override MethodDeclarationSyntax[] GetMethodDeclarations(IEntityGenerationModel entityGenerationModel)
{
return Array.Empty<MethodDeclarationSyntax>();
}

/// <inheritdoc />
protected override IEnumerable<PropertyDeclarationSyntax> GetPropertyDeclarations(IEntityGenerationModel entityGenerationModel)
{
var pocoSummary = GetSummary(new[] { $"Gets the Logger Message Action {entityGenerationModel.ClassName}." });

var pocoType = SyntaxFactory.ParseTypeName("global::System.Action<global::Microsoft.Extensions.Logging.ILogger, string, global::System.Exception?>");
var accessorList = new[]
{
SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),
SyntaxFactory.AccessorDeclaration(SyntaxKind.InitAccessorDeclaration)
.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)),
};

var addLongerMessageAction = RoslynGenerationHelpers.GetPropertyDeclarationSyntax(pocoType, "AddEventLogMessageAction", accessorList, pocoSummary);
var deleteLongerMessageAction = RoslynGenerationHelpers.GetPropertyDeclarationSyntax(pocoType, "DeleteEventLogMessageAction", accessorList, pocoSummary);
var listLongerMessageAction = RoslynGenerationHelpers.GetPropertyDeclarationSyntax(pocoType, "ListEventLogMessageAction", accessorList, pocoSummary);
var updateLongerMessageAction = RoslynGenerationHelpers.GetPropertyDeclarationSyntax(pocoType, "UpdateEventLogMessageAction", accessorList, pocoSummary);
var viewLongerMessageAction = RoslynGenerationHelpers.GetPropertyDeclarationSyntax(pocoType, "ViewEventLogMessageAction", accessorList, pocoSummary);

return new []
{
addLongerMessageAction,
deleteLongerMessageAction,
listLongerMessageAction,
updateLongerMessageAction,
viewLongerMessageAction,
};
}

/// <inheritdoc />
protected override IList<Tuple<Func<string, string>, string, Accessibility>> GetConstructorArguments()
{
return new List<Tuple<Func<string, string>, string, Accessibility>>();
}

/// <inheritdoc />
protected override string GetBaseClass(string entityName)
{
return null;
}

/// <inheritdoc />
protected override IEnumerable<string> GetImplementedInterfaces(IEntityGenerationModel generationModel)
{
return new []
{
"Whipstaff.AspNetCore.Features.Logging.ICrudControllerLogMessageActions"
};
}

/// <inheritdoc />
protected override SeparatedSyntaxList<AttributeSyntax> GetAttributesForProperty(PropertyInfoBase propertyInfo)
{
return default(SeparatedSyntaxList<AttributeSyntax>);
}
}
}
Expand Up @@ -44,7 +44,7 @@ protected override IList<string> GetUsings()

/// <inheritdoc />
protected override string GetBaseClass(string entityName) =>
$"Whipstaff.AspNetCore.QueryOnlyController<{entityName}Controller, Queries.IList{entityName}Query, RequestDtos.List{entityName}RequestDto, ResponseDtos.List{entityName}ResponseDto, Queries.IView{entityName}Query, ResponseDtos.View{entityName}ResponseDto>";
$"Whipstaff.AspNetCore.QueryOnlyController<Queries.IList{entityName}Query, RequestDtos.List{entityName}RequestDto, ResponseDtos.List{entityName}ResponseDto, Queries.IView{entityName}Query, ResponseDtos.View{entityName}ResponseDto, LoggerMessageActions.{entityName}LoggerMessageActions>";

protected override IEnumerable<string> GetImplementedInterfaces(IEntityGenerationModel entityGenerationModel)
{
Expand All @@ -67,6 +67,7 @@ protected override IEnumerable<string> GetImplementedInterfaces(IEntityGeneratio
new Tuple<Func<string, string>, string, Accessibility>(entityName => $"Microsoft.Extensions.Logging.ILogger<{entityName}Controller>", "logger", Accessibility.Private),
new Tuple<Func<string, string>, string, Accessibility>(entityName => $"MediatR.IMediator", "mediator", Accessibility.Private),
new Tuple<Func<string, string>, string, Accessibility>(entityName => $"QueryFactories.I{entityName}QueryFactory", "queryFactory", Accessibility.Private),
new Tuple<Func<string, string>, string, Accessibility>(entityName => $"LoggerMessageActions.{entityName}LoggerMessageActions", "logMessageActions", Accessibility.Private),
};

return result;
Expand All @@ -80,6 +81,7 @@ protected override IList<string> GetBaseConstructorArguments()
"logger",
"mediator",
"queryFactory",
"logMessageActions",
};

return result;
Expand Down
Expand Up @@ -42,7 +42,7 @@ protected override IList<string> GetUsings()

/// <inheritdoc />
protected override string GetBaseClass(string entityName) =>
$"Whipstaff.AspNetCore.CrudController<{entityName}Controller, Queries.IList{entityName}Query, RequestDtos.List{entityName}RequestDto, ResponseDtos.List{entityName}ResponseDto, Queries.IView{entityName}Query, ResponseDtos.View{entityName}ResponseDto, Commands.IAdd{entityName}Command, RequestDtos.Add{entityName}RequestDto, ResponseDtos.Add{entityName}ResponseDto, Commands.IDelete{entityName}Command, ResponseDtos.Delete{entityName}ResponseDto, Commands.IUpdate{entityName}Command, RequestDtos.Update{entityName}RequestDto, ResponseDtos.Update{entityName}ResponseDto>";
$"Whipstaff.AspNetCore.CrudController<Queries.IList{entityName}Query, RequestDtos.List{entityName}RequestDto, ResponseDtos.List{entityName}ResponseDto, Queries.IView{entityName}Query, ResponseDtos.View{entityName}ResponseDto, Commands.IAdd{entityName}Command, RequestDtos.Add{entityName}RequestDto, ResponseDtos.Add{entityName}ResponseDto, Commands.IDelete{entityName}Command, ResponseDtos.Delete{entityName}ResponseDto, Commands.IUpdate{entityName}Command, RequestDtos.Update{entityName}RequestDto, ResponseDtos.Update{entityName}ResponseDto, LoggerMessageActions.{entityName}LoggerMessageActions>>";

protected override IEnumerable<string> GetImplementedInterfaces(IEntityGenerationModel entityGenerationModel)
{
Expand All @@ -66,6 +66,7 @@ protected override IEnumerable<string> GetImplementedInterfaces(IEntityGeneratio
new Tuple<Func<string, string>, string, Accessibility>(entityName => $"MediatR.IMediator", "mediator", Accessibility.Private),
new Tuple<Func<string, string>, string, Accessibility>(entityName => $"CommandFactories.I{entityName}CommandFactory", "commandFactory", Accessibility.Private),
new Tuple<Func<string, string>, string, Accessibility>(entityName => $"QueryFactories.I{entityName}QueryFactory", "queryFactory", Accessibility.Private),
new Tuple<Func<string, string>, string, Accessibility>(entityName => $"LoggerMessageActions.{entityName}LoggerMessageActions", "logMessageActions", Accessibility.Private),
};

return result;
Expand All @@ -80,6 +81,7 @@ protected override IList<string> GetBaseConstructorArguments()
"mediator",
"commandFactory",
"queryFactory",
"logMessageActions",
};

return result;
Expand All @@ -102,7 +104,6 @@ protected override string[] GetClassLevelCommentRemarks(string entityName)
{
return new List<Tuple<string, IList<string>>>
{
new Tuple<string, IList<string>>("Microsoft.AspNetCore.Mvc.AutoValidateAntiforgeryToken", null),
new Tuple<string, IList<string>>("Microsoft.AspNetCore.Authorization.Authorize", null),
new Tuple<string, IList<string>>("Microsoft.AspNetCore.Mvc.Route", new[]{ $"\"api/{entityDeclaration.ClassName.ToLower()}\"" })
};
Expand Down
@@ -0,0 +1,13 @@
using Dhgms.Nucleotide.Generators.Features.Logging;
using Dhgms.Nucleotide.Generators.Models;
using Dhgms.Nucleotide.ModelTests;
using Microsoft.CodeAnalysis;

namespace Dhgms.Nucleotide.SampleGenerator
{
[Generator]
public sealed class TestCrudControllerLoggerMessageActionGenerator : CrudControllerLoggerMessageActionGenerator
{
protected override INucleotideGenerationModel<IEntityGenerationModel> NucleotideGenerationModel => new ModelGenerationDetails();
}
}
@@ -0,0 +1,38 @@
using System;
using System.Diagnostics.CodeAnalysis;
using Dhgms.Nucleotide.Generators.Features.Logging;
using Dhgms.Nucleotide.Generators.Models;
using Dhgms.Nucleotide.SampleGenerator;
using Microsoft.CodeAnalysis;
using Xunit.Abstractions;

namespace Dhgms.Nucleotide.UnitTests.Generators.Features.Logging
{
[ExcludeFromCodeCoverage]
public static class CrudControllerLoggerMessageActionGeneratorTests
{
public sealed class ConstructorMethod : BaseGeneratorTests.BaseConstructorMethod<CrudControllerLoggerMessageActionGenerator, CrudControllerLoggerMessageActionFeatureFlags, CrudControllerLoggerMessageActionGeneratorProcessor, IEntityGenerationModel>
{
public ConstructorMethod(ITestOutputHelper output) : base(output)
{
}

protected override Func<AttributeData, CrudControllerLoggerMessageActionGenerator> GetFactory()
{
return data => new TestCrudControllerLoggerMessageActionGenerator();
}
}

public sealed class GenerateAsyncMethod : BaseGeneratorTests.BaseGenerateAsyncMethod<CrudControllerLoggerMessageActionGenerator, CrudControllerLoggerMessageActionFeatureFlags, CrudControllerLoggerMessageActionGeneratorProcessor, IEntityGenerationModel>
{
public GenerateAsyncMethod(ITestOutputHelper output) : base(output)
{
}

protected override Func<AttributeData, CrudControllerLoggerMessageActionGenerator> GetFactory()
{
return data => new TestCrudControllerLoggerMessageActionGenerator();
}
}
}
}

0 comments on commit 679ffb3

Please sign in to comment.