Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions bench/Polly.Core.Benchmarks/Utils/Helper.StrategyPipeline.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ internal static partial class Helper
{
public static object CreatePipeline(PollyVersion technology, int count) => technology switch
{
PollyVersion.V7 => count == 1 ? Policy.NoOpAsync<string>() : Policy.WrapAsync(Enumerable.Repeat(0, count).Select(_ => Policy.NoOpAsync<string>()).ToArray()),
PollyVersion.V7 => count == 1 ? Policy.NoOpAsync<string>() : Policy.WrapAsync([.. Enumerable.Repeat(0, count).Select(_ => Policy.NoOpAsync<string>())]),

PollyVersion.V8 => CreateStrategy(builder =>
{
for (var i = 0; i < count; i++)
{
builder.AddStrategy(_ => new EmptyResilienceStrategy(), new EmptyResilienceOptions());
builder.AddStrategy(static _ => new EmptyResilienceStrategy(), new EmptyResilienceOptions());
}
}),
_ => throw new NotSupportedException()
Expand Down
1 change: 1 addition & 0 deletions exclusion.dic
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
simmy
stryker
4 changes: 2 additions & 2 deletions src/Polly.Core/CircuitBreaker/CircuitBreakerManualControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public async Task IsolateAsync(CancellationToken cancellationToken = default)
Func<ResilienceContext, Task>[] callbacks;
lock (_lock)
{
callbacks = _onIsolate.ToArray();
callbacks = [.. _onIsolate];
_isolated = true;
}

Expand Down Expand Up @@ -98,7 +98,7 @@ public async Task CloseAsync(CancellationToken cancellationToken = default)
Func<ResilienceContext, Task>[] callbacks;
lock (_lock)
{
callbacks = _onReset.ToArray();
callbacks = [.. _onReset];
_isolated = false;
}

Expand Down
6 changes: 2 additions & 4 deletions src/Polly.Core/Simmy/Utils/GeneratorHelper.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
namespace Polly.Simmy.Utils;

internal sealed class GeneratorHelper<TResult>
internal sealed class GeneratorHelper<TResult>(Func<int, int> weightGenerator)
{
private readonly Func<int, int> _weightGenerator;
private readonly Func<int, int> _weightGenerator = weightGenerator;

private readonly List<int> _weights = [];
private readonly List<Func<ResilienceContext, Outcome<TResult>>> _factories = [];
private int _totalWeight;

public GeneratorHelper(Func<int, int> weightGenerator) => _weightGenerator = weightGenerator;

public void AddOutcome(Func<ResilienceContext, Outcome<TResult>> generator, int weight)
{
Guard.NotNull(generator);
Expand Down
9 changes: 4 additions & 5 deletions src/Polly.Core/Utils/Pipeline/CompositeComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,20 +38,19 @@ public static PipelineComponent Create(
}

// convert all components to delegating ones (except the last one as it's not required)
var delegatingComponents = components
DelegatingComponent[] delegatingComponents = [.. components
.Take(components.Count - 1)
.Select(strategy => new DelegatingComponent(strategy))
.ToList();
.Select(static strategy => new DelegatingComponent(strategy))];

#if NET6_0_OR_GREATER
// link the last one
delegatingComponents[^1].Next = components[^1];
#else
delegatingComponents[delegatingComponents.Count - 1].Next = components[components.Count - 1];
delegatingComponents[delegatingComponents.Length - 1].Next = components[components.Count - 1];
#endif

// link the remaining ones
for (var i = 0; i < delegatingComponents.Count - 1; i++)
for (var i = 0; i < delegatingComponents.Length - 1; i++)
{
delegatingComponents[i].Next = delegatingComponents[i + 1];
}
Expand Down
4 changes: 2 additions & 2 deletions src/Polly.Extensions/Telemetry/TelemetryListenerImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ internal sealed class TelemetryListenerImpl : TelemetryListener

public TelemetryListenerImpl(TelemetryOptions options)
{
_enrichers = options.MeteringEnrichers.ToList();
_enrichers = [.. options.MeteringEnrichers];
_logger = options.LoggerFactory.CreateLogger(TelemetryUtil.PollyDiagnosticSource);
_resultFormatter = options.ResultFormatter;
_listeners = options.TelemetryListeners.ToList();
_listeners = [.. options.TelemetryListeners];
_severityProvider = options.SeverityProvider;

Counter = Meter.CreateCounter<int>(
Expand Down
4 changes: 2 additions & 2 deletions src/Polly.Extensions/Telemetry/TelemetryOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ public TelemetryOptions(TelemetryOptions other)
{
Guard.NotNull(other);

TelemetryListeners = other.TelemetryListeners.ToList();
TelemetryListeners = [.. other.TelemetryListeners];
LoggerFactory = other.LoggerFactory;
MeteringEnrichers = other.MeteringEnrichers.ToList();
MeteringEnrichers = [.. other.MeteringEnrichers];
ResultFormatter = other.ResultFormatter;
SeverityProvider = other.SeverityProvider;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Polly.Extensions/Telemetry/TelemetryUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ internal static class TelemetryUtil
{
private const int MaxIntegers = 100;

private static readonly object[] Integers = Enumerable.Range(0, MaxIntegers).Select(v => (object)v).ToArray();
private static readonly object[] Integers = [.. Enumerable.Range(0, MaxIntegers).Select(v => (object)v)];

private static readonly object True = true;

Expand Down
2 changes: 1 addition & 1 deletion src/Polly.Testing/ResiliencePipelineExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ private static ResiliencePipelineDescriptor GetPipelineDescriptorCore<T>(Pipelin

return new ResiliencePipelineDescriptor(
descriptors,
isReloadable: components.Exists(s => s is ReloadableComponent));
isReloadable: components.Exists(static s => s is ReloadableComponent));
}

private static object GetStrategyInstance<T>(PipelineComponent component)
Expand Down
4 changes: 2 additions & 2 deletions src/Polly/Wrap/IAsyncPolicyPolicyWrapExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ public static AsyncPolicyWrap WrapAsync(params IAsyncPolicy[] policies)
{
< MinimumPoliciesRequiredForWrap => throw new ArgumentException("The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)),
MinimumPoliciesRequiredForWrap => new AsyncPolicyWrap((AsyncPolicy)policies[0], policies[1]),
_ => WrapAsync(policies[0], WrapAsync(policies.Skip(1).ToArray())),
_ => WrapAsync(policies[0], WrapAsync([.. policies.Skip(1)])),
};
#pragma warning restore S3215 // "interface" instances should not be cast to concrete types
}
Expand All @@ -202,7 +202,7 @@ public static AsyncPolicyWrap<TResult> WrapAsync<TResult>(params IAsyncPolicy<TR
{
< MinimumPoliciesRequiredForWrap => throw new ArgumentException("The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)),
MinimumPoliciesRequiredForWrap => new AsyncPolicyWrap<TResult>((AsyncPolicy<TResult>)policies[0], policies[1]),
_ => WrapAsync(policies[0], WrapAsync(policies.Skip(1).ToArray())),
_ => WrapAsync(policies[0], WrapAsync([.. policies.Skip(1)])),
};
#pragma warning restore S3215 // "interface" instances should not be cast to concrete types
}
Expand Down
2 changes: 1 addition & 1 deletion src/Polly/Wrap/ISyncPolicyPolicyWrapExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ public static PolicyWrap<TResult> Wrap<TResult>(params ISyncPolicy<TResult>[] po
< MinimumPoliciesRequiredForWrap => throw new ArgumentException(
"The enumerable of policies to form the wrap must contain at least two policies.", nameof(policies)),
MinimumPoliciesRequiredForWrap => new PolicyWrap<TResult>((Policy<TResult>)policies[0], policies[1]),
_ => Wrap(policies[0], Wrap(policies.Skip(1).ToArray())),
_ => Wrap(policies[0], Wrap([.. policies.Skip(1)])),
};
#pragma warning restore S3215 // "interface" instances should not be cast to concrete types
}
Expand Down
4 changes: 1 addition & 3 deletions src/Snippets/Docs/Retry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -187,9 +187,7 @@ public static void Pattern_OverusingBuilder()
typeof(RateLimitRejectedException),
];

ImmutableArray<Type> retryableExceptions = networkExceptions
.Union(strategyExceptions)
.ToImmutableArray();
ImmutableArray<Type> retryableExceptions = [.. networkExceptions.Union(strategyExceptions)];

var retry = new ResiliencePipelineBuilder()
.AddRetry(new()
Expand Down
2 changes: 1 addition & 1 deletion test/Polly.Core.Tests/ResiliencePipelineTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -181,5 +181,5 @@ public ExecuteParameters(Action<ResiliencePipeline> execute)
public override string ToString() => Caption;
}

public static IEnumerable<object[]> ConvertExecuteParameters(Func<IEnumerable<ExecuteParameters>> parameters) => parameters().Select(p => new object[] { p }).ToArray();
public static IEnumerable<object[]> ConvertExecuteParameters(Func<IEnumerable<ExecuteParameters>> parameters) => [.. parameters().Select(p => new object[] { p })];
}
2 changes: 1 addition & 1 deletion test/Polly.Core.Tests/Retry/RetryHelperTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ private static IReadOnlyList<TimeSpan> GetExponentialWithJitterBackoff(bool cont
{
if (contrib)
{
return Backoff.DecorrelatedJitterBackoffV2(baseDelay, retryCount, 0, false).Take(retryCount).ToArray();
return [.. Backoff.DecorrelatedJitterBackoffV2(baseDelay, retryCount, 0, false).Take(retryCount)];
}

var random = randomizer ?? new Random(0).NextDouble;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,7 @@ public void PipelineExecution_Logged(bool exception)
var messages = _logger.GetRecords(new EventId(1, "StrategyExecuting")).ToList();
messages.Count.ShouldBe(1);
messages[0].Message.ShouldBe("Resilience pipeline executing. Source: 'my-pipeline/my-instance', Operation Key: 'op-key'");
messages = _logger.GetRecords(new EventId(2, "StrategyExecuted")).ToList();
messages = [.. _logger.GetRecords(new EventId(2, "StrategyExecuted"))];
messages.Count.ShouldBe(1);
messages[0].Message.ShouldMatch($"Resilience pipeline executed. Source: 'my-pipeline/my-instance', Operation Key: 'op-key', Result: '{result}', Execution Time: 10000ms");
messages[0].LogLevel.ShouldBe(LogLevel.Debug);
Expand Down Expand Up @@ -489,7 +489,7 @@ public void SeverityProvider_EnsureRespected()
called.ShouldBeTrue();
}

private List<Dictionary<string, object?>> GetEvents(string eventName) => _events.Where(e => e.Name == eventName).Select(v => v.Tags).ToList();
private List<Dictionary<string, object?>> GetEvents(string eventName) => [.. _events.Where(e => e.Name == eventName).Select(v => v.Tags)];

private TelemetryListenerImpl Create(IEnumerable<MeteringEnricher>? enrichers = null, Action<TelemetryOptions>? configure = null)
{
Expand Down
16 changes: 10 additions & 6 deletions test/Polly.Specs/Helpers/ContextualPolicyTResultExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@

public static class ContextualPolicyTResultExtensions
{
public static TResult RaiseResultSequence<TResult>(this Policy<TResult> policy,
public static TResult RaiseResultSequence<TResult>(
this Policy<TResult> policy,
IDictionary<string, object> contextData,
params TResult[] resultsToRaise) =>
policy.RaiseResultSequence(contextData, resultsToRaise.ToList());

public static TResult RaiseResultSequence<TResult>(this Policy<TResult> policy,
public static TResult RaiseResultSequence<TResult>(
this Policy<TResult> policy,
IDictionary<string, object> contextData,
IEnumerable<TResult> resultsToRaise)
{
Expand All @@ -24,12 +26,14 @@ public static TResult RaiseResultSequence<TResult>(this Policy<TResult> policy,
}, contextData);
}

public static PolicyResult<TResult> RaiseResultSequenceOnExecuteAndCapture<TResult>(this Policy<TResult> policy,
IDictionary<string, object> contextData,
params TResult[] resultsToRaise) =>
public static PolicyResult<TResult> RaiseResultSequenceOnExecuteAndCapture<TResult>(
this Policy<TResult> policy,
IDictionary<string, object> contextData,
params TResult[] resultsToRaise) =>
policy.RaiseResultSequenceOnExecuteAndCapture(contextData, resultsToRaise.ToList());

public static PolicyResult<TResult> RaiseResultSequenceOnExecuteAndCapture<TResult>(this Policy<TResult> policy,
public static PolicyResult<TResult> RaiseResultSequenceOnExecuteAndCapture<TResult>(
this Policy<TResult> policy,
IDictionary<string, object> contextData,
IEnumerable<TResult> resultsToRaise)
{
Expand Down
22 changes: 16 additions & 6 deletions test/Polly.Specs/Helpers/PolicyTResultExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ public static TResult RaiseResultSequence<TResult>(this Policy<TResult> policy,
public static TResult RaiseResultAndOrExceptionSequence<TResult>(this Policy<TResult> policy, params object[] resultsOrExceptionsToRaise) =>
policy.RaiseResultAndOrExceptionSequence(resultsOrExceptionsToRaise.ToList());

public static TResult RaiseResultAndOrExceptionSequence<TResult>(this Policy<TResult> policy,
IEnumerable<object> resultsOrExceptionsToRaise)
public static TResult RaiseResultAndOrExceptionSequence<TResult>(this Policy<TResult> policy, IEnumerable<object> resultsOrExceptionsToRaise)
{
using var enumerator = resultsOrExceptionsToRaise.GetEnumerator();
return policy.Execute(() =>
Expand Down Expand Up @@ -58,13 +57,24 @@ public class ResultAndOrCancellationScenario
public bool ActionObservesCancellation = true;
}

public static TResult RaiseResultSequenceAndOrCancellation<TResult>(this Policy<TResult> policy,
Scenario scenario, CancellationTokenSource cancellationTokenSource, Action onExecute,
public static TResult RaiseResultSequenceAndOrCancellation<TResult>(
this Policy<TResult> policy,
Scenario scenario,
CancellationTokenSource cancellationTokenSource,
Action onExecute,
params TResult[] resultsToRaise) =>
policy.RaiseResultSequenceAndOrCancellation(scenario, cancellationTokenSource, onExecute,
policy.RaiseResultSequenceAndOrCancellation(
scenario,
cancellationTokenSource,
onExecute,
resultsToRaise.ToList());

public static TResult RaiseResultSequenceAndOrCancellation<TResult>(this Policy<TResult> policy, Scenario scenario, CancellationTokenSource cancellationTokenSource, Action onExecute, IEnumerable<TResult> resultsToRaise)
public static TResult RaiseResultSequenceAndOrCancellation<TResult>(
this Policy<TResult> policy,
Scenario scenario,
CancellationTokenSource cancellationTokenSource,
Action onExecute,
IEnumerable<TResult> resultsToRaise)
{
int counter = 0;

Expand Down
29 changes: 19 additions & 10 deletions test/Polly.Specs/Helpers/PolicyTResultExtensionsAsync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@ public static Task<TResult> RaiseResultSequenceAsync<TResult>(this AsyncPolicy<T
public static Task<TResult> RaiseResultSequenceAsync<TResult>(this AsyncPolicy<TResult> policy, IEnumerable<TResult> resultsToRaise) =>
policy.RaiseResultSequenceAsync(default, resultsToRaise);

public static async Task<TResult> RaiseResultSequenceAsync<TResult>(this AsyncPolicy<TResult> policy,
CancellationToken cancellationToken, IEnumerable<TResult> resultsToRaise)
public static async Task<TResult> RaiseResultSequenceAsync<TResult>(
this AsyncPolicy<TResult> policy,
CancellationToken cancellationToken,
IEnumerable<TResult> resultsToRaise)
{
using var enumerator = resultsToRaise.GetEnumerator();
return await policy.ExecuteAsync(_ =>
Expand All @@ -28,12 +30,13 @@ public static async Task<TResult> RaiseResultSequenceAsync<TResult>(this AsyncPo
public static Task<TResult> RaiseResultAndOrExceptionSequenceAsync<TResult>(this AsyncPolicy<TResult> policy, params object[] resultsOrExceptionsToRaise) =>
policy.RaiseResultAndOrExceptionSequenceAsync(resultsOrExceptionsToRaise.ToList());

public static Task<TResult> RaiseResultAndOrExceptionSequenceAsync<TResult>(this AsyncPolicy<TResult> policy,
IEnumerable<object> resultsOrExceptionsToRaise) =>
public static Task<TResult> RaiseResultAndOrExceptionSequenceAsync<TResult>(this AsyncPolicy<TResult> policy, IEnumerable<object> resultsOrExceptionsToRaise) =>
policy.RaiseResultAndOrExceptionSequenceAsync(CancellationToken.None, resultsOrExceptionsToRaise);

public static async Task<TResult> RaiseResultAndOrExceptionSequenceAsync<TResult>(this AsyncPolicy<TResult> policy,
CancellationToken cancellationToken, IEnumerable<object> resultsOrExceptionsToRaise)
public static async Task<TResult> RaiseResultAndOrExceptionSequenceAsync<TResult>(
this AsyncPolicy<TResult> policy,
CancellationToken cancellationToken,
IEnumerable<object> resultsOrExceptionsToRaise)
{
using var enumerator = resultsOrExceptionsToRaise.GetEnumerator();
return await policy.ExecuteAsync(_ =>
Expand Down Expand Up @@ -67,15 +70,21 @@ public class ResultAndOrCancellationScenario
public bool ActionObservesCancellation = true;
}

public static Task<TResult> RaiseResultSequenceAndOrCancellationAsync<TResult>(this AsyncPolicy<TResult> policy,
Scenario scenario, CancellationTokenSource cancellationTokenSource, Action onExecute,
public static Task<TResult> RaiseResultSequenceAndOrCancellationAsync<TResult>(
this AsyncPolicy<TResult> policy,
Scenario scenario,
CancellationTokenSource cancellationTokenSource,
Action onExecute,
params TResult[] resultsToRaise) =>
policy.RaiseResultSequenceAndOrCancellationAsync(scenario, cancellationTokenSource, onExecute,
resultsToRaise.ToList());

public static async Task<TResult> RaiseResultSequenceAndOrCancellationAsync<TResult>(
this AsyncPolicy<TResult> policy, Scenario scenario, CancellationTokenSource cancellationTokenSource,
Action onExecute, IEnumerable<TResult> resultsToRaise)
this AsyncPolicy<TResult> policy,
Scenario scenario,
CancellationTokenSource cancellationTokenSource,
Action onExecute,
IEnumerable<TResult> resultsToRaise)
{
int counter = 0;

Expand Down
2 changes: 1 addition & 1 deletion test/Polly.Specs/Wrap/IPolicyWrapExtensionSpecs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public void Should_pass_all_nested_policies_from_PolicyWrap_in_same_order_they_w

PolicyWrap policyWrap = Policy.Wrap(policy0, policy1, policy2);

List<IsPolicy> policies = policyWrap.GetPolicies().ToList();
List<IsPolicy> policies = [.. policyWrap.GetPolicies()];
policies.Count.ShouldBe(3);
policies[0].ShouldBe(policy0);
policies[1].ShouldBe(policy1);
Expand Down
Loading