Skip to content
Closed
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
2 changes: 1 addition & 1 deletion DevProxy.Abstractions/DevProxy.Abstractions.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<PackageReference Include="Microsoft.OpenApi.Readers" Version="1.6.24" />
<PackageReference Include="Newtonsoft.Json.Schema" Version="4.0.1" />
<PackageReference Include="Prompty.Core" Version="0.2.2-beta" />
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
<PackageReference Include="System.CommandLine" Version="2.0.0-beta5.25306.1" />
<PackageReference Include="Unobtanium.Web.Proxy" Version="0.1.5" />
</ItemGroup>

Expand Down
42 changes: 21 additions & 21 deletions DevProxy.Abstractions/Extensions/CommandLineExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public static class CommandLineExtensions
throw new InvalidOperationException($"Could not find option with name {optionName} and value type {typeof(T).Name}");
}

return parseResult.GetValueForOption(option);
return parseResult.GetValue(option);
}

public static IEnumerable<T> OrderByName<T>(this IEnumerable<T> symbols) where T : Symbol
Expand All @@ -30,26 +30,26 @@ public static IEnumerable<T> OrderByName<T>(this IEnumerable<T> symbols) where T
return symbols.OrderBy(ByName, StringComparer.Ordinal);
}

public static void AddCommands(this Command command, IEnumerable<Command> subcommands)
{
ArgumentNullException.ThrowIfNull(command);
ArgumentNullException.ThrowIfNull(subcommands);
foreach (var subcommand in subcommands)
{
command.AddCommand(subcommand);
}
}
public static void AddOptions(this Command command, IEnumerable<Option> options)
{
ArgumentNullException.ThrowIfNull(command);
ArgumentNullException.ThrowIfNull(options);
foreach (var option in options)
{
command.AddOption(option);
}
public static void AddCommands(this Command command, IEnumerable<Command> subcommands)
{
ArgumentNullException.ThrowIfNull(command);
ArgumentNullException.ThrowIfNull(subcommands);

foreach (var subcommand in subcommands)
{
command.Add(subcommand);
}
}

public static void AddOptions(this Command command, IEnumerable<Option> options)
{
ArgumentNullException.ThrowIfNull(command);
ArgumentNullException.ThrowIfNull(options);

foreach (var option in options)
{
command.Add(option);
}
}

private static string ByName<T>(T symbol) where T : Symbol => symbol.Name;
Expand Down
15 changes: 7 additions & 8 deletions DevProxy.Abstractions/Proxy/ProxyEvents.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using DevProxy.Abstractions.Utils;
using DevProxy.Abstractions.Utils;
using System.CommandLine;
using System.CommandLine.Invocation;
using System.Text.Json.Serialization;
using Titanium.Web.Proxy.EventArguments;

Expand Down Expand Up @@ -48,12 +47,12 @@ public class InitArgs
public required IServiceProvider ServiceProvider { get; init; }
}

public class OptionsLoadedArgs(InvocationContext context, IReadOnlyList<Option> options)
{
public InvocationContext Context { get; set; } = context ??
throw new ArgumentNullException(nameof(context));
public IReadOnlyList<Option> Options { get; set; } = options ??
throw new ArgumentNullException(nameof(options));
public class OptionsLoadedArgs(ParseResult parseResult, IReadOnlyList<Option> options)
{
public ParseResult ParseResult { get; set; } = parseResult ??
throw new ArgumentNullException(nameof(parseResult));
public IReadOnlyList<Option> Options { get; set; } = options ??
throw new ArgumentNullException(nameof(options));
}

public class RequestLog
Expand Down
6 changes: 3 additions & 3 deletions DevProxy.Abstractions/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,9 @@
},
"System.CommandLine": {
"type": "Direct",
"requested": "[2.0.0-beta4.22272.1, )",
"resolved": "2.0.0-beta4.22272.1",
"contentHash": "1uqED/q2H0kKoLJ4+hI2iPSBSEdTuhfCYADeJrAqERmiGQ2NNacYKRNEQ+gFbU4glgVyK8rxI+ZOe1onEtr/Pg=="
"requested": "[2.0.0-beta5.25306.1, )",
"resolved": "2.0.0-beta5.25306.1",
"contentHash": "ce0wuowuh13Cd7GXqLCq77/YWlxQMxrVCMIO/2/QUP6CdP/JWnlYSN/N3/55wwGsUwa9CvPuT8ddjgyypUr5ag=="
},
"Unobtanium.Web.Proxy": {
"type": "Direct",
Expand Down
67 changes: 32 additions & 35 deletions DevProxy.Plugins/Behavior/GenericRandomErrorPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,43 +67,40 @@ public override async Task InitializeAsync(InitArgs e)
ValidateErrors();
}

