Skip to content

Commit

Permalink
Merge pull request #212 from nblumhardt/help-ordering
Browse files Browse the repository at this point in the history
Correct the ordering of sub-commands in generated (Markdown) help
  • Loading branch information
nblumhardt authored Oct 25, 2021
2 parents 8055f99 + f048470 commit fb91916
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 9 deletions.
16 changes: 8 additions & 8 deletions src/SeqCli/Cli/Commands/HelpCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ namespace SeqCli.Cli.Commands
[Command("help", "Show information about available commands", Example = "seqcli help search")]
class HelpCommand : Command
{
readonly List<Meta<Lazy<Command>, CommandMetadata>> _availableCommands;
readonly List<Meta<Lazy<Command>, CommandMetadata>> _orderedCommands;
bool _markdown;

public HelpCommand(IEnumerable<Meta<Lazy<Command>, CommandMetadata>> availableCommands)
{
Options.Add("m|markdown", "Generate markdown for use in documentation", _ => _markdown = true);
_availableCommands = availableCommands.OrderBy(c => c.Metadata.Name).ToList();
_orderedCommands = availableCommands.OrderBy(c => c.Metadata.Name).ThenBy(c => c.Metadata.SubCommand).ToList();
}

protected override Task<int> Run(string[] unrecognized)
Expand All @@ -53,7 +53,7 @@ protected override Task<int> Run(string[] unrecognized)
{
topLevelCommand = unrecognized[0].ToLowerInvariant();
var subCommand = unrecognized.Length > 1 && !unrecognized[1].Contains("-") ? unrecognized[1] : null;
var cmds = _availableCommands.Where(c => c.Metadata.Name == topLevelCommand &&
var cmds = _orderedCommands.Where(c => c.Metadata.Name == topLevelCommand &&
(subCommand == null || subCommand == c.Metadata.SubCommand)).ToArray();

if (cmds.Length == 1 && cmds[0].Metadata.SubCommand == subCommand)
Expand All @@ -70,7 +70,7 @@ protected override Task<int> Run(string[] unrecognized)
}
}

if (topLevelCommand != null && _availableCommands.Any(a => a.Metadata.Name == topLevelCommand))
if (topLevelCommand != null && _orderedCommands.Any(a => a.Metadata.Name == topLevelCommand))
PrintHelp(name, topLevelCommand);
else
PrintHelp(name);
Expand All @@ -92,7 +92,7 @@ void PrintMarkdownHelp(string executableName)
Console.WriteLine("Available commands:");
Console.WriteLine();

foreach (var cmd in _availableCommands.GroupBy(cmd => cmd.Metadata.Name).OrderBy(c => c.Key))
foreach (var cmd in _orderedCommands.GroupBy(cmd => cmd.Metadata.Name).OrderBy(c => c.Key))
{
if (cmd.Count() == 1)
{
Expand All @@ -113,7 +113,7 @@ void PrintMarkdownHelp(string executableName)
}
Console.WriteLine();

foreach (var cmd in _availableCommands)
foreach (var cmd in _orderedCommands)
{
if (cmd.Metadata.SubCommand != null)
Console.WriteLine($"### `{cmd.Metadata.Name} {cmd.Metadata.SubCommand}`");
Expand Down Expand Up @@ -164,7 +164,7 @@ void PrintHelp(string executableName)
Console.WriteLine("Available commands are:");

var printedGroups = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (var avail in _availableCommands.OrderBy(c => c.Metadata.Name))
foreach (var avail in _orderedCommands)
{
if (avail.Metadata.SubCommand != null)
{
Expand All @@ -190,7 +190,7 @@ void PrintHelp(string executableName, string topLevelCommand)
Console.WriteLine();
Console.WriteLine("Available sub-commands are:");

foreach (var avail in _availableCommands.Where(c => c.Metadata.Name == topLevelCommand).OrderBy(c => c.Metadata.SubCommand))
foreach (var avail in _orderedCommands.Where(c => c.Metadata.Name == topLevelCommand))
{
Printing.Define($" {avail.Metadata.SubCommand}", avail.Metadata.HelpText, 13, Console.Out);
}
Expand Down
2 changes: 1 addition & 1 deletion test/SeqCli.EndToEnd/ApiKey/ApiKeyCreateTestCase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public Task ExecuteAsync(SeqConnection connection, ILogger logger, CliCommandRun
exit = runner.Exec("apikey list", "-t Test --json --no-color");
Assert.Equal(0, exit);

var output = runner.LastRunProcess.Output;
var output = runner.LastRunProcess!.Output;
Assert.Contains("\"AssignedPermissions\": [\"Ingest\"]", output);

return Task.CompletedTask;
Expand Down
31 changes: 31 additions & 0 deletions test/SeqCli.EndToEnd/Help/MarkdownHelpTestCase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using System.Threading.Tasks;
using Seq.Api;
using SeqCli.EndToEnd.Support;
using Serilog;
using Xunit;

#nullable enable

namespace SeqCli.EndToEnd.Help
{
public class MarkdownHelpTestCase : ICliTestCase
{
public Task ExecuteAsync(SeqConnection connection, ILogger logger, CliCommandRunner runner)
{
var exit = runner.Exec("help", "--markdown", disconnected: true);
Assert.Equal(0, exit);

var markdown = runner.LastRunProcess!.Output;

Assert.StartsWith("## Commands", markdown);

var indexOfTemplateExport = markdown.IndexOf("### `template export`", StringComparison.Ordinal);
var indexOfTemplateImport = markdown.IndexOf("### `template import`", StringComparison.Ordinal);
Assert.NotEqual(indexOfTemplateExport, indexOfTemplateImport);
Assert.True(indexOfTemplateExport < indexOfTemplateImport);

return Task.CompletedTask;
}
}
}

0 comments on commit fb91916

Please sign in to comment.