Skip to content

Commit 8995a6e

Browse files
authored
Release/2.0 (#83)
1 parent 82d6cfc commit 8995a6e

39 files changed

Lines changed: 619 additions & 240 deletions

File tree

.editorconfig

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
[*]
2+
charset = utf-8-bom
3+
end_of_line = crlf
4+
trim_trailing_whitespace = false
5+
insert_final_newline = false
6+
indent_style = space
7+
indent_size = 4
8+
max_line_length = 960
9+
10+
[*.yml]
11+
indent_size = 2
12+
13+
# Microsoft .NET properties
14+
csharp_new_line_before_members_in_object_initializers = false
15+
csharp_preferred_modifier_order = public, private, protected, internal, file, new, static, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async, required:suggestion
16+
csharp_space_after_cast = true
17+
csharp_style_prefer_utf8_string_literals = true:suggestion
18+
csharp_style_var_elsewhere = true:suggestion
19+
csharp_style_var_for_built_in_types = true:suggestion
20+
csharp_style_var_when_type_is_apparent = true:suggestion
21+
dotnet_naming_rule.interfaces_rule.import_to_resharper = True
22+
dotnet_naming_rule.interfaces_rule.resharper_description = Interfaces
23+
dotnet_naming_rule.interfaces_rule.resharper_guid = a7a3339e-4e89-4319-9735-a9dc4cb74cc7
24+
dotnet_naming_rule.interfaces_rule.severity = warning
25+
dotnet_naming_rule.interfaces_rule.style = i_upper_camel_case_style
26+
dotnet_naming_rule.interfaces_rule.symbols = interfaces_symbols
27+
dotnet_naming_rule.private_constants_rule.import_to_resharper = True
28+
dotnet_naming_rule.private_constants_rule.resharper_description = Constant fields (private)
29+
dotnet_naming_rule.private_constants_rule.resharper_guid = 236f7aa5-7b06-43ca-bf2a-9b31bfcff09a
30+
dotnet_naming_rule.private_constants_rule.severity = warning
31+
dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style
32+
dotnet_naming_rule.private_constants_rule.symbols = private_constants_symbols
33+
dotnet_naming_rule.private_instance_fields_rule.import_to_resharper = True
34+
dotnet_naming_rule.private_instance_fields_rule.resharper_description = Instance fields (private)
35+
dotnet_naming_rule.private_instance_fields_rule.resharper_guid = 4a98fdf6-7d98-4f5a-afeb-ea44ad98c70c
36+
dotnet_naming_rule.private_instance_fields_rule.severity = warning
37+
dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style
38+
dotnet_naming_rule.private_instance_fields_rule.symbols = private_instance_fields_symbols
39+
dotnet_naming_rule.private_static_fields_rule.import_to_resharper = True
40+
dotnet_naming_rule.private_static_fields_rule.resharper_description = Static fields (private)
41+
dotnet_naming_rule.private_static_fields_rule.resharper_guid = f9fce829-e6f4-4cb2-80f1-5497c44f51df
42+
dotnet_naming_rule.private_static_fields_rule.severity = warning
43+
dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style
44+
dotnet_naming_rule.private_static_fields_rule.symbols = private_static_fields_symbols
45+
dotnet_naming_rule.private_static_readonly_rule.import_to_resharper = True
46+
dotnet_naming_rule.private_static_readonly_rule.resharper_description = Static readonly fields (private)
47+
dotnet_naming_rule.private_static_readonly_rule.resharper_guid = 15b5b1f1-457c-4ca6-b278-5615aedc07d3
48+
dotnet_naming_rule.private_static_readonly_rule.severity = warning
49+
dotnet_naming_rule.private_static_readonly_rule.style = upper_camel_case_style
50+
dotnet_naming_rule.private_static_readonly_rule.symbols = private_static_readonly_symbols
51+
dotnet_naming_rule.type_parameters_rule.import_to_resharper = True
52+
dotnet_naming_rule.type_parameters_rule.resharper_description = Type parameters
53+
dotnet_naming_rule.type_parameters_rule.resharper_guid = 2c62818f-621b-4425-adc9-78611099bfcb
54+
dotnet_naming_rule.type_parameters_rule.severity = warning
55+
dotnet_naming_rule.type_parameters_rule.style = t_upper_camel_case_style
56+
dotnet_naming_rule.type_parameters_rule.symbols = type_parameters_symbols
57+
dotnet_naming_rule.unity_serialized_field_rule.import_to_resharper = True
58+
dotnet_naming_rule.unity_serialized_field_rule.resharper_description = Unity serialized field
59+
dotnet_naming_rule.unity_serialized_field_rule.resharper_guid = 5f0fdb63-c892-4d2c-9324-15c80b22a7ef
60+
dotnet_naming_rule.unity_serialized_field_rule.severity = warning
61+
dotnet_naming_rule.unity_serialized_field_rule.style = lower_camel_case_style
62+
dotnet_naming_rule.unity_serialized_field_rule.symbols = unity_serialized_field_symbols
63+
dotnet_naming_style.i_upper_camel_case_style.capitalization = pascal_case
64+
dotnet_naming_style.i_upper_camel_case_style.required_prefix = I
65+
dotnet_naming_style.lower_camel_case_style.capitalization = camel_case
66+
dotnet_naming_style.t_upper_camel_case_style.capitalization = pascal_case
67+
dotnet_naming_style.t_upper_camel_case_style.required_prefix = T
68+
dotnet_naming_style.upper_camel_case_style.capitalization = pascal_case
69+
dotnet_naming_symbols.interfaces_symbols.applicable_accessibilities = *
70+
dotnet_naming_symbols.interfaces_symbols.applicable_kinds = interface
71+
dotnet_naming_symbols.interfaces_symbols.resharper_applicable_kinds = interface
72+
dotnet_naming_symbols.interfaces_symbols.resharper_required_modifiers = any
73+
dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities = private
74+
dotnet_naming_symbols.private_constants_symbols.applicable_kinds = field
75+
dotnet_naming_symbols.private_constants_symbols.required_modifiers = const
76+
dotnet_naming_symbols.private_constants_symbols.resharper_applicable_kinds = constant_field
77+
dotnet_naming_symbols.private_constants_symbols.resharper_required_modifiers = any
78+
dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities = private
79+
dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds = field
80+
dotnet_naming_symbols.private_instance_fields_symbols.resharper_applicable_kinds = field,readonly_field
81+
dotnet_naming_symbols.private_instance_fields_symbols.resharper_required_modifiers = instance
82+
dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities = private
83+
dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds = field
84+
dotnet_naming_symbols.private_static_fields_symbols.required_modifiers = static
85+
dotnet_naming_symbols.private_static_fields_symbols.resharper_applicable_kinds = field
86+
dotnet_naming_symbols.private_static_fields_symbols.resharper_required_modifiers = static
87+
dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities = private
88+
dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds = field
89+
dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers = readonly,static
90+
dotnet_naming_symbols.private_static_readonly_symbols.resharper_applicable_kinds = readonly_field
91+
dotnet_naming_symbols.private_static_readonly_symbols.resharper_required_modifiers = static
92+
dotnet_naming_symbols.type_parameters_symbols.applicable_accessibilities = *
93+
dotnet_naming_symbols.type_parameters_symbols.applicable_kinds = type_parameter
94+
dotnet_naming_symbols.type_parameters_symbols.resharper_applicable_kinds = type_parameter
95+
dotnet_naming_symbols.type_parameters_symbols.resharper_required_modifiers = any
96+
dotnet_naming_symbols.unity_serialized_field_symbols.applicable_accessibilities = *
97+
dotnet_naming_symbols.unity_serialized_field_symbols.applicable_kinds =
98+
dotnet_naming_symbols.unity_serialized_field_symbols.resharper_applicable_kinds = unity_serialised_field
99+
dotnet_naming_symbols.unity_serialized_field_symbols.resharper_required_modifiers = instance
100+
dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
101+
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:none
102+
dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
103+
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
104+
dotnet_style_predefined_type_for_member_access = true:suggestion
105+
dotnet_style_qualification_for_event = false:suggestion
106+
dotnet_style_qualification_for_field = false:suggestion
107+
dotnet_style_qualification_for_method = false:suggestion
108+
dotnet_style_qualification_for_property = false:suggestion
109+
dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion
110+
111+
# ReSharper properties
112+
resharper_autodetect_indent_settings = true
113+
resharper_formatter_off_tag = @formatter:off
114+
resharper_formatter_on_tag = @formatter:on
115+
resharper_formatter_tags_enabled = true
116+
resharper_place_accessorholder_attribute_on_same_line = false
117+
resharper_place_accessor_attribute_on_same_line = false
118+
resharper_place_field_attribute_on_same_line = false
119+
resharper_space_within_single_line_array_initializer_braces = false
120+
resharper_use_indent_from_vs = false
121+
122+
# ReSharper inspection severities
123+
resharper_arrange_redundant_parentheses_highlighting = hint
124+
resharper_arrange_this_qualifier_highlighting = hint
125+
resharper_arrange_type_member_modifiers_highlighting = hint
126+
resharper_arrange_type_modifiers_highlighting = hint
127+
resharper_built_in_type_reference_style_for_member_access_highlighting = hint
128+
resharper_built_in_type_reference_style_highlighting = hint
129+
resharper_mvc_action_not_resolved_highlighting = warning
130+
resharper_mvc_area_not_resolved_highlighting = warning
131+
resharper_mvc_controller_not_resolved_highlighting = warning
132+
resharper_mvc_masterpage_not_resolved_highlighting = warning
133+
resharper_mvc_partial_view_not_resolved_highlighting = warning
134+
resharper_mvc_template_not_resolved_highlighting = warning
135+
resharper_mvc_view_component_not_resolved_highlighting = warning
136+
resharper_mvc_view_component_view_not_resolved_highlighting = warning
137+
resharper_mvc_view_not_resolved_highlighting = warning
138+
resharper_razor_assembly_not_resolved_highlighting = warning
139+
resharper_redundant_base_qualifier_highlighting = warning
140+
resharper_suggest_var_or_type_built_in_types_highlighting = hint
141+
resharper_suggest_var_or_type_elsewhere_highlighting = hint
142+
resharper_suggest_var_or_type_simple_types_highlighting = hint
143+
resharper_web_config_module_not_resolved_highlighting = warning
144+
resharper_web_config_type_not_resolved_highlighting = warning
145+
resharper_web_config_wrong_module_highlighting = warning
146+
147+
[{*.har,*.jsb2,*.jsb3,*.json,*.jsonc,*.postman_collection,*.postman_collection.json,*.postman_environment,*.postman_environment.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,.ws-context,jest.config}]
148+
indent_style = space
149+
indent_size = 2
150+
151+
[*.scss]
152+
indent_style = space
153+
indent_size = 2
154+
155+
[*.{appxmanifest,asax,ascx,aspx,axaml,blockshader,build,c,c++,c++m,cc,ccm,cginc,compute,cp,cpp,cppm,cs,cshtml,cu,cuh,cxx,cxxm,dtd,fs,fsi,fsscript,fsx,fx,fxh,h,h++,hh,hlsl,hlsli,hlslinc,hp,hpp,hxx,icc,inc,inl,ino,ipp,ixx,master,ml,mli,mpp,mq4,mq5,mqh,mxx,nuspec,paml,razor,resw,resx,shader,shaderFoundry,skin,tcc,tpp,urtshader,usf,ush,uxml,vb,xaml,xamlx,xoml,xsd}]
156+
indent_style = space
157+
indent_size = 4
158+
tab_width = 4

.github/workflows/Build.yaml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,9 @@ env:
44
JAVA_VERSION: 17
55
JAVA_DISTRIBUTION: microsoft
66
DOTNET_VERSION: |
7-
3.1.x
8-
6.0.x
9-
7.0.x
107
8.0.x
118
9.0.x
9+
10.0.x
1210
DOTNET_BUILD_CONFIGURATION: Release
1311
SONAR_PATH: .\.sonar\scanner
1412
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
@@ -29,18 +27,18 @@ jobs:
2927

3028
steps:
3129
- name: Checkout
32-
uses: actions/checkout@v3
30+
uses: actions/checkout@v6
3331
with:
3432
fetch-depth: 0
3533

3634
- name: Set up Java
37-
uses: actions/setup-java@v3
35+
uses: actions/setup-java@v5
3836
with:
3937
java-version: ${{ env.JAVA_VERSION }}
4038
distribution: ${{ env.JAVA_DISTRIBUTION }}
4139

4240
- name: Set up .NET
43-
uses: actions/setup-dotnet@v3
41+
uses: actions/setup-dotnet@v5
4442
with:
4543
dotnet-version: ${{ env.DOTNET_VERSION }}
4644

.github/workflows/Release.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: FluentValidation.AutoValidation [Release]
22

33
env:
4-
DOTNET_VERSION: 9.0.x
4+
DOTNET_VERSION: 10.0.x
55
DOTNET_BUILD_CONFIGURATION: Release
66
DOTNET_PACKAGES_OUTPUT_DIRECTORY: .nuget
77
NUGET_SOURCE: https://api.nuget.org/v3/index.json
@@ -18,12 +18,12 @@ jobs:
1818

1919
steps:
2020
- name: Checkout
21-
uses: actions/checkout@v3
21+
uses: actions/checkout@v6
2222
with:
2323
fetch-depth: 0
2424

2525
- name: Set up .NET
26-
uses: actions/setup-dotnet@v3
26+
uses: actions/setup-dotnet@v5
2727
with:
2828
dotnet-version: ${{ env.DOTNET_VERSION }}
2929

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project>
22
<PropertyGroup>
3+
<TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>
34
<Nullable>enable</Nullable>
4-
<LangVersion>8.0</LangVersion>
55
<NoWarn>NU1701</NoWarn>
66
<EmbedUntrackedSources>true</EmbedUntrackedSources>
77
<IncludeSymbols>true</IncludeSymbols>

FluentValidation.AutoValidation.Endpoints/FluentValidation.AutoValidation.Endpoints.csproj

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
</PropertyGroup>
66

77
<PropertyGroup>
8-
<TargetFrameworks>net7.0;net8.0;net9.0</TargetFrameworks>
98
<AssemblyName>SharpGrip.FluentValidation.AutoValidation.Endpoints</AssemblyName>
109
<PackageId>SharpGrip.FluentValidation.AutoValidation.Endpoints</PackageId>
1110
<Title>SharpGrip FluentValidation AutoValidation Endpoints</Title>
@@ -18,7 +17,7 @@
1817
</ItemGroup>
1918

2019
<ItemGroup>
21-
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0">
20+
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="10.0.102">
2221
<PrivateAssets>all</PrivateAssets>
2322
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2423
</PackageReference>

FluentValidation.AutoValidation.Endpoints/src/Extensions/ServiceCollectionExtensions.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ public static class ServiceCollectionExtensions
1414
/// <param name="serviceCollection">The service collection.</param>
1515
/// <param name="autoValidationEndpointsConfiguration">The configuration delegate used to configure the FluentValidation AutoValidation Endpoints validation.</param>
1616
/// <returns>The service collection.</returns>
17-
public static IServiceCollection AddFluentValidationAutoValidation(this IServiceCollection serviceCollection,
18-
Action<AutoValidationEndpointsConfiguration>? autoValidationEndpointsConfiguration = null)
17+
public static IServiceCollection AddFluentValidationAutoValidation(this IServiceCollection serviceCollection, Action<AutoValidationEndpointsConfiguration>? autoValidationEndpointsConfiguration = null)
1918
{
2019
var configuration = new AutoValidationEndpointsConfiguration();
2120

FluentValidation.AutoValidation.Endpoints/src/Filters/FluentValidationAutoValidationEndpointFilter.cs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
using FluentValidation;
33
using Microsoft.AspNetCore.Http;
44
using Microsoft.Extensions.DependencyInjection;
5+
using Microsoft.Extensions.Logging;
56
using SharpGrip.FluentValidation.AutoValidation.Endpoints.Interceptors;
67
using SharpGrip.FluentValidation.AutoValidation.Endpoints.Results;
78
using SharpGrip.FluentValidation.AutoValidation.Shared.Extensions;
89

910
namespace SharpGrip.FluentValidation.AutoValidation.Endpoints.Filters
1011
{
11-
public class FluentValidationAutoValidationEndpointFilter : IEndpointFilter
12+
public class FluentValidationAutoValidationEndpointFilter(ILogger<FluentValidationAutoValidationEndpointFilter> logger) : IEndpointFilter
1213
{
1314
public async ValueTask<object?> InvokeAsync(EndpointFilterInvocationContext endpointFilterInvocationContext, EndpointFilterDelegate next)
1415
{
@@ -18,45 +19,60 @@ public class FluentValidationAutoValidationEndpointFilter : IEndpointFilter
1819
{
1920
if (argument != null && argument.GetType().IsCustomType() && serviceProvider.GetValidator(argument.GetType()) is IValidator validator)
2021
{
21-
// ReSharper disable once SuspiciousTypeConversion.Global
22+
logger.LogDebug("Starting validation for argument of type '{Type}'.", argument.GetType().Name);
23+
2224
var validatorInterceptor = validator as IValidatorInterceptor;
2325
var globalValidationInterceptor = serviceProvider.GetService<IGlobalValidationInterceptor>();
2426

2527
IValidationContext validationContext = new ValidationContext<object>(argument);
2628

2729
if (validatorInterceptor != null)
2830
{
29-
validationContext = validatorInterceptor.BeforeValidation(endpointFilterInvocationContext, validationContext) ?? validationContext;
31+
logger.LogDebug("Invoking validator interceptor BeforeValidation for argument '{Argument}'.", argument.GetType().Name);
32+
validationContext = await validatorInterceptor.BeforeValidation(endpointFilterInvocationContext, validationContext, endpointFilterInvocationContext.HttpContext.RequestAborted) ?? validationContext;
3033
}
3134

3235
if (globalValidationInterceptor != null)
3336
{
34-
validationContext = globalValidationInterceptor.BeforeValidation(endpointFilterInvocationContext, validationContext) ?? validationContext;
37+
logger.LogDebug("Invoking global validation interceptor BeforeValidation for argument '{Argument}'.", argument.GetType().Name);
38+
validationContext = await globalValidationInterceptor.BeforeValidation(endpointFilterInvocationContext, validationContext, endpointFilterInvocationContext.HttpContext.RequestAborted) ?? validationContext;
3539
}
3640

3741
var validationResult = await validator.ValidateAsync(validationContext, endpointFilterInvocationContext.HttpContext.RequestAborted);
3842

3943
if (validatorInterceptor != null)
4044
{
41-
validationResult = validatorInterceptor.AfterValidation(endpointFilterInvocationContext, validationContext) ?? validationResult;
45+
logger.LogDebug("Invoking validator interceptor AfterValidation for argument '{Argument}'.", argument.GetType().Name);
46+
validationResult = await validatorInterceptor.AfterValidation(endpointFilterInvocationContext, validationContext, validationResult, endpointFilterInvocationContext.HttpContext.RequestAborted) ?? validationResult;
4247
}
4348

4449
if (globalValidationInterceptor != null)
4550
{
46-
validationResult = globalValidationInterceptor.AfterValidation(endpointFilterInvocationContext, validationContext) ?? validationResult;
51+
logger.LogDebug("Invoking global validation interceptor AfterValidation for argument '{Argument}'.", argument.GetType().Name);
52+
validationResult = await globalValidationInterceptor.AfterValidation(endpointFilterInvocationContext, validationContext, validationResult, endpointFilterInvocationContext.HttpContext.RequestAborted) ?? validationResult;
4753
}
4854

4955
if (!validationResult.IsValid)
5056
{
57+
logger.LogDebug("Validation result not valid for argument '{Argument}': {ErrorCount} validation error(s) found.", argument.GetType().Name, validationResult.Errors.Count);
58+
5159
var fluentValidationAutoValidationResultFactory = serviceProvider.GetService<IFluentValidationAutoValidationResultFactory>();
5260

61+
logger.LogDebug("Creating result for path '{Path}'.", endpointFilterInvocationContext.HttpContext.Request.Path);
62+
5363
if (fluentValidationAutoValidationResultFactory != null)
5464
{
65+
logger.LogTrace("Creating result for path '{Path}' using a custom result factory.", endpointFilterInvocationContext.HttpContext.Request.Path);
66+
5567
return fluentValidationAutoValidationResultFactory.CreateResult(endpointFilterInvocationContext, validationResult);
5668
}
5769

70+
logger.LogTrace("Creating result for path '{Path}' using the default result factory.", endpointFilterInvocationContext.HttpContext.Request.Path);
71+
5872
return new FluentValidationAutoValidationDefaultResultFactory().CreateResult(endpointFilterInvocationContext, validationResult);
5973
}
74+
75+
logger.LogDebug("Validation result valid for argument '{Argument}'.", argument.GetType().Name);
6076
}
6177
}
6278

0 commit comments

Comments
 (0)