diff --git a/.paket/paket.bootstrapper.exe b/.paket/paket.bootstrapper.exe index d485606c..b98e000b 100644 Binary files a/.paket/paket.bootstrapper.exe and b/.paket/paket.bootstrapper.exe differ diff --git a/src/CommandLine/UnParserExtensions.cs b/src/CommandLine/UnParserExtensions.cs index 20122a7b..7db948e7 100644 --- a/src/CommandLine/UnParserExtensions.cs +++ b/src/CommandLine/UnParserExtensions.cs @@ -18,6 +18,7 @@ public class UnParserSettings private bool preferShortName; private bool groupSwitches; private bool useEqualToken; + private bool showHidden; /// /// Gets or sets a value indicating whether unparsing process shall prefer short or long names. @@ -46,6 +47,14 @@ public bool UseEqualToken set { PopsicleSetter.Set(Consumed, ref useEqualToken, value); } } + /// + /// Gets or sets a value indicating whether unparsing process shall expose hidden options. + /// + public bool ShowHidden + { + get { return showHidden; } + set { PopsicleSetter.Set(Consumed, ref showHidden, value); } + } /// /// Factory method that creates an instance of with GroupSwitches set to true. /// @@ -119,6 +128,7 @@ public static string FormatCommandLine(this Parser parser, T options, Action< var allOptSpecs = from info in specs.Where(i => i.Specification.Tag == SpecificationType.Option) let o = (OptionSpecification)info.Specification where o.TargetType != TargetType.Switch || (o.TargetType == TargetType.Switch && ((bool)info.Value)) + where !o.Hidden || settings.ShowHidden orderby o.UniqueName() select info; @@ -206,9 +216,10 @@ private static string FormatOption(OptionSpecification spec, object value, UnPar private static string FormatName(this OptionSpecification optionSpec, UnParserSettings settings) { - var longName = - optionSpec.LongName.Length > 0 - && !settings.PreferShortName; + // Have a long name and short name not preferred? Go with long! + // No short name? Has to be long! + var longName = (optionSpec.LongName.Length > 0 && !settings.PreferShortName) + || optionSpec.ShortName.Length == 0; return new StringBuilder(longName diff --git a/tests/CommandLine.Tests/CommandLine.Tests.csproj b/tests/CommandLine.Tests/CommandLine.Tests.csproj index 5914a3a9..08d84442 100644 --- a/tests/CommandLine.Tests/CommandLine.Tests.csproj +++ b/tests/CommandLine.Tests/CommandLine.Tests.csproj @@ -58,6 +58,7 @@ Properties\SharedAssemblyInfo.cs + diff --git a/tests/CommandLine.Tests/Fakes/Hidden_Option.cs b/tests/CommandLine.Tests/Fakes/Hidden_Option.cs new file mode 100644 index 00000000..1f18f216 --- /dev/null +++ b/tests/CommandLine.Tests/Fakes/Hidden_Option.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CommandLine.Tests.Fakes +{ + public class Hidden_Option + { + [Option('h', "hiddenOption", Default="hidden", Hidden = true)] + public string HiddenOption { get; set; } + } +} diff --git a/tests/CommandLine.Tests/Unit/UnParserExtensionsTests.cs b/tests/CommandLine.Tests/Unit/UnParserExtensionsTests.cs index 3d15e2d0..74851163 100644 --- a/tests/CommandLine.Tests/Unit/UnParserExtensionsTests.cs +++ b/tests/CommandLine.Tests/Unit/UnParserExtensionsTests.cs @@ -40,6 +40,15 @@ public static void UnParsing_immutable_instance_returns_command_line(Immutable_S .ShouldBeEquivalentTo(result); } + [Theory] + [MemberData("UnParseDataHidden")] + public static void Unparsing_hidden_option_returns_command_line(Hidden_Option options, bool showHidden, string result) + { + new Parser() + .FormatCommandLine(options, config => config.ShowHidden = showHidden) + .ShouldBeEquivalentTo(result); + } + #if !SKIP_FSHARP [Theory] [MemberData("UnParseDataFSharpOption")] @@ -141,6 +150,14 @@ public static IEnumerable UnParseDataImmutable } } + public static IEnumerable UnParseDataHidden + { + get + { + yield return new object[] { new Hidden_Option { HiddenOption = "hidden" }, true, "--hiddenOption hidden" }; + yield return new object[] { new Hidden_Option { HiddenOption = "hidden" }, false, ""}; + } + } #if !SKIP_FSHARP public static IEnumerable UnParseDataFSharpOption {