Fix ordering of parameters within command help usage (#118)

This commit is contained in:
David Fallah
2022-01-04 20:12:17 +00:00
committed by GitHub
parent a9ef693dc1
commit f6ef6cd4c0
3 changed files with 54 additions and 3 deletions

View File

@@ -223,6 +223,56 @@ public class NamedChildCommand : ICommand
stdErr.Should().NotBeNullOrWhiteSpace();
}
// Regression test for #117
[Fact]
public async Task Help_text_lists_parameters_in_specified_order()
{
// Arrange
var commandType = DynamicCommandBuilder.Compile(
// language=cs
@"
public abstract class CommandBase : ICommand
{
[CommandParameter(0)]
public string Foo { get; set; }
public abstract ValueTask ExecuteAsync(IConsole console);
}
[Command]
public class Command : CommandBase
{
[CommandParameter(1)]
public string Bar { get; set; }
[CommandParameter(2)]
public IReadOnlyList<string> Baz { get; set; }
public override ValueTask ExecuteAsync(IConsole console) => default;
}
");
var application = new CliApplicationBuilder()
.AddCommand(commandType)
.UseConsole(FakeConsole)
.Build();
// Act
var exitCode = await application.RunAsync(
new[] { "--help" },
new Dictionary<string, string>()
);
var stdOut = FakeConsole.ReadOutputString();
// Assert
exitCode.Should().Be(0);
stdOut.Should().ContainAllInOrder(
"USAGE",
"<foo>", "<bar>", "<baz...>"
);
}
[Fact]
public async Task Help_text_shows_application_metadata()
{

View File

@@ -106,13 +106,13 @@ internal static class DynamicCommandBuilder
// Return all defined commands
var commandTypes = generatedAssembly
.GetTypes()
.Where(t => t.IsAssignableTo(typeof(ICommand)))
.Where(t => t.IsAssignableTo(typeof(ICommand)) && !t.IsAbstract)
.ToArray();
if (commandTypes.Length <= 0)
{
throw new InvalidOperationException(
"There are no command definitions in the provide source code."
"There are no command definitions in the provided source code."
);
}
@@ -126,7 +126,7 @@ internal static class DynamicCommandBuilder
if (commandTypes.Count > 1)
{
throw new InvalidOperationException(
"There are more than one command definitions in the provide source code."
"There are more than one command definitions in the provided source code."
);
}

View File

@@ -90,6 +90,7 @@ internal partial class CommandSchema
var parameterSchemas = type.GetProperties()
.Select(ParameterSchema.TryResolve)
.Where(p => p is not null)
.OrderBy(p => p!.Order)
.ToArray();
var optionSchemas = type.GetProperties()