Skip to content

Allow custom help providers#1259

Merged
patriksvensson merged 25 commits intospectreconsole:mainfrom
FrankRay78:Custom-Help-Provider
Sep 8, 2023
Merged

Allow custom help providers#1259
patriksvensson merged 25 commits intospectreconsole:mainfrom
FrankRay78:Custom-Help-Provider

Conversation

@FrankRay78
Copy link
Contributor

@FrankRay78 FrankRay78 commented Jul 19, 2023

Work done

  • Implement IHelpProvider
  • Port existing HelpWriter to use this new interface
  • Remove coupling to internal sealed classes
  • Set existing help writer as the default help provider
  • Implement a custom help provider to demonstrate functionality and pass unit tests

Notes

  1. This PR was branched from Help writer improvements #1252, which seemed like a reasonable starting place.
  2. This PR fully replaces Can render command help and application version from inside a command #1133

Version option will show in help even with a default command

Reserve `-v` and `--version` as special spectre.console command line arguments (nb. breaking change for spectre.console users who have a default command with a settings class that uses either of these switches)

Help writer correctly determines if trailing commands exist and whether to display them as optional or mandatory in the usage statement

Ability to control the number of indirect commands to display in the help text when the command itself doesn't have any examples of its own. Defaults to 5 (for backward compatibility) but can be set to any integer or zero to disable completely.

Significant increase in unit test coverage for the help writer

Minor grammatical improvements to website documentation
Implement IHelpProvider, port existing HelpWriter to use this new interface, remove coupling to internal sealed classes, set existing help writer as the default help provider, implement a custom help provider to demonstrate functionality and pass unit tests.
@FrankRay78 FrankRay78 added the area-CLI Command-Line Interface label Jul 19, 2023
@FrankRay78 FrankRay78 added this to the 0.48 milestone Jul 19, 2023
@FrankRay78 FrankRay78 self-assigned this Jul 19, 2023
@FrankRay78 FrankRay78 linked an issue Jul 19, 2023 that may be closed by this pull request
@rcdailey
Copy link

I'll look through this, but the change set is really large (I see 54 files)! If there's any possibility to split the PR to make things easier to review, that would be appreciated, but I will make do with what you have for now.

Copy link

@rcdailey rcdailey left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Whew, I got through some of this but there is a lot to go. I need to get back to work but I'll share the comments I have so far. Hopefully I didn't overwhelm you too much. So far, I don't see any issues I feel really strongly about, so please consider all of my comments as unimportant.

Thanks for your effort and giving me the opportunity to review and learn more about the code base.

@FrankRay78
Copy link
Contributor Author

Thanks for the review @rcdailey, much appreciated. There are a number of things I want to address here, however I'm on holiday for a few weeks shortly and so will pick them up when back mid-Aug. Some of the review issues are hangovers from the existing code base, rather than the introduction of an injectible HelpWriter, however now is probably a good time to consider improving matters.

@rcdailey
Copy link

rcdailey commented Aug 3, 2023

Thanks for the replies. Given how hard you've worked on this and the fact that I haven't really provided any feedback that is terribly important, I don't want to hold you up any more on this PR. There's also a lot to go through and I've had difficulty finding time to resume where I left off.

All that to say: I think what you have is going to be just fine, so if you happen to merge this without any further comments from me, I think that's just fine. Thanks again for all of your hard work.

Copy link

@rcdailey rcdailey left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Funny enough, as soon as I leave a comment saying I had no time to review the rest... I ended up making time to do it anyway! Looks like for the most part all I had left to look at was some test code / data files, which was easy. I'll go ahead and give this my approval, for whatever that's worth. Great job!!

EDIT: I'll just add: I think the only thing I have somewhat strong feelings about is my comment from before about mixing DI registrations in the post-initialization / runtime code. I'm sure there are architectural reasons for it, otherwise I imagine you'd have done it differently. We can discuss it in the original comment. I just wanted to put an asterisk next to my approval by reminding you about that one thing.

@FrankRay78
Copy link
Contributor Author

Hi @rcdailey, I've really appreciated your review comments so far. What's really impressive is actually your last comment about DI, particularly since you aren't 100% familiar with the spectre.console codebase. I've left that review comment until last, picking off the easier ones first, knowing that (in good faith) I should really take the time to consider addressing the DI registration issue (if I can).

You've seen the slightly "bodged" use of how the following line still gets called, _registrar.RegisterInstance(typeof(Help.IHelpProvider), defaultHelpProvider); irrespective of whether a custom IHelpProvider was already registered firstly. When coding this, I discovered the existing DI container allows multiple registrations for the same interface 😱, always resolving to the first one.

I've been thinking about having it throw an exception, or perhaps replacing the existing. It's this I want to spend a bit more time on before having this PR merged.

@rcdailey
Copy link

rcdailey commented Aug 4, 2023

I discovered the existing DI container allows multiple registrations for the same interface 😱, always resolving to the first one

I am not sure which DI container you're referring to, but it probably doesn't matter much since Spectre.Console is agnostic to the DI implementation. For example, I use Autofac, and it actually sets the last registration as the default, not the first. There's a mechanism to override that, though.

Would it make sense to use a configuration property for this instead of letting a user register an implementation "behind your back"?

app.Configure(config =>
{
    config.SetHelpProvider<MyCustomHelp>();
    config.ValidateExamples();
});

