public void It_finds_member_xml() { const string xml = @"<?xml version=""1.0""?> <doc> <assembly> <name>DragonFruit</name> </assembly> <members> <member name=""M:System.CommandLine.DragonFruit.Tests." + nameof(XmlDocReaderTests) + @".Program.Main(System.Boolean,System.String,System.Nullable{System.Int32})""> <summary> Hello </summary> <param name=""verbose"">Show verbose output</param> <param name=""flavor"">Which flavor to use</param> <param name=""count"">How many smoothies?</param> </member> </members> </doc> "; Action <bool, string, int?> action = Program.Main; var reader = new StringReader(xml); XmlDocReader.TryLoad(reader, out var docReader).Should().BeTrue(); docReader.TryGetMethodDescription(action.Method, out var helpMetadata).Should().BeTrue(); helpMetadata.Description.Should().Be("Hello"); helpMetadata.ParameterDescriptions["verbose"].Should().Be("Show verbose output"); helpMetadata.ParameterDescriptions["flavor"].Should().Be("Which flavor to use"); helpMetadata.ParameterDescriptions["count"].Should().Be("How many smoothies?"); }
public XmlDocReader TryLoad_Sample1() { // I experienced problems with [IterationSetup]/[IterationCleanup] // https://github.com/dotnet/BenchmarkDotNet/issues/1127 // So I have ended up placing it here for now _xmlDocsStreamReader.BaseStream.Seek(0, SeekOrigin.Begin); // XmlDocReader.TryLoad(_xmlDocsStreamReader, out var docReader); return(docReader); }
public static CommandLineBuilder ConfigureHelpFromXmlComments( this CommandLineBuilder builder, MethodInfo method, string xmlDocsFilePath) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } if (method == null) { throw new ArgumentNullException(nameof(method)); } if (XmlDocReader.TryLoad(xmlDocsFilePath ?? GetDefaultXmlDocsFileLocation(method.DeclaringType.Assembly), out var xmlDocs)) { if (xmlDocs.TryGetMethodDescription(method, out CommandHelpMetadata metadata) && metadata.Description != null) { builder.Command.Description = metadata.Description; var options = builder.Options.ToArray(); foreach (var parameterDescription in metadata.ParameterDescriptions) { var kebabCasedParameterName = parameterDescription.Key.ToKebabCase(); var option = options.FirstOrDefault(o => o.HasAlias(kebabCasedParameterName)); if (option != null) { option.Description = parameterDescription.Value; } else { foreach (var argument in builder.Command.Arguments) { if (string.Equals( argument.Name, kebabCasedParameterName, StringComparison.OrdinalIgnoreCase)) { argument.Description = parameterDescription.Value; } } } } metadata.Name = method.DeclaringType.Assembly.GetName().Name; } } return(builder); }
public void It_finds_member_without_param() { const string xml = @"<?xml version=""1.0""?> <doc> <assembly> <name>DragonFruit</name> </assembly> <members> <member name=""M:System.CommandLine.DragonFruit.Tests." + nameof(XmlDocReaderTests) + @".Program.MainWithoutParam""> <summary> Hello </summary> </member> </members> </doc> "; Action action = Program.MainWithoutParam; var reader = new StringReader(xml); XmlDocReader.TryLoad(reader, out var docReader).Should().BeTrue(); docReader.TryGetMethodDescription(action.Method, out var helpMetadata).Should().BeTrue(); helpMetadata.Description.Should().Be("Hello"); }
public static void ConfigureFromMethod( this Command command, MethodInfo method, object target = null) { if (command == null) { throw new ArgumentNullException(nameof(command)); } if (method == null) { throw new ArgumentNullException(nameof(method)); } foreach (var option in method.BuildOptions()) { command.AddOption(option); } if (method.GetParameters() .FirstOrDefault(p => _argumentParameterNames.Contains(p.Name)) is ParameterInfo argsParam) { var argument = new Argument { ArgumentType = argsParam.ParameterType, Name = argsParam.Name }; if (argsParam.HasDefaultValue) { if (argsParam.DefaultValue != null) { argument.SetDefaultValue(argsParam.DefaultValue); } else { argument.SetDefaultValueFactory(() => null); } } command.AddArgument(argument); } if (XmlDocReader.TryLoad(GetDefaultXmlDocsFileLocation(method.DeclaringType.Assembly), out var xmlDocs)) { if (xmlDocs.TryGetMethodDescription(method, out CommandHelpMetadata metadata) && metadata.Description != null) { command.Description = metadata.Description; var options = command.Options.ToArray(); foreach (var parameterDescription in metadata.ParameterDescriptions) { var kebabCasedParameterName = parameterDescription.Key.ToKebabCase(); var option = options.FirstOrDefault(o => o.HasAlias(kebabCasedParameterName)); if (option != null) { option.Description = parameterDescription.Value; } else { foreach (var argument in command.Arguments) { if (string.Equals( argument.Name, kebabCasedParameterName, StringComparison.OrdinalIgnoreCase)) { argument.Description = parameterDescription.Value; } } } } metadata.Name = method.DeclaringType.Assembly.GetName().Name; } } command.Handler = CommandHandler.Create(method, target); }