Skip to content

Commit

Permalink
[APIPUB-76] - Adds Sonar Analyzer (#80)
Browse files Browse the repository at this point in the history
* Add sonar analyzer
Treat warnings as errors

* Add editorconfig files

* Fix many SonarLint warnings

* Fixes

* fixes some warnings.

* Fixes format warnings

* Trying to fix tests.

* More warnings fixed.

* More warnings fixed.

* Removes unnecessary file

---------

Co-authored-by: Stephen A. Fuqua <[email protected]>
  • Loading branch information
DavidJGapCR and stephenfuqua authored Oct 7, 2024
1 parent ca37c63 commit fa51c2c
Show file tree
Hide file tree
Showing 155 changed files with 1,409 additions and 1,320 deletions.
17 changes: 17 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# http://editorconfig.org
root = true

[*]
indent_style=space
indent_size=4
tab_width=2
insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true
max_line_length = 110

[*.{yml,json}]
indent_size=2

[*.md]
trim_trailing_whitespace = false
143 changes: 143 additions & 0 deletions src/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
# References
# https://docs.microsoft.com/en-us/visualstudio/code-quality/use-roslyn-analyzers?view=vs-2022
# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/language-rules
# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/naming-rules
# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/
# https://rules.sonarsource.com/csharp
# https://editorconfig.org/

root = true

[**/*]
# Sensible Defaults
file_header_template = SPDX-License-Identifier: Apache-2.0\nLicensed to the Ed-Fi Alliance under one or more agreements.\nThe Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0.\nSee the LICENSE and NOTICES files in the project root for more information.
indent_style=space
indent_size=4
tab_width=2
insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true
max_line_length = 110

[**/*.md]
trim_trailing_whitespace = false

[**/*.{cs,cshtml,csx}]
indent_style = space
indent_size = 4
tab_width = 4
end_of_line = lf
csharp_new_line_before_members_in_object_initializers = false
csharp_preferred_modifier_order = private, public, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async:suggestion

dotnet_diagnostic.IDE0073.severity=error # File header template required

# Formatting rules
dotnet_diagnostic.IDE0055.severity=warning
csharp_new_line_before_open_brace = all # Allman style
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = no_change
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents_when_block = true
csharp_space_after_cast = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_parentheses = none
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_around_binary_operators = before_and_after
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_after_comma = true
csharp_space_before_comma = false
csharp_space_after_dot = false
csharp_space_before_dot = false
csharp_space_after_semicolon_in_for_statement = true
csharp_space_before_semicolon_in_for_statement = false
csharp_space_around_declaration_statements = false
csharp_space_before_open_square_brackets = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_square_brackets = false
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = false

# Naming rules
dotnet_naming_rule.local_constants_rule.severity = warning
dotnet_naming_rule.local_constants_rule.style = upper_camel_case_style
dotnet_naming_rule.local_constants_rule.symbols = local_constants_symbols
dotnet_naming_rule.private_constants_rule.import_to_resharper = as_predefined
dotnet_naming_rule.private_constants_rule.severity = warning
dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style
dotnet_naming_rule.private_constants_rule.symbols = private_constants_symbols
dotnet_naming_rule.private_static_readonly_rule.import_to_resharper = as_predefined
dotnet_naming_rule.private_static_readonly_rule.severity = warning
dotnet_naming_rule.private_static_readonly_rule.style = lower_camel_case_style
dotnet_naming_rule.private_static_readonly_rule.symbols = private_static_readonly_symbols
dotnet_naming_style.lower_camel_case_style.capitalization = camel_case
dotnet_naming_style.lower_camel_case_style.required_prefix = _
dotnet_naming_style.upper_camel_case_style.capitalization = pascal_case
dotnet_naming_symbols.local_constants_symbols.applicable_accessibilities = *
dotnet_naming_symbols.local_constants_symbols.applicable_kinds = local
dotnet_naming_symbols.local_constants_symbols.required_modifiers = const
dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities = private
dotnet_naming_symbols.private_constants_symbols.applicable_kinds = field
dotnet_naming_symbols.private_constants_symbols.required_modifiers = const
dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities = private
dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds = field
dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers = static,readonly

# Misc style
dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none
dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
dotnet_style_predefined_type_for_member_access = true:suggestion
dotnet_style_qualification_for_event = false:suggestion
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_method = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
dotnet_style_require_accessibility_modifiers = for_non_interface_members:warning
dotnet_style_operator_placement_when_wrapping = beginning_of_line
dotnet_sort_system_directives_first = true
dotnet_separate_import_directive_groups = false

# We *like* var
dotnet_diagnostic.IDE0008.severity=none # IDE0008: Use explicit type
csharp_style_var_elsewhere = false:none
csharp_style_var_for_built_in_types = false:suggestion

# Using statements
csharp_using_directive_placement=outside_namespace:warning
dotnet_diagnostic.IDE0065.severity=warning # placement of using statements
dotnet_diagnostic.IDE0005.severity=suggestion # Remove unnecessary using directives

# Lower the priority
dotnet_diagnostic.S4136.severity=suggestion # Method overloads should be grouped together
dotnet_diagnostic.S1135.severity=suggestion # Complete TODO comments
dotnet_diagnostic.S112.severity=suggestion # 'System.Exception' should not be thrown by user code.
dotnet_diagnostic.S3247.severity=suggestion # Remove redundant cast - getting false positives

# Allow empty records for discriminated union types
dotnet_diagnostic.S2094.severity=none # S2094: Classes should not be empty

[**/tests/**/*.cs]
# Allow our strange test class naming convention
dotnet_naming_symbols.amt_tests.applicable_kinds = class,method
dotnet_naming_symbols.amt_tests.word_separator = "_"
dotnet_naming_symbols.amt_tests.capitalization = first_word_upper
dotnet_diagnostic.IDE1006.severity=none
dotnet_diagnostic.S101.severity=none

# SonarLint doesn't understand implied assertions from FakeItEasy
dotnet_diagnostic.S2699.severity=none # S2699: Tests should include assertions
10 changes: 8 additions & 2 deletions src/EdFi.Tools.ApiPublisher.Cli/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using EdFi.Tools.ApiPublisher.Core.Registration;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Polly.RateLimit;
using Serilog;
using System;
using System.Collections.Generic;
Expand All @@ -22,8 +23,8 @@
using System.Threading.Tasks;

namespace EdFi.Tools.ApiPublisher.Cli
{
internal class Program
{
internal class Program
{
private static readonly ILogger _logger = Log.ForContext(typeof(Program));

Expand Down Expand Up @@ -174,6 +175,11 @@ private static async Task<int> Main(string[] args)
_logger.Information($"Processing complete.");
return 0;
}
//catch (RateLimitRejectedException ex)
//{
// _logger.Fatal(ex, ex.Message);
// return -1;
//}
catch (Exception ex)
{
_logger.Error($"Processing failed: {string.Join(" ", GetExceptionMessages(ex))}");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@

namespace EdFi.Tools.ApiPublisher.ConfigurationStore.Aws
{
public class AwsSystemManagerChangeVersionProcessedWriter : IChangeVersionProcessedWriter
public class AwsSystemManagerChangeVersionProcessedWriter : IChangeVersionProcessedWriter
{
private readonly ILogger _logger = Log.ForContext(typeof(AwsSystemManagerChangeVersionProcessedWriter));

public async Task SetProcessedChangeVersionAsync(
string sourceConnectionName,
string targetConnectionName,
Expand All @@ -34,7 +34,7 @@ public async Task SetProcessedChangeVersionAsync(

// Assign the new "LastChangeVersionProcessed" value
currentParameter[targetConnectionName] = changeVersion;

// Serialize the parameter's values
string newParameterJson = currentParameter.ToString(Formatting.None);

Expand All @@ -51,7 +51,7 @@ public async Task SetProcessedChangeVersionAsync(
var response = await amazonSimpleSystemsManagement.PutParameterAsync(putRequest)
.ConfigureAwait(false);

if ((int) response.HttpStatusCode >= 400)
if ((int)response.HttpStatusCode >= 400)
{
throw new Exception(
$"Failed to write updated change version of {changeVersion} for source connection '{sourceConnectionName}' to target connection '{targetConnectionName}' (AWS response status: {response.HttpStatusCode}).");
Expand All @@ -63,7 +63,7 @@ private async Task<JObject> GetParameterValueAsync(
string sourceConnectionName)
{
string parameterName = $"{ConfigurationStoreHelper.Key(sourceConnectionName)}/lastChangeVersionsProcessed";

var getRequest = new GetParameterRequest
{
Name = parameterName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace EdFi.Tools.ApiPublisher.ConfigurationStore.Aws
{
public class AwsSystemManagerNamedApiConnectionDetailsReader : INamedApiConnectionDetailsReader
public class AwsSystemManagerNamedApiConnectionDetailsReader : INamedApiConnectionDetailsReader
{
public ApiConnectionDetails GetNamedApiConnectionDetails(
string apiConnectionName,
Expand All @@ -21,13 +21,13 @@ public ApiConnectionDetails GetNamedApiConnectionDetails(
var config = new ConfigurationBuilder()
.AddSystemsManager(ConfigurationStoreHelper.Key(apiConnectionName), awsOptions)
.Build();

// Read the connection details from the configuration values
var connectionDetails = config.Get<ApiConnectionDetails>();

// Assign the connection name
connectionDetails.Name = apiConnectionName;

return connectionDetails;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ namespace EdFi.Tools.ApiPublisher.ConfigurationStore.Aws;
public class Plugin : IPlugin
{
private const string ConfigurationProviderName = "awsParameterStore";

public void ApplyConfiguration(string[] args, IConfigurationBuilder configBuilder)
{
// Nothing to do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

namespace EdFi.Tools.ApiPublisher.ConfigurationStore.Plaintext.Modules
{
public class PluginModule : Module
public class PluginModule : Module
{
protected override void Load(ContainerBuilder builder)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

namespace EdFi.Tools.ApiPublisher.ConfigurationStore.Plaintext
{
public class PlainTextJsonFileNamedApiConnectionDetailsReader : INamedApiConnectionDetailsReader
public class PlainTextJsonFileNamedApiConnectionDetailsReader : INamedApiConnectionDetailsReader
{
public ApiConnectionDetails GetNamedApiConnectionDetails(
string apiConnectionName,
Expand All @@ -18,9 +18,9 @@ public ApiConnectionDetails GetNamedApiConnectionDetails(
var config = new ConfigurationBuilder()
.AddJsonFile("plainTextNamedConnections.json")
.Build();

var connections = config.Get<PlainTextNamedConnectionConfiguration>();

return connections.Connections?
.Where(details => details.Name != null)
.FirstOrDefault(details => details.Name!.Equals(apiConnectionName, StringComparison.OrdinalIgnoreCase))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

namespace EdFi.Tools.ApiPublisher.ConfigurationStore.Plaintext
{
internal class PlainTextNamedConnectionConfiguration
internal class PlainTextNamedConnectionConfiguration
{
public ApiConnectionDetails[] Connections { get; set; }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@

namespace EdFi.Tools.ApiPublisher.ConfigurationStore.Plaintext
{
public class PlaintextChangeVersionProcessedWriter : IChangeVersionProcessedWriter
public class PlaintextChangeVersionProcessedWriter : IChangeVersionProcessedWriter
{
private readonly ILogger _logger = Log.Logger.ForContext(typeof(PlaintextChangeVersionProcessedWriter));

public Task SetProcessedChangeVersionAsync(
string sourceConnectionName,
string targetConnectionName,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
// ReSharper disable once CheckNamespace
namespace Microsoft.Extensions.Configuration
{
public static class ConfigurationBuilderExtensions
public static class ConfigurationBuilderExtensions
{
public static IConfigurationBuilder AddConfigurationStoreForPostgreSql(
this IConfigurationBuilder builder,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@

namespace EdFi.Tools.ApiPublisher.ConfigurationStore.PostgreSql.Modules
{
public class PluginModule : Module
public class PluginModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<PostgreSqlConfigurationChangeVersionProcessedWriter>()
.As<IChangeVersionProcessedWriter>()
.SingleInstance();

builder.RegisterType<PostgreSqlConfigurationNamedApiConnectionDetailsReader>()
.As<INamedApiConnectionDetailsReader>()
.SingleInstance();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ namespace EdFi.Tools.ApiPublisher.ConfigurationStore.PostgreSql;
public class Plugin : IPlugin
{
private const string ConfigurationProviderName = "postgreSql";

public void ApplyConfiguration(string[] args, IConfigurationBuilder configBuilder)
{
// Nothing to do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

namespace EdFi.Tools.ApiPublisher.ConfigurationStore.PostgreSql
{
public class PostgreSqlConfigurationChangeVersionProcessedWriter : IChangeVersionProcessedWriter
public class PostgreSqlConfigurationChangeVersionProcessedWriter : IChangeVersionProcessedWriter
{
public async Task SetProcessedChangeVersionAsync(
string sourceConnectionName,
Expand All @@ -25,7 +25,7 @@ public async Task SetProcessedChangeVersionAsync(
var postgresConfiguration = configurationStoreSection.Get<PostgresConfigurationStore>().PostgreSql;

// Make sure Postgres configuration has encryption key provided
if (string.IsNullOrWhiteSpace(postgresConfiguration?.EncryptionPassword))
if (string.IsNullOrWhiteSpace(postgresConfiguration?.EncryptionPassword))
{
throw new Exception("The PostgreSQL Configuration Store encryption key for storing API keys and secrets was not provided.");
}
Expand All @@ -37,7 +37,7 @@ public async Task SetProcessedChangeVersionAsync(
postgresConfiguration.ConnectionString,
postgresConfiguration.EncryptionPassword,
ConfigurationStoreHelper.Key(sourceConnectionName));

var currentParameter = new JObject();

if (configurationValues.TryGetValue("lastChangeVersionsProcessed", out string changeVersionsJson))
Expand Down
Loading

0 comments on commit fa51c2c

Please sign in to comment.