This would allow you to conditionally register this type using ITypeRegistrar (either a default, as you currently do, or the user-provided one. And you'd be able to do this at "configure" time instead of in the Run() execution path.

I'm sure there's a better way, and certainly more than one way. This is food for thought at least.

@FrankRay78
Copy link
Contributor Author

Would it make sense to use a configuration property for this instead

That's a good idea for further consideration, given we are not quite at the stage of wholesale allowing any interface to be overridden and injected. And this PR is focused on specifically allowing custom help providers.

The current DI is custom (before my time), basically to avoid / reduce dependencies on third-party assemblies, see:

image

@rcdailey
Copy link

rcdailey commented Aug 4, 2023

this PR is focused on specifically allowing custom help providers

I must have a fundamental misunderstanding, then. I thought the way users added custom help providers was by implementing IHelpProvider. What am I missing?

@FrankRay78
Copy link
Contributor Author

I must have a fundamental misunderstanding, then. I thought the way users added custom help providers was by implementing IHelpProvider. What am I missing?

Sorry, I meant the various internally marked interfaces that spectre.console currently uses. This PR, which is entirely focused on allowing users to extend IHelpProvider, is a beachhead for considering opening up some of the other interfaces for DI, in the fullness of time.

IMO, registrations should happen before application code execution

this becomes important to get right, which I will look at shortly. If i can refactor this in the current PR, I will. Otherwise I'll get the PR merged and the extensible help into main, then come back to do the remaining DI work on a separate PR.

Hope that clears up my thinking. Thanks for chatting this through.

@rcdailey
Copy link

rcdailey commented Aug 4, 2023

Sorry, I meant the various internally marked interfaces that spectre.console currently uses. This PR, which is entirely focused on allowing users to extend IHelpProvider,

Ok then we're on the same page, I think. What confuses me is your response to my idea about passing in IHelpProvider via the configuration object. Your response to that was this:

That's a good idea for further consideration, given we are not quite at the stage of wholesale allowing any interface to be overridden and injected

Maybe you thought I was talking about a different interface (probably an internal one)? I was only talking about IHelpProvider. I just want to make sure we're not talking past each other. I think we're both on the same subject, though.

Thinking about the default help provider a little more. Currently, I think you have it working like this (in CommandExecutor.Execute()):

  1. Create a DefaultHelpProvider instance
  2. Register that instance with ITypeRegistrar
  3. Attempt to resolve IHelpProvider
  4. If the resolution returns null, fall back to the DefaultHelpProvider instance created in step

Is step 2 necessary? In other words, is there a scenario where if a user does not register a custom implementation of IHelpProvider that something else outside of the Spectre.Console code base would want to resolve it?

If we can get rid of step 2, then I think that fixes the issue I brought up earlier about a user being potentially unable to override the default help provider implementation due to multiple registrations of IHelpProvider. This would also allow you to avoid constructing a DefaultHelpProvider until you need one:

// Get the registered help provider, falling back to the default provider
// registered above if no custom implementations have been registered.
var helpProvider = resolver.Resolve(typeof(Help.IHelpProvider)) as Help.IHelpProvider 
    ?? new DefaultHelpProvider(configuration.Settings);

@FrankRay78
Copy link
Contributor Author

FrankRay78 commented Aug 6, 2023

We are on the same page @rcdailey,

If the resolution returns null, fall back to the DefaultHelpProvider instance created in step?

However, the bad memories are coming back now... this line resolver.Resolve(typeof(Help.IHelpProvider)) as Help.IHelpProvider actually throws an exception if an IHelpProvider hasn't been registered.

This is because the TypeResolverAdapter class falls back to using the .Net activator, namely return Activator.CreateInstance(type);, which throws because it can't instantiate an interface.

What I think I need to do is add a .Contains(type) method to DefaultTypeRegistrar, so the CommandExecutor can explicitly check if an IHelpProvider has been registered, before deciding whether to call resolver.Resolve(typeof(Help.IHelpProvider)), or alternatively just instantiate the DefaultHelpProvider.

I'm going to see what this looks like right now...

@rcdailey
Copy link

rcdailey commented Aug 6, 2023

Sounds good. I assume by adding it to DefaultTypeRegistrar, you'll also be adding it to the ITypeRegistrar interface? I assume you'll want the ability to verify a registration already exists for custom implementations that users provided (as I mentioned before, I implement it for Autofac).

If that doesn't work out due to the user-observable changes, you could do the below. I don't like it personally, because it sort of toes the line on using exceptions for flow control. But it's better than nothing...

IHelpProvider? helpProvider = null;
try 
{
  helpProvider = resolver.Resolve(typeof(Help.IHelpProvider)) as Help.IHelpProvider;
}
finally
{
  helpProvider ??= new DefaultHelpProvider(configuration.Settings);
}

Whatever you decide, I'm all for it. Just sharing an idea. Thanks again for the hard work!!

@FrankRay78
Copy link
Contributor Author

I've looked at this and have a heap more uncommitted changes to clean up/refactor/improve the DI.

However, given the size of this PR already, I'm proposing that we leave this one here and seek to get it merged into main. The review has been high-quality and I'm happy with everything checked in currently.

The current way the default help provider is created, then registered, then referenced lower down (which isn't great) is consistent with other patterns in the same method, see red circled below:
image

I think I would prefer to open a new PR to address the DI-specific refactoring, including looking at splitting the CommandExecutor.Execute() method (see yellow arrow and comment) into something like .FinaliseRegistrations and then .Execute, rather than complicate this PR further.

Are you in agreement with this @rcdailey ?

Copy link
Contributor

@patriksvensson patriksvensson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An initial review of the code. Everything looks good what I can see, but there are some things I think need to be fixed.

One thing is that we probably shouldn't put help stuff in its own namespace unless we want to hide it by default. If we put it in a namespace, we should add Spectre.Console.Cli.Help to Usings.cs so we don't have to explicitly qualify the namespace.

Copy link
Contributor Author

@FrankRay78 FrankRay78 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've fully addressed all reviewer feedback provided.

@patriksvensson There is one last thing that needs to be considered imho, and that's whether the namespace situation is correct. The following image shows all the new interfaces and classes added to expose the help provider implementation:

image

At the moment, all these interfaces exist to serve the HelpProvider class, hence why they are currently under Spectre.Console.Cli.Help.

They could be left 'as-is' or alternatively, perhaps shifted under Spectre.Console.Cli (ie. promoted) with a view that one day, some other parts of spectre.console might use the same set of fairly generic command model/info interfaces.

nb. adding global using Spectre.Console.Cli.Help; and removing the Help. prefixes from the codebase has already achieved better readability imho.

Do you have a preference in regards to the Help namespace?

@patriksvensson
Copy link
Contributor

@FrankRay78 Adding global using Spectre.Console.Cli.Help and removing the Help qualifier would work since the help stuff only is needed when implementing a help provider.

@FrankRay78
Copy link
Contributor Author

Hi @patriksvensson , ok cool. This PR is complete and ready to merge then.

@patriksvensson
Copy link
Contributor

@FrankRay78 Awesome will take a look at it tonight or tomorrow 👍

Copy link
Contributor

@patriksvensson patriksvensson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@patriksvensson patriksvensson merged commit 131b37f into spectreconsole:main Sep 8, 2023
@patriksvensson patriksvensson removed the area-CLI Command-Line Interface label Sep 17, 2023
@FrankRay78 FrankRay78 deleted the Custom-Help-Provider branch September 21, 2023 09:30
agocke pushed a commit to serdedotnet/serde.cmdline that referenced this pull request Nov 16, 2025
Updated
[Spectre.Console](https://github.com/spectreconsole/spectre.console)
from 0.49.1 to 0.54.0.

<details>
<summary>Release notes</summary>

_Sourced from [Spectre.Console's
releases](https://github.com/spectreconsole/spectre.console/releases)._

## 0.54.0

Version `0.54.0` of Spectre.Console has been released!

## Spectre.Console.Cli has a new home!

We've decided to move `Spectre.Console.Cli` to its own repository, where
we will prepare it for a _1.0_ release. This means that the
_Spectre.Console.Cli_ NuGet packages will no longer be versioned
together with _Spectre.Console_. They will now have a preview version
such as `1.0.0-alpha-0.x`.

There should be no issues staying on version _0.53.0_ of
_Spectre.Console.Cli_ until we release a stable version if you prefer
not to use a pre-release dependency.

## New unit testing package for Spectre.Console.Cli

There is now a new testing package for _Spectre.Console.Cli_ called
[Spectre.Console.Cli.Testing](https://www.nuget.org/packages/Spectre.Console.Cli.Testing).
This is where you will find the `CommandAppTester` from now on.

You can find more information about unit testing in the
[documentation](https://spectreconsole.net/cli/unit-testing).

## What's Changed

* Normalizes paths when writing exceptions to the console for tests. by
[@​phil-scott-78](https://github.com/phil-scott-78) in
[#​1758](spectreconsole/spectre.console#1758)
* Fixes issue with Panel not applying overflow to children by
[@​phil-scott-78](https://github.com/phil-scott-78) in
[#​1942](spectreconsole/spectre.console#1942)
* Remove Spectre.Console.Cli from repository by
[@​patriksvensson](https://github.com/patriksvensson) in
[#​1928](spectreconsole/spectre.console#1928)

**Full Changelog**:
spectreconsole/spectre.console@0.53.0...0.54.0

## 0.53.0

## What's Changed

* Add top-level CancellationToken support to Spectre.Console.Cli by
[@​0xced](https://github.com/0xced) in
[#​1911](spectreconsole/spectre.console#1911)
* Update the Spectre.Console.Cli documentation with CancellationToken by
[@​0xced](https://github.com/0xced) in
[#​1920](spectreconsole/spectre.console#1920)

**Full Changelog**:
spectreconsole/spectre.console@0.52.0...0.53.0

## 0.52.0

## What's Changed

* Add OpenCLI integration to Spectre.Console.Cli by
[@​patriksvensson](https://github.com/patriksvensson) in
[#​1909](spectreconsole/spectre.console#1909)
* Fix OPENCLI_VISIBILITY_INTERNAL to DefineConstants concat by
[@​devlead](https://github.com/devlead) in
[#​1912](spectreconsole/spectre.console#1912)

**Full Changelog**:
spectreconsole/spectre.console@0.51.1...0.52.0

## 0.51.1

## What's Changed

* Fix IndexOutOfRangeException in ExceptionFormatter by
[@​martincostello](https://github.com/martincostello) in
[#​1800](spectreconsole/spectre.console#1800)
* TestConsole can now be configured and accessed in CommandAppTester by
[@​magiino](https://github.com/magiino) in
[#​1803](spectreconsole/spectre.console#1803)
* Add ShowRowSeparators in Table Widget docs by
[@​bartoginski](https://github.com/bartoginski) in
[#​1807](spectreconsole/spectre.console#1807)
* Add support for required options by
[@​patriksvensson](https://github.com/patriksvensson) in
[#​1825](spectreconsole/spectre.console#1825)
* Added documentation for align widget by
[@​Elementttto](https://github.com/Elementttto) in
[#​1746](spectreconsole/spectre.console#1746)
* Fixed link not displayed in markup in Style.cs and added unit test
cases by [@​Elementttto](https://github.com/Elementttto) in
[#​1750](spectreconsole/spectre.console#1750)
* Update System.Memory dependency by
[@​WeihanLi](https://github.com/WeihanLi) in
[#​1832](spectreconsole/spectre.console#1832)
* Reduce memory usage for rune width cache. by
[@​Pannoniae](https://github.com/Pannoniae) in
[#​1756](spectreconsole/spectre.console#1756)
* Fix resizing of Live views with reduced size. by
[@​belucha](https://github.com/belucha) in
[#​1840](spectreconsole/spectre.console#1840)
* Corrects comment for optional text prompt by
[@​aljanabim](https://github.com/aljanabim) in
[#​1857](spectreconsole/spectre.console#1857)
* Update spinners by [@​FroggieFrog](https://github.com/FroggieFrog) in
[#​1873](spectreconsole/spectre.console#1873)
* Support J and K for navigating list prompts by
[@​tobias-tengler](https://github.com/tobias-tengler) in
[#​1877](spectreconsole/spectre.console#1877)
* Fix space triggering selection when items in the selection list have a
space. by [@​mitchdenny](https://github.com/mitchdenny) in
[#​1881](spectreconsole/spectre.console#1881)
* Fix bug setting Header by
[@​mattfennerom](https://github.com/mattfennerom) in
[#​1890](spectreconsole/spectre.console#1890)

## New Contributors
* [@​magiino](https://github.com/magiino) made their first contribution
in [#​1803](spectreconsole/spectre.console#1803)
* [@​bartoginski](https://github.com/bartoginski) made their first
contribution in
[#​1807](spectreconsole/spectre.console#1807)
* [@​Elementttto](https://github.com/Elementttto) made their first
contribution in
[#​1746](spectreconsole/spectre.console#1746)
* [@​WeihanLi](https://github.com/WeihanLi) made their first
contribution in
[#​1832](spectreconsole/spectre.console#1832)
* [@​Pannoniae](https://github.com/Pannoniae) made their first
contribution in
[#​1756](spectreconsole/spectre.console#1756)
* [@​belucha](https://github.com/belucha) made their first contribution
in [#​1840](spectreconsole/spectre.console#1840)
* [@​aljanabim](https://github.com/aljanabim) made their first
contribution in
[#​1857](spectreconsole/spectre.console#1857)
* [@​FroggieFrog](https://github.com/FroggieFrog) made their first
contribution in
[#​1873](spectreconsole/spectre.console#1873)
* [@​tobias-tengler](https://github.com/tobias-tengler) made their first
contribution in
[#​1877](spectreconsole/spectre.console#1877)
* [@​mitchdenny](https://github.com/mitchdenny) made their first
contribution in
[#​1881](spectreconsole/spectre.console#1881)
* [@​mattfennerom](https://github.com/mattfennerom) made their first
contribution in
[#​1890](spectreconsole/spectre.console#1890)

**Full Changelog**:
spectreconsole/spectre.console@0.50.0...0.51.1

## 0.50.0

## What's Changed

### General

* Strong name the assemblies by
[@​KirillOsenkov](https://github.com/KirillOsenkov) in
[#​1623](spectreconsole/spectre.console#1623)
* Update MSDN link to learn.microsoft.com by
[@​Kissaki](https://github.com/Kissaki) in
[#​1575](spectreconsole/spectre.console#1575)
* Add spanish translation for help strings by
[@​kzu](https://github.com/kzu) in
[#​1597](spectreconsole/spectre.console#1597)
* Update documentation: add example for the Text Prompt usage by
[@​davide-pi](https://github.com/davide-pi) in
[#​1636](spectreconsole/spectre.console#1636)
* Fix typos xml docs by [@​devlead](https://github.com/devlead) in
[#​1684](spectreconsole/spectre.console#1684)
* Upgrade SixLabors.ImageSharp to 3.1.7 by
[@​Moustafaa91](https://github.com/Moustafaa91) in
[#​1779](spectreconsole/spectre.console#1779)

### Console

* AOT Support for Spectre.Console by
[@​phil-scott-78](https://github.com/phil-scott-78) in
[#​1690](spectreconsole/spectre.console#1690)
* Make method reference to Markup.Escape more obvious by
[@​Kissaki](https://github.com/Kissaki) in
[#​1574](spectreconsole/spectre.console#1574)
* Fix `HtmlEncoder` Incorrectly Applying Italics to Bold Text by
[@​z4ryy](https://github.com/z4ryy) in
[#​1590](spectreconsole/spectre.console#1590)
* Fix Console Display Issue with Deleting Wide Characters by
[@​TonWin618](https://github.com/TonWin618) in
[#​1595](spectreconsole/spectre.console#1595)
* Fix search bug in prompt related to custom item types by
[@​patriksvensson](https://github.com/patriksvensson) in
[#​1627](spectreconsole/spectre.console#1627)
* Cleanup the prompt tests by [@​0xced](https://github.com/0xced) in
[#​1635](spectreconsole/spectre.console#1635)
* Add custom style for each calendar event by
[@​davide-pi](https://github.com/davide-pi) in
[#​1246](spectreconsole/spectre.console#1246)
* Fix tree expansion bug by [@​davide-pi](https://github.com/davide-pi)
in [#​1245](spectreconsole/spectre.console#1245)
* Enhance the style of the checkboxes for multi-selection by
[@​davide-pi](https://github.com/davide-pi) in
[#​1244](spectreconsole/spectre.console#1244)
* Improve exception if a (multi)selection prompt is used incorrectly by
[@​0xced](https://github.com/0xced) in
[#​1637](spectreconsole/spectre.console#1637)
* Fix incorrect panel height calculation in complex layout by
[@​BlazeFace](https://github.com/BlazeFace) in
[#​1514](spectreconsole/spectre.console#1514)
* Adding Enricher for Azure Pipelines by
[@​BlazeFace](https://github.com/BlazeFace) in
[#​1675](spectreconsole/spectre.console#1675)
* Added hex color conversion by [@​jsheely](https://github.com/jsheely)
in [#​1432](spectreconsole/spectre.console#1432)
* Fixed type in Segment description by
[@​PascalSenn](https://github.com/PascalSenn) in
[#​1687](spectreconsole/spectre.console#1687)
* Adding TransferSpeedColumn configuration to display bits/bytes +
binary/decimal prefixes by [@​tpill90](https://github.com/tpill90) in
[#​904](spectreconsole/spectre.console#904)
* Changes Emoji dictionary to OrdinalIgnoreCase for performance by
[@​phil-scott-78](https://github.com/phil-scott-78) in
[#​1691](spectreconsole/spectre.console#1691)
* ProgressTask.GetPercentage() returns 100 when max value is 0 by
[@​FrankRay78](https://github.com/FrankRay78) in
[#​1694](spectreconsole/spectre.console#1694)
* Async overloads for AnsiConsole Prompt/Ask/Confirm. by
[@​tmds](https://github.com/tmds) in
[#​1194](spectreconsole/spectre.console#1194)
* Support 3-digit hex codes in markup by
[@​TheMarteh](https://github.com/TheMarteh) in
[#​1708](spectreconsole/spectre.console#1708)
* Add async spinner extension methods and related documentation by
[@​phil-scott-78](https://github.com/phil-scott-78) in
[#​1747](spectreconsole/spectre.console#1747)
* Fix generic exception formatting by
[@​0xced](https://github.com/0xced) in
[#​1755](spectreconsole/spectre.console#1755)

### CLI

* Remove redundant explain settings ctor by
[@​gitfool](https://github.com/gitfool) in
[#​1534](spectreconsole/spectre.console#1534)
* Trim trailing comma in settings by
[@​devlead](https://github.com/devlead) in
[#​1550](spectreconsole/spectre.console#1550)
* Consider -? as an alias to -h by [@​kzu](https://github.com/kzu) in
[#​1552](spectreconsole/spectre.console#1552)
* Trimming of TestConsole output by CommandAppTester is user
configurable. by [@​FrankRay78](https://github.com/FrankRay78) in
[#​1739](spectreconsole/spectre.console#1739)
* Include resource files for additional cultures in HelpProvider. by
[@​Tolitech](https://github.com/Tolitech) in
[#​1717](spectreconsole/spectre.console#1717)
* Conditionally trim trailing periods of argument and option
descriptions by [@​TheTonttu](https://github.com/TheTonttu) in
[#​1740](spectreconsole/spectre.console#1740)
* Changed IConfigurator to return IConfigurator instead of void by
[@​byte2pixel](https://github.com/byte2pixel) in
[#​1762](spectreconsole/spectre.console#1762)
* Add parsed unknown flag to remaining arguments for a branch with a
default command by [@​FrankRay78](https://github.com/FrankRay78) in
[#​1660](spectreconsole/spectre.console#1660)
* Correctly show application version; execution of command with version
option by [@​FrankRay78](https://github.com/FrankRay78) in
[#​1663](spectreconsole/spectre.console#1663)
* Help output correctly decides when to show the version option by
[@​FrankRay78](https://github.com/FrankRay78) in
[#​1664](spectreconsole/spectre.console#1664)

## New Contributors
* [@​Kissaki](https://github.com/Kissaki) made their first contribution
in [#​1575](spectreconsole/spectre.console#1575)
 ... (truncated)

Commits viewable in [compare
view](https://github.com/spectreconsole/spectre.console/commits/0.54.0).
</details>

Updated
[Spectre.Console.Testing](https://github.com/spectreconsole/spectre.console)
from 0.46.0 to 0.54.0.

<details>
<summary>Release notes</summary>

_Sourced from [Spectre.Console.Testing's
releases](https://github.com/spectreconsole/spectre.console/releases)._

## 0.54.0

Version `0.54.0` of Spectre.Console has been released!

## Spectre.Console.Cli has a new home!

We've decided to move `Spectre.Console.Cli` to its own repository, where
we will prepare it for a _1.0_ release. This means that the
_Spectre.Console.Cli_ NuGet packages will no longer be versioned
together with _Spectre.Console_. They will now have a preview version
such as `1.0.0-alpha-0.x`.

There should be no issues staying on version _0.53.0_ of
_Spectre.Console.Cli_ until we release a stable version if you prefer
not to use a pre-release dependency.

## New unit testing package for Spectre.Console.Cli

There is now a new testing package for _Spectre.Console.Cli_ called
[Spectre.Console.Cli.Testing](https://www.nuget.org/packages/Spectre.Console.Cli.Testing).
This is where you will find the `CommandAppTester` from now on.

You can find more information about unit testing in the
[documentation](https://spectreconsole.net/cli/unit-testing).

## What's Changed

* Normalizes paths when writing exceptions to the console for tests. by
[@​phil-scott-78](https://github.com/phil-scott-78) in
[#​1758](spectreconsole/spectre.console#1758)
* Fixes issue with Panel not applying overflow to children by
[@​phil-scott-78](https://github.com/phil-scott-78) in
[#​1942](spectreconsole/spectre.console#1942)
* Remove Spectre.Console.Cli from repository by
[@​patriksvensson](https://github.com/patriksvensson) in
[#​1928](spectreconsole/spectre.console#1928)

**Full Changelog**:
spectreconsole/spectre.console@0.53.0...0.54.0

## 0.53.0

## What's Changed

* Add top-level CancellationToken support to Spectre.Console.Cli by
[@​0xced](https://github.com/0xced) in
[#​1911](spectreconsole/spectre.console#1911)
* Update the Spectre.Console.Cli documentation with CancellationToken by
[@​0xced](https://github.com/0xced) in
[#​1920](spectreconsole/spectre.console#1920)

**Full Changelog**:
spectreconsole/spectre.console@0.52.0...0.53.0

## 0.52.0

## What's Changed

* Add OpenCLI integration to Spectre.Console.Cli by
[@​patriksvensson](https://github.com/patriksvensson) in
[#​1909](spectreconsole/spectre.console#1909)
* Fix OPENCLI_VISIBILITY_INTERNAL to DefineConstants concat by
[@​devlead](https://github.com/devlead) in
[#​1912](spectreconsole/spectre.console#1912)

**Full Changelog**:
spectreconsole/spectre.console@0.51.1...0.52.0

## 0.51.1

## What's Changed

* Fix IndexOutOfRangeException in ExceptionFormatter by
[@​martincostello](https://github.com/martincostello) in
[#​1800](spectreconsole/spectre.console#1800)
* TestConsole can now be configured and accessed in CommandAppTester by
[@​magiino](https://github.com/magiino) in
[#​1803](spectreconsole/spectre.console#1803)
* Add ShowRowSeparators in Table Widget docs by
[@​bartoginski](https://github.com/bartoginski) in
[#​1807](spectreconsole/spectre.console#1807)
* Add support for required options by
[@​patriksvensson](https://github.com/patriksvensson) in
[#​1825](spectreconsole/spectre.console#1825)
* Added documentation for align widget by
[@​Elementttto](https://github.com/Elementttto) in
[#​1746](spectreconsole/spectre.console#1746)
* Fixed link not displayed in markup in Style.cs and added unit test
cases by [@​Elementttto](https://github.com/Elementttto) in
[#​1750](spectreconsole/spectre.console#1750)
* Update System.Memory dependency by
[@​WeihanLi](https://github.com/WeihanLi) in
[#​1832](spectreconsole/spectre.console#1832)
* Reduce memory usage for rune width cache. by
[@​Pannoniae](https://github.com/Pannoniae) in
[#​1756](spectreconsole/spectre.console#1756)
* Fix resizing of Live views with reduced size. by
[@​belucha](https://github.com/belucha) in
[#​1840](spectreconsole/spectre.console#1840)
* Corrects comment for optional text prompt by
[@​aljanabim](https://github.com/aljanabim) in
[#​1857](spectreconsole/spectre.console#1857)
* Update spinners by [@​FroggieFrog](https://github.com/FroggieFrog) in
[#​1873](spectreconsole/spectre.console#1873)
* Support J and K for navigating list prompts by
[@​tobias-tengler](https://github.com/tobias-tengler) in
[#​1877](spectreconsole/spectre.console#1877)
* Fix space triggering selection when items in the selection list have a
space. by [@​mitchdenny](https://github.com/mitchdenny) in
[#​1881](spectreconsole/spectre.console#1881)
* Fix bug setting Header by
[@​mattfennerom](https://github.com/mattfennerom) in
[#​1890](spectreconsole/spectre.console#1890)

## New Contributors
* [@​magiino](https://github.com/magiino) made their first contribution
in [#​1803](spectreconsole/spectre.console#1803)
* [@​bartoginski](https://github.com/bartoginski) made their first
contribution in
[#​1807](spectreconsole/spectre.console#1807)
* [@​Elementttto](https://github.com/Elementttto) made their first
contribution in
[#​1746](spectreconsole/spectre.console#1746)
* [@​WeihanLi](https://github.com/WeihanLi) made their first
contribution in
[#​1832](spectreconsole/spectre.console#1832)
* [@​Pannoniae](https://github.com/Pannoniae) made their first
contribution in
[#​1756](spectreconsole/spectre.console#1756)
* [@​belucha](https://github.com/belucha) made their first contribution
in [#​1840](spectreconsole/spectre.console#1840)
* [@​aljanabim](https://github.com/aljanabim) made their first
contribution in
[#​1857](spectreconsole/spectre.console#1857)
* [@​FroggieFrog](https://github.com/FroggieFrog) made their first
contribution in
[#​1873](spectreconsole/spectre.console#1873)
* [@​tobias-tengler](https://github.com/tobias-tengler) made their first
contribution in
[#​1877](spectreconsole/spectre.console#1877)
* [@​mitchdenny](https://github.com/mitchdenny) made their first
contribution in
[#​1881](spectreconsole/spectre.console#1881)
* [@​mattfennerom](https://github.com/mattfennerom) made their first
contribution in
[#​1890](spectreconsole/spectre.console#1890)

**Full Changelog**:
spectreconsole/spectre.console@0.50.0...0.51.1

## 0.50.0

## What's Changed

### General

* Strong name the assemblies by
[@​KirillOsenkov](https://github.com/KirillOsenkov) in
[#​1623](spectreconsole/spectre.console#1623)
* Update MSDN link to learn.microsoft.com by
[@​Kissaki](https://github.com/Kissaki) in
[#​1575](spectreconsole/spectre.console#1575)
* Add spanish translation for help strings by
[@​kzu](https://github.com/kzu) in
[#​1597](spectreconsole/spectre.console#1597)
* Update documentation: add example for the Text Prompt usage by
[@​davide-pi](https://github.com/davide-pi) in
[#​1636](spectreconsole/spectre.console#1636)
* Fix typos xml docs by [@​devlead](https://github.com/devlead) in
[#​1684](spectreconsole/spectre.console#1684)
* Upgrade SixLabors.ImageSharp to 3.1.7 by
[@​Moustafaa91](https://github.com/Moustafaa91) in
[#​1779](spectreconsole/spectre.console#1779)

### Console

* AOT Support for Spectre.Console by
[@​phil-scott-78](https://github.com/phil-scott-78) in
[#​1690](spectreconsole/spectre.console#1690)
* Make method reference to Markup.Escape more obvious by
[@​Kissaki](https://github.com/Kissaki) in
[#​1574](spectreconsole/spectre.console#1574)
* Fix `HtmlEncoder` Incorrectly Applying Italics to Bold Text by
[@​z4ryy](https://github.com/z4ryy) in
[#​1590](spectreconsole/spectre.console#1590)
* Fix Console Display Issue with Deleting Wide Characters by
[@​TonWin618](https://github.com/TonWin618) in
[#​1595](spectreconsole/spectre.console#1595)
* Fix search bug in prompt related to custom item types by
[@​patriksvensson](https://github.com/patriksvensson) in
[#​1627](spectreconsole/spectre.console#1627)
* Cleanup the prompt tests by [@​0xced](https://github.com/0xced) in
[#​1635](spectreconsole/spectre.console#1635)
* Add custom style for each calendar event by
[@​davide-pi](https://github.com/davide-pi) in
[#​1246](spectreconsole/spectre.console#1246)
* Fix tree expansion bug by [@​davide-pi](https://github.com/davide-pi)
in [#​1245](spectreconsole/spectre.console#1245)
* Enhance the style of the checkboxes for multi-selection by
[@​davide-pi](https://github.com/davide-pi) in
[#​1244](spectreconsole/spectre.console#1244)
* Improve exception if a (multi)selection prompt is used incorrectly by
[@​0xced](https://github.com/0xced) in
[#​1637](spectreconsole/spectre.console#1637)
* Fix incorrect panel height calculation in complex layout by
[@​BlazeFace](https://github.com/BlazeFace) in
[#​1514](spectreconsole/spectre.console#1514)
* Adding Enricher for Azure Pipelines by
[@​BlazeFace](https://github.com/BlazeFace) in
[#​1675](spectreconsole/spectre.console#1675)
* Added hex color conversion by [@​jsheely](https://github.com/jsheely)
in [#​1432](spectreconsole/spectre.console#1432)
* Fixed type in Segment description by
[@​PascalSenn](https://github.com/PascalSenn) in
[#​1687](spectreconsole/spectre.console#1687)
* Adding TransferSpeedColumn configuration to display bits/bytes +
binary/decimal prefixes by [@​tpill90](https://github.com/tpill90) in
[#​904](spectreconsole/spectre.console#904)
* Changes Emoji dictionary to OrdinalIgnoreCase for performance by
[@​phil-scott-78](https://github.com/phil-scott-78) in
[#​1691](spectreconsole/spectre.console#1691)
* ProgressTask.GetPercentage() returns 100 when max value is 0 by
[@​FrankRay78](https://github.com/FrankRay78) in
[#​1694](spectreconsole/spectre.console#1694)
* Async overloads for AnsiConsole Prompt/Ask/Confirm. by
[@​tmds](https://github.com/tmds) in
[#​1194](spectreconsole/spectre.console#1194)
* Support 3-digit hex codes in markup by
[@​TheMarteh](https://github.com/TheMarteh) in
[#​1708](spectreconsole/spectre.console#1708)
* Add async spinner extension methods and related documentation by
[@​phil-scott-78](https://github.com/phil-scott-78) in
[#​1747](spectreconsole/spectre.console#1747)
* Fix generic exception formatting by
[@​0xced](https://github.com/0xced) in
[#​1755](spectreconsole/spectre.console#1755)

### CLI

* Remove redundant explain settings ctor by
[@​gitfool](https://github.com/gitfool) in
[#​1534](spectreconsole/spectre.console#1534)
* Trim trailing comma in settings by
[@​devlead](https://github.com/devlead) in
[#​1550](spectreconsole/spectre.console#1550)
* Consider -? as an alias to -h by [@​kzu](https://github.com/kzu) in
[#​1552](spectreconsole/spectre.console#1552)
* Trimming of TestConsole output by CommandAppTester is user
configurable. by [@​FrankRay78](https://github.com/FrankRay78) in
[#​1739](spectreconsole/spectre.console#1739)
* Include resource files for additional cultures in HelpProvider. by
[@​Tolitech](https://github.com/Tolitech) in
[#​1717](spectreconsole/spectre.console#1717)
* Conditionally trim trailing periods of argument and option
descriptions by [@​TheTonttu](https://github.com/TheTonttu) in
[#​1740](spectreconsole/spectre.console#1740)
* Changed IConfigurator to return IConfigurator instead of void by
[@​byte2pixel](https://github.com/byte2pixel) in
[#​1762](spectreconsole/spectre.console#1762)
* Add parsed unknown flag to remaining arguments for a branch with a
default command by [@​FrankRay78](https://github.com/FrankRay78) in
[#​1660](spectreconsole/spectre.console#1660)
* Correctly show application version; execution of command with version
option by [@​FrankRay78](https://github.com/FrankRay78) in
[#​1663](spectreconsole/spectre.console#1663)
* Help output correctly decides when to show the version option by
[@​FrankRay78](https://github.com/FrankRay78) in
[#​1664](spectreconsole/spectre.console#1664)

## New Contributors
* [@​Kissaki](https://github.com/Kissaki) made their first contribution
in [#​1575](spectreconsole/spectre.console#1575)
 ... (truncated)

## 0.49.0

## What's Changed

* Cleanup line endings by @​nils-a in
spectreconsole/spectre.console#1381
* Added Spectre.Console.Cli to quick-start. by @​nils-a in
spectreconsole/spectre.console#1413
* Fix rendering of ListPrompt for odd pageSizes by @​nils-a in
spectreconsole/spectre.console#1365
* Remove mandelbrot example due to conflicting license by
@​patriksvensson in
spectreconsole/spectre.console#1426
* Allow specifying a property to ignore the use of build-time packages
for versioning and analysis by @​baronfel in
spectreconsole/spectre.console#1425
* Add the possibility to register multiple interceptors by @​nils-a in
spectreconsole/spectre.console#1412
* Added the ITypeResolver to the ExceptionHandler by @​nils-a in
spectreconsole/spectre.console#1411
* Updated typo in CommandApp.md by @​DarqueWarrior in
spectreconsole/spectre.console#1431
* Command with -v displays app version instead of executing the command
by @​FrankRay78 in
spectreconsole/spectre.console#1427
* HelpProvider colors should be configurable by @​FrankRay78 in
spectreconsole/spectre.console#1408
* Direct contributors to the current CONTRIBUTING.md by @​tonycknight in
spectreconsole/spectre.console#1435
* Fix deadlock when cancelling prompts by @​caesay in
spectreconsole/spectre.console#1439
* Add progress bar value formatter by @​jsheely in
spectreconsole/spectre.console#1414
* Update dependencies and do some clean-up by @​patriksvensson in
spectreconsole/spectre.console#1440
* Delete [UsesVerify], which has become obsolete through the latest
update. by @​danielcweber in
spectreconsole/spectre.console#1456
* Don't erase secret prompt text upon backspace when mask is null by
@​danielcweber in
spectreconsole/spectre.console#1458
* Update dependencies to the latest version by @​patriksvensson in
spectreconsole/spectre.console#1459
* Automatically register command settings by @​patriksvensson in
spectreconsole/spectre.console#1463
* Remove [DebuggerDisplay] from Paragraph by @​martincostello in
spectreconsole/spectre.console#1477
* Selection Prompt Search by @​slang25 in
spectreconsole/spectre.console#1289
* Update dependency SixLabors.ImageSharp to v3.1.3 by @​renovate in
spectreconsole/spectre.console#1486
* Positioned Progress Tasks - Before or After Other Tasks by @​thomhurst
in spectreconsole/spectre.console#1250
* Added NoStackTrace to ExceptionFormats by @​gerardog in
spectreconsole/spectre.console#1489
* Pipe character for listing options (issue 1434) by @​FrankRay78 in
spectreconsole/spectre.console#1498
* Improve XmlDoc output by @​yenneferofvengerberg in
spectreconsole/spectre.console#1503
* Revert 71a5d830 to undo flickering regression by @​phil-scott-78 in
spectreconsole/spectre.console#1504
* AddDelegate uses an abstract type when used in a branch by @​BlazeFace
in spectreconsole/spectre.console#1509
* Missing Separator When Headers are Hidden by @​BlazeFace in
spectreconsole/spectre.console#1513
* Expose raw arguments on the command context by @​patriksvensson in
spectreconsole/spectre.console#1523
* Add token representation to remaining arguments by @​patriksvensson in
spectreconsole/spectre.console#1525

## New Contributors
* @​baronfel made their first contribution in
spectreconsole/spectre.console#1425
* @​DarqueWarrior made their first contribution in
spectreconsole/spectre.console#1431
* @​tonycknight made their first contribution in
spectreconsole/spectre.console#1435
* @​caesay made their first contribution in
spectreconsole/spectre.console#1439
* @​jsheely made their first contribution in
spectreconsole/spectre.console#1414
* @​danielcweber made their first contribution in
spectreconsole/spectre.console#1456
* @​martincostello made their first contribution in
spectreconsole/spectre.console#1477
* @​slang25 made their first contribution in
spectreconsole/spectre.console#1289
* @​thomhurst made their first contribution in
spectreconsole/spectre.console#1250
* @​gerardog made their first contribution in
spectreconsole/spectre.console#1489
* @​yenneferofvengerberg made their first contribution in
spectreconsole/spectre.console#1503
* @​BlazeFace made their first contribution in
spectreconsole/spectre.console#1509

**Full Changelog**:
spectreconsole/spectre.console@0.48.0...0.49.0

## 0.48.0

Version 0.48 of Spectre.Console has been released!

Several rendering issues have been addressed, such as fixing problems
related to rendering inside status causing corrupt output, avoiding
exceptions on Rows with no children, as well as addressing rendering
bugs in TextPath.

New features have been added, such as the ability to show separators
between table rows. Other notable additions include progress bar header
and footer support, customizable (and localizable) help providers, and
the option to style text and confirmation prompts.

# New Contributors

* [@​icalvo](https://github.com/icalvo) made their first contribution in
[#​1215](spectreconsole/spectre.console#1215)
* [@​fredrikbentzen](https://github.com/fredrikbentzen) made their first
contribution in
[#​1132](spectreconsole/spectre.console#1132)
* [@​jeppevammenkristensen](https://github.com/jeppevammenkristensen)
made their first contribution in
[#​1241](spectreconsole/spectre.console#1241)
* [@​tomaszprasolek](https://github.com/tomaszprasolek) made their first
contribution in
[#​1257](spectreconsole/spectre.console#1257)
* [@​olabacker](https://github.com/olabacker) made their first
contribution in
[#​1302](spectreconsole/spectre.console#1302)
* [@​AndrewRathbun](https://github.com/AndrewRathbun) made their first
contribution in
[#​1315](spectreconsole/spectre.console#1315)


# What's Changed

## Rendering

* Add .NET 8 support by
[@​patriksvensson](https://github.com/patriksvensson) in
[#​1367](spectreconsole/spectre.console#1367)
* Fixed render issue where writeline inside status caused corrupt output
#​415 #​694 by [@​fredrikbentzen](https://github.com/fredrikbentzen) in
[#​1132]([#​1132](spectreconsole/spectre.console#1132))
* Relax the SDK requirements by rolling forward to the latest feature by
[@​0xced](https://github.com/0xced) in
[#​1237]([#​1237](spectreconsole/spectre.console#1237))
* Add fix to avoid exception on rows with no children by
[@​jeppevammenkristensen](https://github.com/jeppevammenkristensen) in
[#​1241]([#​1241](spectreconsole/spectre.console#1241))
* Set `end_of_line` to `LF` instead of `CRLF` by
[@​0xced](https://github.com/0xced) in
[#​1256](spectreconsole/spectre.console#1256)
* Fix `Rule` widget docs by
[@​tomaszprasolek](https://github.com/tomaszprasolek) in
[#​1257](spectreconsole/spectre.console#1257)
* Added the missing columns-cast by [@​nils](https://github.com/nils)-a
in [#​1294](spectreconsole/spectre.console#1294)
* Render tables with zero-width columns by
[@​Frassle](https://github.com/Frassle) in
[#​1197](spectreconsole/spectre.console#1197)
* Fix figlet centering possibly throwing due to negative size by
[@​olabacker](https://github.com/olabacker) in
[#​1302](spectreconsole/spectre.console#1302)
* Add option to show separator between table rows by
[@​patriksvensson](https://github.com/patriksvensson) in
[#​1304](spectreconsole/spectre.console#1304)
* Enable setting the color of the values in a `BreakdownChart` by
[@​nils](https://github.com/nils)-a in
[#​1303](spectreconsole/spectre.console#1303)
* Progress bar header and footer by
[@​phil](https://github.com/phil)-scott-78 in
[#​1262](spectreconsole/spectre.console#1262)
* Add an example showing the decorations off by
[@​Frassle](https://github.com/Frassle) in
[#​1191](spectreconsole/spectre.console#1191)
* Fixes `TextPath` rendering bugs by
[@​patriksvensson](https://github.com/patriksvensson) in
[#​1308](spectreconsole/spectre.console#1308)
* Fix greedy row measure by [@​nils](https://github.com/nils)-a in
[#​1338](spectreconsole/spectre.console#1338)
* Fix `AnsiConsoleOutput` safe height by
[@​0xced](https://github.com/0xced) in
[#​1358](spectreconsole/spectre.console#1358)
* Allow passing a nullable style in `DefaultValueStyle()` and
`ChoicesStyle()` by [@​0xced](https://github.com/0xced) in
[#​1359](spectreconsole/spectre.console#1359)
* Allow `ConfirmationPrompt` Styling by
[@​wbaldoumas](https://github.com/wbaldoumas) in
[#​1210](spectreconsole/spectre.console#1210)

## CLI
* Add async command unit tests by
[@​FrankRay78](https://github.com/FrankRay78) in
[#​1228](spectreconsole/spectre.console#1228)
* Add support for async delegate by
[@​icalvo](https://github.com/icalvo) in
[#​1215]([#​1215](spectreconsole/spectre.console#1215))
* Remove unnecessary `[NotNull]` attributes by
[@​0xced](https://github.com/0xced) in
[#​1255](spectreconsole/spectre.console#1255)
* Allow custom help providers by
[@​FrankRay78](https://github.com/FrankRay78) in
[#​1259](spectreconsole/spectre.console#1259)
* Specified details for settings for the argument vector by
[@​nils](https://github.com/nils)-a in
[#​1301](spectreconsole/spectre.console#1301)
* Add support for localisation in help provider by
[@​FrankRay78](https://github.com/FrankRay78) in
[#​1349](spectreconsole/spectre.console#1349)
* Fix DefaultValue for `FileInfo` and `DirectoryInfo` by
[@​0xced](https://github.com/0xced) in
[#​1238](spectreconsole/spectre.console#1238)

## Documentation & Samples
* Added a minimal PR template by [@​nils](https://github.com/nils)-a in
[#​1318](spectreconsole/spectre.console#1318)
 ... (truncated)

## 0.47.0

## What's Changed
* Add Alacritty to the supported terminals in AnsiDetector by @​MaxAtoms
in spectreconsole/spectre.console#1211
* Add an implicit operator to convert from Color to Style by @​0xced in
spectreconsole/spectre.console#1160
* Allow case-insensitive confirmation prompt by @​MartinZikmund in
spectreconsole/spectre.console#1151
* Allow configuration of confirmation prompt comparison via
`StringComparer` by @​MartinZikmund in
spectreconsole/spectre.console#1161
* Do not register analyzer if SpectreConsole is not available in the
current compilation by @​meziantou in
spectreconsole/spectre.console#1172
* Ensure correct comparer is used for `TextPrompt` by @​MartinZikmund in
spectreconsole/spectre.console#1152
* Forward CancellationToken to GetOperation by @​meziantou in
spectreconsole/spectre.console#1173
* Fix minor typo in Prompt example by @​Frassle in
spectreconsole/spectre.console#1183
* Fix coconut spelling by @​phillip-haydon in
spectreconsole/spectre.console#1218
* Improve conversion error messages by @​0xced in
spectreconsole/spectre.console#1141
* Make the code fix more robust and detect more symbols of type
IAnsiConsole by @​meziantou in
spectreconsole/spectre.console#1169
* Minor Refactorings by @​Elisha-Aguilera in
spectreconsole/spectre.console#1081
* Simplify access to the SemanticModel in analyzers by @​meziantou in
spectreconsole/spectre.console#1167
* Use SymbolEqualityComparer.Default when possible by @​meziantou in
spectreconsole/spectre.console#1171
* Use StringComparison.Ordinal instead of culture-sensitive comparisons
by @​meziantou in
spectreconsole/spectre.console#1174

## Command line updates
* Add possibility to set description and/or data for the default command
by @​0xced in
spectreconsole/spectre.console#1091
* Add support for converting command parameters into FileInfo and
DirectoryInfo by @​0xced in
spectreconsole/spectre.console#1145
* Add support for arrays in [DefaultValue] attributes by @​0xced in
spectreconsole/spectre.console#1164
* Add ability to pass example args using `params` syntax by @​seclerp in
spectreconsole/spectre.console#1166
* Alias for branches by @​ilyahryapko in
spectreconsole/spectre.console#1131
* Command line improvements by @​FrankRay78 in
spectreconsole/spectre.console#1103

## Documentation updates
* Alignment => Justification Docs Fixes by @​wbaldoumas in
spectreconsole/spectre.console#1143

## New Contributors
* @​wbaldoumas made their first contribution in
spectreconsole/spectre.console#1143
* @​MartinZikmund made their first contribution in
spectreconsole/spectre.console#1151
* @​ilyahryapko made their first contribution in
spectreconsole/spectre.console#1131
* @​meziantou made their first contribution in
spectreconsole/spectre.console#1174
* @​MaxAtoms made their first contribution in
spectreconsole/spectre.console#1211
* @​phillip-haydon made their first contribution in
spectreconsole/spectre.console#1218

**Full Changelog**:
spectreconsole/spectre.console@0.46.0...0.47.0

Commits viewable in [compare
view](spectreconsole/spectre.console@0.46.0...0.54.0).
</details>

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

--version not showing version when default command set Showing Mutiple Examples Function to render help text Don't show command examples at root

4 participants

Comments