Skip to content

Commit

Permalink
Make arrays with default values use their elements' defaultValueDescr…
Browse files Browse the repository at this point in the history
…iption (apple#209)

* Make array arguments/options use their elements' defaultArgumentValue

* Add test

* Don't wrap the output in square brackets

* Change testHelpWithDefaultValues() to expect bracketless array description
  • Loading branch information
Wevah authored Jul 28, 2020
1 parent a4e4ae4 commit b1f34b1
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 3 deletions.
2 changes: 1 addition & 1 deletion Sources/ArgumentParser/Parsable Properties/Argument.swift
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ extension Argument {
initial: { origin, values in
values.set(wrappedValue, forKey: key, inputOrigin: origin)
})
arg.help.defaultValue = !wrappedValue.isEmpty ? "\(wrappedValue)" : nil
arg.help.defaultValue = !wrappedValue.isEmpty ? wrappedValue.defaultValueDescription : nil
return ArgumentSet(alternatives: [arg])
})
}
Expand Down
2 changes: 1 addition & 1 deletion Sources/ArgumentParser/Parsable Properties/Option.swift
Original file line number Diff line number Diff line change
Expand Up @@ -506,7 +506,7 @@ extension Option {
var arg = ArgumentDefinition(kind: kind, help: help, parsingStrategy: ArgumentDefinition.ParsingStrategy(parsingStrategy), update: .appendToArray(forType: Element.self, key: key), initial: { origin, values in
values.set(wrappedValue, forKey: key, inputOrigin: origin)
})
arg.help.defaultValue = !wrappedValue.isEmpty ? "\(wrappedValue)" : nil
arg.help.defaultValue = !wrappedValue.isEmpty ? wrappedValue.defaultValueDescription : nil
return ArgumentSet(alternatives: [arg])
})
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,9 @@ extension Float: ExpressibleByArgument {}
extension Double: ExpressibleByArgument {}

extension Bool: ExpressibleByArgument {}

extension Array where Element: ExpressibleByArgument {
var defaultValueDescription: String {
return map { $0.defaultValueDescription }.joined(separator: ", ")
}
}
36 changes: 35 additions & 1 deletion Tests/ArgumentParserUnitTests/HelpGenerationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ extension HelpGenerationTests {
Your middle name. (default: Winston)
--age <age> Your age. (default: 20)
--logging <logging> Whether logging is enabled. (default: false)
--lucky <numbers> Your lucky numbers. (default: [7, 14])
--lucky <numbers> Your lucky numbers. (default: 7, 14)
--optional/--required Vegan diet. (default: optional)
--degree <degree> Your degree. (default: bachelor)
--directory <directory> Directory. (default: current directory)
Expand Down Expand Up @@ -401,4 +401,38 @@ extension HelpGenerationTests {
See 'n help <subcommand>' for detailed help.
""")
}

enum O: String, ExpressibleByArgument {
case small
case medium
case large

init?(argument: String) {
guard let result = Self(rawValue: argument) else {
return nil
}
self = result
}
}
struct P: ParsableArguments {
@Option(name: [.short], help: "Help Message")
var o: [O] = [.small, .medium]

@Argument(help: "Help Message")
var remainder: [O] = [.large]
}

func testHelpWithDefaultValueForArray() {
AssertHelp(for: P.self, equals: """
USAGE: p [-o <o> ...] [<remainder> ...]
ARGUMENTS:
<remainder> Help Message (default: large)
OPTIONS:
-o <o> Help Message (default: small, medium)
-h, --help Show help information.
""")
}
}

0 comments on commit b1f34b1

Please sign in to comment.