public override Option[] GetOptions()
{
var _rateOption = new Option<int?>(_rateOptionName, "The percentage of chance that a request will fail");
_rateOption.AddAlias("-f");
_rateOption.ArgumentHelpName = "failure rate";
_rateOption.AddValidator((input) =>
{
try
{
var value = input.GetValueForOption(_rateOption);
if (value.HasValue && (value < 0 || value > 100))
{
input.ErrorMessage = $"{value} is not a valid failure rate. Specify a number between 0 and 100";
}
}
catch (InvalidOperationException ex)
{
input.ErrorMessage = ex.Message;
}
});

return [_rateOption];
public override Option[] GetOptions()
{
var _rateOption = new Option<int?>(_rateOptionName, ["-f"])
{
Description = "The percentage of chance that a request will fail",
HelpName = "failure rate"
};

// Add validation for rate option
_rateOption.Validators.Add(result =>
{
var rate = result.GetValueOrDefault<int?>();
if (rate is not null && (rate < 0 || rate > 100))
{
result.AddError($"Rate must be between 0 and 100. Received: {rate}");
}
});

return [_rateOption];
}

public override void OptionsLoaded(OptionsLoadedArgs e)
{
ArgumentNullException.ThrowIfNull(e);
base.OptionsLoaded(e);
var context = e.Context;
var rate = context.ParseResult.GetValueForOption<int?>(_rateOptionName, e.Options);
if (rate is not null)
{
Configuration.Rate = rate.Value;
}
public override void OptionsLoaded(OptionsLoadedArgs e)
{
ArgumentNullException.ThrowIfNull(e);

base.OptionsLoaded(e);

var parseResult = e.ParseResult;

var rate = parseResult.GetValueForOption<int?>(_rateOptionName, e.Options);
if (rate is not null)
{
Configuration.Rate = rate.Value;
}
}

public override Task BeforeRequestAsync(ProxyRequestArgs e)
Expand Down
73 changes: 35 additions & 38 deletions DevProxy.Plugins/Behavior/GraphRandomErrorPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,35 +103,32 @@ public sealed class GraphRandomErrorPlugin(

public override string Name => nameof(GraphRandomErrorPlugin);

public override Option[] GetOptions()
{
var _allowedErrors = new Option<IEnumerable<int>>(_allowedErrorsOptionName, "List of errors that Dev Proxy may produce")
{
ArgumentHelpName = "allowed errors",
AllowMultipleArgumentsPerToken = true
};
_allowedErrors.AddAlias("-a");

var _rateOption = new Option<int?>(_rateOptionName, "The percentage of chance that a request will fail");
_rateOption.AddAlias("-f");
_rateOption.ArgumentHelpName = "failure rate";
_rateOption.AddValidator((input) =>
{
try
{
var value = input.GetValueForOption(_rateOption);
if (value.HasValue && (value < 0 || value > 100))
{
input.ErrorMessage = $"{value} is not a valid failure rate. Specify a number between 0 and 100";
}
}
catch (InvalidOperationException ex)
{
input.ErrorMessage = ex.Message;
}
});

return [_allowedErrors, _rateOption];
public override Option[] GetOptions()
{
var _allowedErrors = new Option<IEnumerable<int>>(_allowedErrorsOptionName, ["-a"])
{
Description = "List of errors that Dev Proxy may produce",
HelpName = "allowed errors",
AllowMultipleArgumentsPerToken = true
};

var _rateOption = new Option<int?>(_rateOptionName, ["-f"])
{
Description = "The percentage of chance that a request will fail",
HelpName = "failure rate"
};

// Add validation for rate option
_rateOption.Validators.Add(result =>
{
var rate = result.GetValueOrDefault<int?>();
if (rate is not null && (rate < 0 || rate > 100))
{
result.AddError($"Rate must be between 0 and 100. Received: {rate}");
}
});

return [_allowedErrors, _rateOption];
}

public override void OptionsLoaded(OptionsLoadedArgs e)
Expand All @@ -140,10 +137,10 @@ public override void OptionsLoaded(OptionsLoadedArgs e)

base.OptionsLoaded(e);

var context = e.Context;
// Configure the allowed errors
var allowedErrors = context.ParseResult.GetValueForOption<IEnumerable<int>?>(_allowedErrorsOptionName, e.Options);
var parseResult = e.ParseResult;

// Configure the allowed errors
var allowedErrors = parseResult.GetValueForOption<IEnumerable<int>?>(_allowedErrorsOptionName, e.Options);
if (allowedErrors?.Any() ?? false)
{
Configuration.AllowedErrors = [.. allowedErrors];
Expand All @@ -157,11 +154,11 @@ public override void OptionsLoaded(OptionsLoadedArgs e)
}
}

var rate = context.ParseResult.GetValueForOption<int?>(_rateOptionName, e.Options);
if (rate is not null)
{
Configuration.Rate = rate.Value;
}
var rate = parseResult.GetValueForOption<int?>(_rateOptionName, e.Options);
if (rate is not null)
{
Configuration.Rate = rate.Value;
}
}

public override Task BeforeRequestAsync(ProxyRequestArgs e)
Expand Down
2 changes: 1 addition & 1 deletion DevProxy.Plugins/DevProxy.Plugins.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
<Private>false</Private>
<ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1">
<PackageReference Include="System.CommandLine" Version="2.0.0-beta5.25306.1">
<Private>false</Private>
<ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>
Expand Down
39 changes: 19 additions & 20 deletions DevProxy.Plugins/Mocking/MockResponsePlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,20 +70,19 @@ public override async Task InitializeAsync(InitArgs e)
_loader = ActivatorUtilities.CreateInstance<MockResponsesLoader>(e.ServiceProvider, Configuration);
}

public override Option[] GetOptions()
{
var _noMocks = new Option<bool?>(_noMocksOptionName, "Disable loading mock requests")
{
ArgumentHelpName = "no mocks"
};
_noMocks.AddAlias("-n");

var _mocksFile = new Option<string?>(_mocksFileOptionName, "Provide a file populated with mock responses")
{
ArgumentHelpName = "mocks file"
};

return [_noMocks, _mocksFile];
public override Option[] GetOptions()
{
var _noMocks = new Option<bool?>("--no-mocks", ["-n"])
{
Description = "Disable loading mock requests"
};

var _mocksFile = new Option<string?>("--mocks-file")
{
Description = "Provide a file populated with mock responses"
};

return [_noMocks, _mocksFile];
}

public override void OptionsLoaded(OptionsLoadedArgs e)
Expand All @@ -92,10 +91,10 @@ public override void OptionsLoaded(OptionsLoadedArgs e)

base.OptionsLoaded(e);

var context = e.Context;
// allow disabling of mocks as a command line option
var noMocks = context.ParseResult.GetValueForOption<bool?>(_noMocksOptionName, e.Options);
var parseResult = e.ParseResult;

// allow disabling of mocks as a command line option
var noMocks = parseResult.GetValueForOption<bool?>(_noMocksOptionName, e.Options);
if (noMocks.HasValue)
{
Configuration.NoMocks = noMocks.Value;
Expand All @@ -106,8 +105,8 @@ public override void OptionsLoaded(OptionsLoadedArgs e)
return;
}

// update the name of the mocks file to load from if supplied
var mocksFile = context.ParseResult.GetValueForOption<string?>(_mocksFileOptionName, e.Options);
// update the name of the mocks file to load from if supplied
var mocksFile = parseResult.GetValueForOption<string?>(_mocksFileOptionName, e.Options);
if (mocksFile is not null)
{
Configuration.MocksFile = mocksFile;
Expand Down
30 changes: 12 additions & 18 deletions DevProxy.Plugins/Reporting/ExecutionSummaryPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,21 +40,15 @@ public sealed class ExecutionSummaryPlugin(

public override string Name => nameof(ExecutionSummaryPlugin);

public override Option[] GetOptions()
{
var groupBy = new Option<SummaryGroupBy?>(_groupByOptionName, "Specifies how the information should be grouped in the summary. Available options: `url` (default), `messageType`.")
{
ArgumentHelpName = "summary-group-by"
};
groupBy.AddValidator(input =>
{
if (!Enum.TryParse<SummaryGroupBy>(input.Tokens[0].Value, true, out var groupBy))
{
input.ErrorMessage = $"{input.Tokens[0].Value} is not a valid option to group by. Allowed values are: {string.Join(", ", Enum.GetNames<SummaryGroupBy>())}";
}
});

return [groupBy];
public override Option[] GetOptions()
{
var groupBy = new Option<SummaryGroupBy?>(_groupByOptionName)
{
Description = "Specifies how the information should be grouped in the summary. Available options: `url` (default), `messageType`.",
HelpName = "summary-group-by"
};

return [groupBy];
}

public override void OptionsLoaded(OptionsLoadedArgs e)
Expand All @@ -63,9 +57,9 @@ public override void OptionsLoaded(OptionsLoadedArgs e)

base.OptionsLoaded(e);

var context = e.Context;
var groupBy = context.ParseResult.GetValueForOption<SummaryGroupBy?>(_groupByOptionName, e.Options);
var parseResult = e.ParseResult;

var groupBy = parseResult.GetValueForOption<SummaryGroupBy?>(_groupByOptionName, e.Options);
if (groupBy is not null)
{
Configuration.GroupBy = groupBy.Value;
Expand Down
Loading