From dc5977f07aafecaa54f6782e964f1b37c7a083a9 Mon Sep 17 00:00:00 2001 From: Benjamin Evenson <2031163+benjiro@users.noreply.github.com> Date: Sat, 2 Jul 2022 18:36:39 +1000 Subject: [PATCH] Add dotnet format workflows - Add editorconfig for style rules - Apply style rules Signed-off-by: Benjamin Evenson <2031163+benjiro@users.noreply.github.com> --- .editorconfig | 152 ++++++++++++++++++ .github/workflows/dotnet-format.yml | 32 ++++ global.json | 6 + src/OpenFeature/Constant/Error.cs | 4 +- src/OpenFeature/Constant/FlagValueType.cs | 4 +- src/OpenFeature/Constant/NoOpProvider.cs | 4 +- src/OpenFeature/Constant/Reason.cs | 4 +- .../Extension/ResolutionDetailsExtensions.cs | 4 +- src/OpenFeature/Hook.cs | 8 +- src/OpenFeature/IFeatureClient.cs | 10 +- src/OpenFeature/IFeatureProvider.cs | 6 +- src/OpenFeature/Model/ClientMetadata.cs | 6 +- src/OpenFeature/Model/EvaluationContext.cs | 12 +- .../Model/FlagEvaluationOptions.cs | 6 +- .../Model/FlagEvalusationDetails.cs | 8 +- src/OpenFeature/Model/HookContext.cs | 10 +- src/OpenFeature/Model/Metadata.cs | 4 +- src/OpenFeature/Model/ResolutionDetails.cs | 6 +- src/OpenFeature/NoOpProvider.cs | 6 +- src/OpenFeature/OpenFeature.cs | 10 +- src/OpenFeature/OpenFeatureClient.cs | 24 +-- .../NoOpFeatureProviderTest.cs | 16 +- .../OpenFeatureClientTests.cs | 36 ++--- .../OpenFeatureEvaluationContextTests.cs | 4 +- .../OpenFeature.Tests/OpenFeatureHookTests.cs | 22 +-- test/OpenFeature.Tests/OpenFeatureTests.cs | 10 +- test/OpenFeature.Tests/TestImplementations.cs | 4 +- 27 files changed, 304 insertions(+), 114 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/workflows/dotnet-format.yml create mode 100644 global.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..f67281ebb --- /dev/null +++ b/.editorconfig @@ -0,0 +1,152 @@ +# To learn more about .editorconfig see https://aka.ms/editorconfigdocs +############################### +# Core EditorConfig Options # +############################### +# All files +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{cs,cshtml,htm,html,md,py,sln,xml}] +indent_size = 4 + +############################### +# .NET Coding Conventions # +############################### +# Directive order based on dotnet/runtime settings +# https://github.com/dotnet/runtime/blob/main/.editorconfig +[*.cs] +# New line preferences +csharp_new_line_before_open_brace = all +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 + +# Indentation preferences +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = flush_left + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent + +# this. preferences +dotnet_style_qualification_for_field = true:suggestion +dotnet_style_qualification_for_property = true:suggestion +dotnet_style_qualification_for_method = true:suggestion +dotnet_style_qualification_for_event = true:suggestion + +# var preferences, language keywords vs BCL types preferences +csharp_style_var_for_built_in_types = true:silent +csharp_style_var_when_type_is_apparent = true:silent +csharp_style_var_elsewhere = true:silent +dotnet_style_predefined_type_for_locals_parameters_members = true:silent +dotnet_style_predefined_type_for_member_access = true:silent + +# name all constant fields using PascalCase +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.required_modifiers = const +dotnet_naming_symbols.constant_fields.applicable_accessibilities = * +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# Code style defaults +dotnet_sort_system_directives_first = true +csharp_prefer_braces = true:silent +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true +csharp_prefer_simple_using_statement = true:suggestion +dotnet_style_readonly_field = true:suggestion +csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion +dotnet_style_prefer_simplified_interpolation = true:suggestion +dotnet_style_object_initializer = true:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:silent +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +csharp_prefer_simple_default_expression = true:suggestion + +# Expression-bodied members +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_accessors = true:silent + +# Pattern matching +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +# Null checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Other features +csharp_style_prefer_index_operator = false:none +csharp_style_prefer_range_operator = false:none +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_around_binary_operators = before_and_after +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent + +# Code analyzers +# CA1031: Do not catch general exception types +dotnet_diagnostic.CA1031.severity = none + +# CA1303: Do not pass literals as localized parameters +dotnet_diagnostic.CA1303.severity = none + +# IDE0001: Simplify name +dotnet_diagnostic.IDE0001.severity = warning + +# IDE0002: Simplify member access +dotnet_diagnostic.IDE0002.severity = warning + +# IDE0005: Remove unnecessary import +dotnet_diagnostic.IDE0005.severity = warning + +# RS0041: Public members should not use oblivious types +dotnet_diagnostic.RS0041.severity = suggestion + +[obj/**.cs] +generated_code = true + +[*.csproj] +indent_size = 2 diff --git a/.github/workflows/dotnet-format.yml b/.github/workflows/dotnet-format.yml new file mode 100644 index 000000000..d7da82b63 --- /dev/null +++ b/.github/workflows/dotnet-format.yml @@ -0,0 +1,32 @@ +name: dotnet format + +on: + push: + branches: [ main ] + paths: + - '**.cs' + - '.editorconfig' + pull_request: + branches: [ main ] + paths: + - '**.cs' + - '.editorconfig' + +jobs: + check-format: + runs-on: ubuntu-latest + + steps: + - name: Check out code + uses: actions/checkout@v3 + + - name: Setup .NET Core 6.0 + uses: actions/setup-dotnet@v2 + with: + dotnet-version: 6.0.x + + - name: Install format tool + run: dotnet tool install -g dotnet-format + + - name: dotnet format + run: dotnet-format --folder --check diff --git a/global.json b/global.json new file mode 100644 index 000000000..69fd35842 --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "rollForward": "latestFeature", + "version": "6.0.100" + } +} diff --git a/src/OpenFeature/Constant/Error.cs b/src/OpenFeature/Constant/Error.cs index 6f0ce30b7..d0eb3c503 100644 --- a/src/OpenFeature/Constant/Error.cs +++ b/src/OpenFeature/Constant/Error.cs @@ -1,4 +1,4 @@ -namespace OpenFeature.Constant +namespace OpenFeature.Constant { // TODO Probably should make this a enum public static class Error @@ -9,4 +9,4 @@ public static class Error public static string TypeMismatch = "TYPE_MISMATCH"; public static string GeneralError = "GENERAL"; } -} \ No newline at end of file +} diff --git a/src/OpenFeature/Constant/FlagValueType.cs b/src/OpenFeature/Constant/FlagValueType.cs index d5d457a32..9390276bd 100644 --- a/src/OpenFeature/Constant/FlagValueType.cs +++ b/src/OpenFeature/Constant/FlagValueType.cs @@ -1,4 +1,4 @@ -namespace OpenFeature.Constant +namespace OpenFeature.Constant { public enum FlagValueType { @@ -7,4 +7,4 @@ public enum FlagValueType Number, Object } -} \ No newline at end of file +} diff --git a/src/OpenFeature/Constant/NoOpProvider.cs b/src/OpenFeature/Constant/NoOpProvider.cs index 9335cb6b4..16ada1bf1 100644 --- a/src/OpenFeature/Constant/NoOpProvider.cs +++ b/src/OpenFeature/Constant/NoOpProvider.cs @@ -1,8 +1,8 @@ -namespace OpenFeature.Constant +namespace OpenFeature.Constant { public static class NoOpProvider { public const string NoOpProviderName = "No-op Provider"; public const string ReasonNoOp = "No-op"; } -} \ No newline at end of file +} diff --git a/src/OpenFeature/Constant/Reason.cs b/src/OpenFeature/Constant/Reason.cs index fe67ccdfb..568610f47 100644 --- a/src/OpenFeature/Constant/Reason.cs +++ b/src/OpenFeature/Constant/Reason.cs @@ -1,4 +1,4 @@ -namespace OpenFeature.Constant +namespace OpenFeature.Constant { // TODO Probably should make this a enum public static class Reason @@ -10,4 +10,4 @@ public static class Reason public static string Unknown = "UNKNOWN"; public static string Error = "ERROR"; } -} \ No newline at end of file +} diff --git a/src/OpenFeature/Extension/ResolutionDetailsExtensions.cs b/src/OpenFeature/Extension/ResolutionDetailsExtensions.cs index f5e6ccbc8..d46570fb7 100644 --- a/src/OpenFeature/Extension/ResolutionDetailsExtensions.cs +++ b/src/OpenFeature/Extension/ResolutionDetailsExtensions.cs @@ -1,4 +1,4 @@ -using OpenFeature.Model; +using OpenFeature.Model; namespace OpenFeature.Extention { @@ -9,4 +9,4 @@ public static FlagEvaluationDetails ToFlagEvaluationDetails(this Resolutio return new FlagEvaluationDetails(details.FlagKey, details.Value, details.ErrorCode, details.Reason, details.Variant); } } -} \ No newline at end of file +} diff --git a/src/OpenFeature/Hook.cs b/src/OpenFeature/Hook.cs index 49c53d17e..d3b381236 100644 --- a/src/OpenFeature/Hook.cs +++ b/src/OpenFeature/Hook.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -11,14 +11,14 @@ internal interface IHook Task Error(HookContext context, Exception error, IReadOnlyDictionary hints = null); Task Finally(HookContext context, IReadOnlyDictionary hints = null); } - + /// /// The Hook abstract class describes the default implementation for a hook. /// /// More information about the lifecycle of the flag evaluation process can be found here /// https://github.com/open-feature/spec/blob/main/specification/hooks.md /// - public abstract class Hook : IHook + public abstract class Hook : IHook { public virtual Task Before(HookContext context, IReadOnlyDictionary hints = null) { @@ -40,4 +40,4 @@ public virtual Task Finally(HookContext context, IReadOnlyDictionary hooks); ClientMetadata GetMetadata(); - + Task GetBooleanValue(string flagKey, bool defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null); Task> GetBooleanDetails(string flagKey, bool defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null); Task GetStringValue(string flagKey, string defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null); Task> GetStringDetails(string flagKey, string defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null); - + Task GetNumberValue(string flagKey, int defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null); Task> GetNumberDetails(string flagKey, int defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null); - + Task GetObjectValue(string flagKey, T defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null); Task> GetObjectDetails(string flagKey, T defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null); } -} \ No newline at end of file +} diff --git a/src/OpenFeature/IFeatureProvider.cs b/src/OpenFeature/IFeatureProvider.cs index 455b1d717..c5e7be83f 100644 --- a/src/OpenFeature/IFeatureProvider.cs +++ b/src/OpenFeature/IFeatureProvider.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using OpenFeature.Model; namespace OpenFeature @@ -8,7 +8,7 @@ namespace OpenFeature /// A provider acts as the translates layer between the generic feature flag structure to a target feature flag system. /// /// More information about the provider interface can be found here: - /// https://github.com/open-feature/spec/blob/main/specification/providers.md + /// https://github.com/open-feature/spec/blob/main/specification/providers.md /// public interface IFeatureProvider { @@ -18,4 +18,4 @@ public interface IFeatureProvider Task> ResolveNumberValue(string flagKey, int defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null); Task> ResolveStructureValue(string flagKey, T defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null); } -} \ No newline at end of file +} diff --git a/src/OpenFeature/Model/ClientMetadata.cs b/src/OpenFeature/Model/ClientMetadata.cs index 7f70c4c2d..ca2fff99c 100644 --- a/src/OpenFeature/Model/ClientMetadata.cs +++ b/src/OpenFeature/Model/ClientMetadata.cs @@ -1,12 +1,12 @@ -namespace OpenFeature.Model +namespace OpenFeature.Model { public class ClientMetadata : Metadata { public string Version { get; } - + public ClientMetadata(string name, string version) : base(name) { Version = version; } } -} \ No newline at end of file +} diff --git a/src/OpenFeature/Model/EvaluationContext.cs b/src/OpenFeature/Model/EvaluationContext.cs index 43710c201..a080e3e37 100644 --- a/src/OpenFeature/Model/EvaluationContext.cs +++ b/src/OpenFeature/Model/EvaluationContext.cs @@ -1,4 +1,4 @@ -using System.Collections; +using System.Collections; using System.Collections.Generic; namespace OpenFeature.Model @@ -11,17 +11,17 @@ public void Add(string key, T value) { _internalContext.Add(key, value); } - + public void Remove(string key) { _internalContext.Remove(key); } - + public T Get(string key) { return (T)_internalContext[key]; } - + public object this[string key] { get => _internalContext[key]; @@ -42,7 +42,7 @@ public void Merge(EvaluationContext other) } } } - + public int Count => _internalContext.Count; public IEnumerator GetEnumerator() @@ -55,4 +55,4 @@ IEnumerator IEnumerable.GetEnumerator() return GetEnumerator(); } } -} \ No newline at end of file +} diff --git a/src/OpenFeature/Model/FlagEvaluationOptions.cs b/src/OpenFeature/Model/FlagEvaluationOptions.cs index 1902a53d3..af28f0714 100644 --- a/src/OpenFeature/Model/FlagEvaluationOptions.cs +++ b/src/OpenFeature/Model/FlagEvaluationOptions.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; namespace OpenFeature.Model { @@ -6,11 +6,11 @@ public class FlagEvaluationOptions { public IReadOnlyList Hooks { get; } public IReadOnlyDictionary HookHints { get; } - + public FlagEvaluationOptions(IReadOnlyList hooks, IReadOnlyDictionary hookHints) { Hooks = hooks; HookHints = hookHints; } } -} \ No newline at end of file +} diff --git a/src/OpenFeature/Model/FlagEvalusationDetails.cs b/src/OpenFeature/Model/FlagEvalusationDetails.cs index f84c9db2a..7652dd7ae 100644 --- a/src/OpenFeature/Model/FlagEvalusationDetails.cs +++ b/src/OpenFeature/Model/FlagEvalusationDetails.cs @@ -1,4 +1,4 @@ -namespace OpenFeature.Model +namespace OpenFeature.Model { public class FlagEvaluationDetails { @@ -7,14 +7,14 @@ public class FlagEvaluationDetails public string ErrorCode { get; } public string Reason { get; } public string Variant { get; } - + public FlagEvaluationDetails(string flagKey, T value, string errorCode, string reason, string variant) { Value = value; FlagKey = flagKey; ErrorCode = errorCode; Reason = reason; - Variant = variant; + Variant = variant; } } -} \ No newline at end of file +} diff --git a/src/OpenFeature/Model/HookContext.cs b/src/OpenFeature/Model/HookContext.cs index 7a53244e2..568b6bef9 100644 --- a/src/OpenFeature/Model/HookContext.cs +++ b/src/OpenFeature/Model/HookContext.cs @@ -1,4 +1,4 @@ -using OpenFeature.Constant; +using OpenFeature.Constant; namespace OpenFeature.Model { @@ -11,10 +11,10 @@ public class HookContext public ClientMetadata ClientMetadata { get; } public Metadata ProviderMetadata { get; } - public HookContext(string flagKey, - T defaultValue, + public HookContext(string flagKey, + T defaultValue, FlagValueType flagValueType, - ClientMetadata clientMetadata, + ClientMetadata clientMetadata, Metadata providerMetadata, EvaluationContext evaluationContext) { @@ -26,4 +26,4 @@ public HookContext(string flagKey, EvaluationContext = evaluationContext; } } -} \ No newline at end of file +} diff --git a/src/OpenFeature/Model/Metadata.cs b/src/OpenFeature/Model/Metadata.cs index 4e7be31ee..4708e3fd9 100644 --- a/src/OpenFeature/Model/Metadata.cs +++ b/src/OpenFeature/Model/Metadata.cs @@ -1,4 +1,4 @@ -namespace OpenFeature.Model +namespace OpenFeature.Model { public class Metadata { @@ -9,4 +9,4 @@ public Metadata(string name) Name = name; } } -} \ No newline at end of file +} diff --git a/src/OpenFeature/Model/ResolutionDetails.cs b/src/OpenFeature/Model/ResolutionDetails.cs index 2c243163e..36cde8c65 100644 --- a/src/OpenFeature/Model/ResolutionDetails.cs +++ b/src/OpenFeature/Model/ResolutionDetails.cs @@ -1,4 +1,4 @@ -namespace OpenFeature.Model +namespace OpenFeature.Model { public class ResolutionDetails { @@ -14,7 +14,7 @@ public ResolutionDetails(string flagKey, T value, string errorCode = null, strin FlagKey = flagKey; ErrorCode = errorCode; Reason = reason; - Variant = variant; + Variant = variant; } } -} \ No newline at end of file +} diff --git a/src/OpenFeature/NoOpProvider.cs b/src/OpenFeature/NoOpProvider.cs index 592c1bf5e..df3b5a734 100644 --- a/src/OpenFeature/NoOpProvider.cs +++ b/src/OpenFeature/NoOpProvider.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using OpenFeature.Constant; using OpenFeature.Model; @@ -11,7 +11,7 @@ namespace OpenFeature public class NoOpFeatureProvider : IFeatureProvider { private readonly Metadata _metadata = new Metadata(NoOpProvider.NoOpProviderName); - + public Metadata GetMetadata() { return _metadata; @@ -46,4 +46,4 @@ private static ResolutionDetails NoOpResponse(string flagKey, T defaultVal ); } } -} \ No newline at end of file +} diff --git a/src/OpenFeature/OpenFeature.cs b/src/OpenFeature/OpenFeature.cs index f262f26c8..1a2ddaf8e 100644 --- a/src/OpenFeature/OpenFeature.cs +++ b/src/OpenFeature/OpenFeature.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; @@ -16,19 +16,19 @@ public sealed class OpenFeature // Thread-safe singleton instance private static readonly Lazy lazy = new Lazy(); private static OpenFeature Instance => lazy.Value; - + public static void SetProvider(IFeatureProvider featureProvider) => Instance._featureProvider = featureProvider; public static IFeatureProvider GetProvider() => Instance._featureProvider; public static Metadata GetProviderMetadata() => Instance._featureProvider.GetMetadata(); public static FeatureClient GetClient(string name = null, string version = null) => new FeatureClient(Instance._featureProvider, name, version); - + public static void AddHooks(IEnumerable hooks) => Instance._hooks.AddRange(hooks); public static IEnumerable GetHooks() => Instance._hooks.AsReadOnly(); public static void ClearHooks() => Instance._hooks.Clear(); public static void SetContext(EvaluationContext context) => Instance._evaluationContext = context; public static EvaluationContext GetContext() => Instance._evaluationContext; - + public static void SetLogger(ILogger logger) => Logger = logger; } -} \ No newline at end of file +} diff --git a/src/OpenFeature/OpenFeatureClient.cs b/src/OpenFeature/OpenFeatureClient.cs index 652371642..0db9629e3 100644 --- a/src/OpenFeature/OpenFeatureClient.cs +++ b/src/OpenFeature/OpenFeatureClient.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -20,7 +20,7 @@ public FeatureClient(IFeatureProvider featureProvider, string name, string versi _featureProvider = featureProvider ?? throw new ArgumentNullException(nameof(featureProvider)); _metadata = new ClientMetadata(name, version); } - + public ClientMetadata GetMetadata() => _metadata; public void AddHooks(Hook hook) => _hooks.Add(hook); @@ -36,20 +36,20 @@ public async Task> GetBooleanDetails(string flagKey, public async Task GetStringValue(string flagKey, string defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null) => (await GetStringDetails(flagKey, defaultValue, context, config)).Value; - + public async Task> GetStringDetails(string flagKey, string defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null) => await EvaluateFlag(_featureProvider.ResolveStringValue, FlagValueType.String, flagKey, defaultValue, context, config); public async Task GetNumberValue(string flagKey, int defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null) => (await GetNumberDetails(flagKey, defaultValue, context, config)).Value; - + public async Task> GetNumberDetails(string flagKey, int defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null) => await EvaluateFlag(_featureProvider.ResolveNumberValue, FlagValueType.Number, flagKey, defaultValue, context, config); - public async Task GetObjectValue(string flagKey, T defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null) => + public async Task GetObjectValue(string flagKey, T defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null) => (await GetObjectDetails(flagKey, defaultValue, context, config)).Value; - public async Task> GetObjectDetails(string flagKey, T defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null) => + public async Task> GetObjectDetails(string flagKey, T defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null) => await EvaluateFlag(_featureProvider.ResolveStructureValue, FlagValueType.Object, flagKey, defaultValue, context, config); private async Task> EvaluateFlag( @@ -57,7 +57,7 @@ private async Task> EvaluateFlag( FlagValueType flagValueType, string flagKey, T defaultValue, EvaluationContext context = null, FlagEvaluationOptions options = null) { // New up a evaluation context if one was not provided. - if (context == null) + if (context == null) { context = new EvaluationContext(); } @@ -93,7 +93,7 @@ private async Task> EvaluateFlag( evaluation = (await resolveValueDelegate.Invoke(flagKey, defaultValue, hookContext.EvaluationContext, options)) .ToFlagEvaluationDetails(); - + await TriggerAfterHooks(allHooksReversed, hookContext, evaluation, options); } catch (Exception e) @@ -133,7 +133,7 @@ private static async Task TriggerBeforeHooks(IReadOnlyList hooks, Hook } } } - + private static async Task TriggerAfterHooks(IReadOnlyList hooks, HookContext context, FlagEvaluationDetails evaluationDetails, FlagEvaluationOptions options) { foreach (var hook in hooks) @@ -148,7 +148,7 @@ private static async Task TriggerAfterHooks(IReadOnlyList hooks, HookC } } } - + private static async Task TriggerErrorHooks(IReadOnlyList hooks, HookContext context, Exception exception, FlagEvaluationOptions options) { foreach (var hook in hooks) @@ -163,7 +163,7 @@ private static async Task TriggerErrorHooks(IReadOnlyList hooks, HookC } } } - + private static async Task TriggerFinallyHooks(IReadOnlyList hooks, HookContext context, FlagEvaluationOptions options) { foreach (var hook in hooks) @@ -179,4 +179,4 @@ private static async Task TriggerFinallyHooks(IReadOnlyList hooks, Hoo } } } -} \ No newline at end of file +} diff --git a/test/OpenFeature.Tests/NoOpFeatureProviderTest.cs b/test/OpenFeature.Tests/NoOpFeatureProviderTest.cs index c0f6daa23..fc1cc0bed 100644 --- a/test/OpenFeature.Tests/NoOpFeatureProviderTest.cs +++ b/test/OpenFeature.Tests/NoOpFeatureProviderTest.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using AutoFixture; using FluentAssertions; using OpenFeature.Constant; @@ -17,7 +17,7 @@ public async Task ShouldResolveBoolFlag() var clientName = fixture.Create(); var clientVersion = fixture.Create(); var client = new FeatureClient(new NoOpFeatureProvider(), clientName, clientVersion); - + var result = await client.GetBooleanValue(flagKey, defaultValue); var resultDetails = await client.GetBooleanDetails(flagKey, defaultValue); @@ -25,7 +25,7 @@ public async Task ShouldResolveBoolFlag() resultDetails.Reason.Should().Be(NoOpProvider.ReasonNoOp); resultDetails.Value.Should().Be(defaultValue); } - + [Fact] public async Task ShouldResolveNumberFlag() { @@ -35,7 +35,7 @@ public async Task ShouldResolveNumberFlag() var clientName = fixture.Create(); var clientVersion = fixture.Create(); var client = new FeatureClient(new NoOpFeatureProvider(), clientName, clientVersion); - + var result = await client.GetNumberValue(flagKey, defaultValue); var resultDetails = await client.GetNumberDetails(flagKey, defaultValue); @@ -43,7 +43,7 @@ public async Task ShouldResolveNumberFlag() resultDetails.Reason.Should().Be(NoOpProvider.ReasonNoOp); resultDetails.Value.Should().Be(defaultValue); } - + [Fact] public async Task ShouldResolveStringFlag() { @@ -53,7 +53,7 @@ public async Task ShouldResolveStringFlag() var clientName = fixture.Create(); var clientVersion = fixture.Create(); var client = new FeatureClient(new NoOpFeatureProvider(), clientName, clientVersion); - + var result = await client.GetStringValue(flagKey, defaultValue); var resultDetails = await client.GetStringDetails(flagKey, defaultValue); @@ -61,7 +61,7 @@ public async Task ShouldResolveStringFlag() resultDetails.Reason.Should().Be(NoOpProvider.ReasonNoOp); resultDetails.Value.Should().Be(defaultValue); } - + [Fact] public async Task ShouldResolveStructureFlag() { @@ -80,4 +80,4 @@ public async Task ShouldResolveStructureFlag() resultDetails.Value.Should().Be(testStructure); } } -} \ No newline at end of file +} diff --git a/test/OpenFeature.Tests/OpenFeatureClientTests.cs b/test/OpenFeature.Tests/OpenFeatureClientTests.cs index dfe057a51..23a7b8f76 100644 --- a/test/OpenFeature.Tests/OpenFeatureClientTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureClientTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using AutoFixture; @@ -19,7 +19,7 @@ public async Task ShouldResolveBooleanValue() var clientVersion = fixture.Create(); var flagName = fixture.Create(); var defaultValue = fixture.Create(); - + var featureProviderMock = new Mock(); featureProviderMock .Setup(x => x.ResolveBooleanValue(flagName, defaultValue, It.IsAny(), null)) @@ -29,10 +29,10 @@ public async Task ShouldResolveBooleanValue() var client = OpenFeature.GetClient(clientName, clientVersion); (await client.GetBooleanValue(flagName, defaultValue)).Should().Be(defaultValue); - + featureProviderMock.Verify(x => x.ResolveBooleanValue(flagName, defaultValue, It.IsAny(), null), Times.Once); } - + [Fact] public async Task ShouldResolveStringValue() { @@ -41,7 +41,7 @@ public async Task ShouldResolveStringValue() var clientVersion = fixture.Create(); var flagName = fixture.Create(); var defaultValue = fixture.Create(); - + var featureProviderMock = new Mock(); featureProviderMock .Setup(x => x.ResolveStringValue(flagName, defaultValue, It.IsAny(), null)) @@ -51,10 +51,10 @@ public async Task ShouldResolveStringValue() var client = OpenFeature.GetClient(clientName, clientVersion); (await client.GetStringValue(flagName, defaultValue)).Should().Be(defaultValue); - + featureProviderMock.Verify(x => x.ResolveStringValue(flagName, defaultValue, It.IsAny(), null), Times.Once); } - + [Fact] public async Task ShouldResolveNumberValue() { @@ -63,7 +63,7 @@ public async Task ShouldResolveNumberValue() var clientVersion = fixture.Create(); var flagName = fixture.Create(); var defaultValue = fixture.Create(); - + var featureProviderMock = new Mock(); featureProviderMock .Setup(x => x.ResolveNumberValue(flagName, defaultValue, It.IsAny(), null)) @@ -73,10 +73,10 @@ public async Task ShouldResolveNumberValue() var client = OpenFeature.GetClient(clientName, clientVersion); (await client.GetNumberValue(flagName, defaultValue)).Should().Be(defaultValue); - + featureProviderMock.Verify(x => x.ResolveNumberValue(flagName, defaultValue, It.IsAny(), null), Times.Once); } - + [Fact] public async Task ShouldResolveStructureValue() { @@ -85,7 +85,7 @@ public async Task ShouldResolveStructureValue() var clientVersion = fixture.Create(); var flagName = fixture.Create(); var defaultValue = fixture.Create(); - + var featureProviderMock = new Mock(); featureProviderMock .Setup(x => x.ResolveStructureValue(flagName, defaultValue, It.IsAny(), null)) @@ -95,7 +95,7 @@ public async Task ShouldResolveStructureValue() var client = OpenFeature.GetClient(clientName, clientVersion); (await client.GetObjectValue(flagName, defaultValue)).Should().Be(defaultValue); - + featureProviderMock.Verify(x => x.ResolveStructureValue(flagName, defaultValue, It.IsAny(), null), Times.Once); } @@ -108,7 +108,7 @@ public async Task WhenExceptionOccursDuringEvaluationShouldReturnError() var flagName = fixture.Create(); var defaultValue = fixture.Create(); var errorMessage = fixture.Create(); - + var featureProviderMock = new Mock(); featureProviderMock .Setup(x => x.ResolveStructureValue(flagName, defaultValue, It.IsAny(), null)) @@ -122,7 +122,7 @@ public async Task WhenExceptionOccursDuringEvaluationShouldReturnError() response.Reason.Should().Be(Constant.Reason.Error); featureProviderMock.Verify(x => x.ResolveStructureValue(flagName, defaultValue, It.IsAny(), null), Times.Once); } - + [Fact] public void ShouldAddGivenHooks() { @@ -130,16 +130,16 @@ public void ShouldAddGivenHooks() var hooks = fixture.Create>(); var clientName = fixture.Create(); var clientVersion = fixture.Create(); - + var client = OpenFeature.GetClient(clientName, clientVersion); - + client.AddHooks(hooks); client.GetHooks().Should().Contain(hooks); - + client.ClearHooks(); client.GetHooks().Should().BeEmpty(); } } -} \ No newline at end of file +} diff --git a/test/OpenFeature.Tests/OpenFeatureEvaluationContextTests.cs b/test/OpenFeature.Tests/OpenFeatureEvaluationContextTests.cs index 4b641574b..665af097e 100644 --- a/test/OpenFeature.Tests/OpenFeatureEvaluationContextTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureEvaluationContextTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using AutoFixture; using FluentAssertions; using OpenFeature.Model; @@ -63,4 +63,4 @@ public void ShouldReturnValueTypeViaGet() context.Get("key5").Should().Be(structure); } } -} \ No newline at end of file +} diff --git a/test/OpenFeature.Tests/OpenFeatureHookTests.cs b/test/OpenFeature.Tests/OpenFeatureHookTests.cs index 7e82fe0d9..3efa86cd8 100644 --- a/test/OpenFeature.Tests/OpenFeatureHookTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureHookTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using AutoFixture; using FluentAssertions; @@ -18,7 +18,7 @@ public async Task ShouldRunAllHooksSuccessfully() var clientVersion = fixture.Create(); var flagName = fixture.Create(); var defaultValue = fixture.Create(); - + var featureProviderMock = new Mock(); featureProviderMock .Setup(x => x.ResolveBooleanValue(flagName, defaultValue, It.IsAny(), null)) @@ -28,7 +28,7 @@ public async Task ShouldRunAllHooksSuccessfully() client.AddHooks(new TestHook()); (await client.GetBooleanValue(flagName, defaultValue)).Should().Be(defaultValue); - + featureProviderMock.Verify(x => x.ResolveBooleanValue(flagName, defaultValue, It.IsAny(), null), Times.Once); } @@ -40,7 +40,7 @@ public async Task ShouldCatchExceptionFromNoImplementedHookMethod() var clientVersion = fixture.Create(); var flagName = fixture.Create(); var defaultValue = fixture.Create(); - + var featureProviderMock = new Mock(); featureProviderMock .Setup(x => x.ResolveBooleanValue(flagName, defaultValue, It.IsAny(), null)) @@ -50,7 +50,7 @@ public async Task ShouldCatchExceptionFromNoImplementedHookMethod() hookMock .Setup(x => x.Before(It.IsAny>(), null)) .ThrowsAsync(new NotImplementedException()); - + hookMock .Setup(x => x.After(It.IsAny>(), It.IsAny>(), null)) .ThrowsAsync(new NotImplementedException()); @@ -63,13 +63,13 @@ public async Task ShouldCatchExceptionFromNoImplementedHookMethod() client.AddHooks(hookMock.Object); (await client.GetBooleanValue(flagName, defaultValue)).Should().Be(defaultValue); - + featureProviderMock.Verify(x => x.ResolveBooleanValue(flagName, defaultValue, It.IsAny(), null), Times.Once); hookMock.Verify(x => x.Before(It.IsAny>(), null), Times.Once); hookMock.Verify(x => x.After(It.IsAny>(), It.IsAny>(), null), Times.Once); hookMock.Verify(x => x.Finally(It.IsAny>(), null), Times.Once); } - + [Fact] public async Task ShouldCatchExceptionFromNoImplementedHookMethodWhenProviderThrowException() { @@ -78,7 +78,7 @@ public async Task ShouldCatchExceptionFromNoImplementedHookMethodWhenProviderThr var clientVersion = fixture.Create(); var flagName = fixture.Create(); var defaultValue = fixture.Create(); - + var featureProviderMock = new Mock(); featureProviderMock .Setup(x => x.ResolveBooleanValue(flagName, defaultValue, It.IsAny(), null)) @@ -88,7 +88,7 @@ public async Task ShouldCatchExceptionFromNoImplementedHookMethodWhenProviderThr hookMock .Setup(x => x.Before(It.IsAny>(), null)) .ThrowsAsync(new NotImplementedException()); - + hookMock .Setup(x => x.Error(It.IsAny>(), It.IsAny(), null)) .ThrowsAsync(new NotImplementedException()); @@ -101,11 +101,11 @@ public async Task ShouldCatchExceptionFromNoImplementedHookMethodWhenProviderThr client.AddHooks(hookMock.Object); (await client.GetBooleanValue(flagName, defaultValue)).Should().Be(defaultValue); - + featureProviderMock.Verify(x => x.ResolveBooleanValue(flagName, defaultValue, It.IsAny(), null), Times.Once); hookMock.Verify(x => x.Before(It.IsAny>(), null), Times.Once); hookMock.Verify(x => x.Error(It.IsAny>(), It.IsAny(), null), Times.Once); hookMock.Verify(x => x.Finally(It.IsAny>(), null), Times.Once); } } -} \ No newline at end of file +} diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index ca7c47b25..f5a8611e1 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using AutoFixture; using FluentAssertions; @@ -28,7 +28,7 @@ public void ShouldSetGivenContext() { var fixture = new Fixture(); var context = fixture.Create(); - + OpenFeature.SetContext(context); OpenFeature.GetContext().Should().Equal(context); @@ -39,14 +39,14 @@ public void ShouldAddGivenHooks() { var fixture = new Fixture(); var hooks = fixture.Create>(); - + OpenFeature.AddHooks(hooks); OpenFeature.GetHooks().Should().Contain(hooks); - + OpenFeature.ClearHooks(); OpenFeature.GetHooks().Should().BeEmpty(); } } -} \ No newline at end of file +} diff --git a/test/OpenFeature.Tests/TestImplementations.cs b/test/OpenFeature.Tests/TestImplementations.cs index eb166bc25..d0dc78f9b 100644 --- a/test/OpenFeature.Tests/TestImplementations.cs +++ b/test/OpenFeature.Tests/TestImplementations.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using OpenFeature.Model; @@ -72,4 +72,4 @@ public Task> ResolveStructureValue(string flagKey, T def throw new NotImplementedException(); } } -} \ No newline at end of file +}