Skip to content

Commit 63e6c57

Browse files
authored
Provide non-experimental help-hidden flags (#409)
1 parent 185b45f commit 63e6c57

File tree

4 files changed

+47
-22
lines changed

4 files changed

+47
-22
lines changed

Sources/ArgumentParser/Parsing/CommandParser.swift

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,16 +76,17 @@ extension CommandParser {
7676
/// Throws a `HelpRequested` error if the user has specified either of the
7777
/// built in help flags.
7878
func checkForBuiltInFlags(_ split: SplitArguments) throws {
79-
guard !split.contains(Name.long("experimental-help-hidden")) else {
80-
throw HelpRequested(visibility: .hidden)
81-
}
82-
8379
// Look for help flags
84-
guard !split.contains(anyOf: self.commandStack.getHelpNames()) else {
80+
guard !split.contains(anyOf: self.commandStack.getHelpNames(visibility: .default)) else {
8581
throw HelpRequested(visibility: .default)
8682
}
8783

88-
// Look for the "dump help" request
84+
// Look for help-hidden flags
85+
guard !split.contains(anyOf: self.commandStack.getHelpNames(visibility: .hidden)) else {
86+
throw HelpRequested(visibility: .hidden)
87+
}
88+
89+
// Look for dump-help flag
8990
guard !split.contains(Name.long("experimental-dump-help")) else {
9091
throw CommandError(commandStack: commandStack, parserError: .dumpHelpRequested)
9192
}

Sources/ArgumentParser/Usage/HelpGenerator.swift

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -265,20 +265,34 @@ fileprivate extension CommandConfiguration {
265265
}
266266

267267
fileprivate extension NameSpecification {
268-
func generateHelpNames() -> [Name] {
269-
return self.makeNames(InputKey(rawValue: "help")).sorted(by: >)
268+
func generateHelpNames(visibility: ArgumentVisibility) -> [Name] {
269+
self
270+
.makeNames(InputKey(rawValue: "help"))
271+
.compactMap { name in
272+
guard visibility != .default else { return name }
273+
switch name {
274+
case .long(let helpName):
275+
return .long("\(helpName)-\(visibility)")
276+
case .longWithSingleDash(let helpName):
277+
return .longWithSingleDash("\(helpName)-\(visibility)")
278+
case .short:
279+
// Cannot create a non-default help flag from a short name.
280+
return nil
281+
}
282+
}
283+
.sorted(by: >)
270284
}
271285
}
272286

273287
internal extension BidirectionalCollection where Element == ParsableCommand.Type {
274-
func getHelpNames() -> [Name] {
288+
func getHelpNames(visibility: ArgumentVisibility) -> [Name] {
275289
return self.last(where: { $0.configuration.helpNames != nil })
276-
.map { $0.configuration.helpNames!.generateHelpNames() }
277-
?? CommandConfiguration.defaultHelpNames.generateHelpNames()
290+
.map { $0.configuration.helpNames!.generateHelpNames(visibility: visibility) }
291+
?? CommandConfiguration.defaultHelpNames.generateHelpNames(visibility: visibility)
278292
}
279293

280294
func getPrimaryHelpName() -> Name? {
281-
getHelpNames().preferredName
295+
getHelpNames(visibility: .default).preferredName
282296
}
283297

284298
func versionArgumentDefinition() -> ArgumentDefinition? {
@@ -293,7 +307,7 @@ internal extension BidirectionalCollection where Element == ParsableCommand.Type
293307
}
294308

295309
func helpArgumentDefinition() -> ArgumentDefinition? {
296-
let names = getHelpNames()
310+
let names = getHelpNames(visibility: .default)
297311
guard !names.isEmpty else { return nil }
298312
return ArgumentDefinition(
299313
kind: .named(names),

Sources/ArgumentParserTestHelpers/TestHelpers.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public func AssertHelpHidden<T: ParsableArguments>(
144144
file: StaticString = #file, line: UInt = #line
145145
) {
146146
do {
147-
_ = try T.parse(["--experimental-help-hidden"])
147+
_ = try T.parse(["--help-hidden"])
148148
XCTFail(file: (file), line: line)
149149
} catch {
150150
let helpString = T.fullMessage(for: error)

Tests/ArgumentParserPackageManagerTests/HelpTests.swift

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,11 @@ struct CustomHelp: ParsableCommand {
193193

194194
extension HelpTests {
195195
func testCustomHelpNames() {
196-
let names = [CustomHelp.self].getHelpNames()
197-
XCTAssertEqual(names, [.short("?"), .long("show-help")])
198-
196+
let helpNames = [CustomHelp.self].getHelpNames(visibility: .default)
197+
XCTAssertEqual(helpNames, [.short("?"), .long("show-help")])
198+
let helpHiddenNames = [CustomHelp.self].getHelpNames(visibility: .hidden)
199+
XCTAssertEqual(helpHiddenNames, [.long("show-help-hidden")])
200+
199201
AssertFullErrorMessage(CustomHelp.self, ["--error"], """
200202
Error: Unknown option '--error'
201203
Usage: custom-help
@@ -214,8 +216,10 @@ struct NoHelp: ParsableCommand {
214216

215217
extension HelpTests {
216218
func testNoHelpNames() {
217-
let names = [NoHelp.self].getHelpNames()
218-
XCTAssertEqual(names, [])
219+
let helpNames = [NoHelp.self].getHelpNames(visibility: .default)
220+
XCTAssertEqual(helpNames, [])
221+
let helpHiddenNames = [NoHelp.self].getHelpNames(visibility: .hidden)
222+
XCTAssertEqual(helpHiddenNames, [])
219223

220224
AssertFullErrorMessage(NoHelp.self, ["--error"], """
221225
Error: Missing expected argument '--count <count>'
@@ -257,12 +261,18 @@ struct SubCommandCustomHelp: ParsableCommand {
257261

258262
extension HelpTests {
259263
func testSubCommandInheritHelpNames() {
260-
let names = [SubCommandCustomHelp.self, SubCommandCustomHelp.InheritHelp.self].getHelpNames()
264+
let names = [
265+
SubCommandCustomHelp.self,
266+
SubCommandCustomHelp.InheritHelp.self,
267+
].getHelpNames(visibility: .default)
261268
XCTAssertEqual(names, [.short("p"), .long("parent-help")])
262269
}
263270

264271
func testSubCommandCustomHelpNames() {
265-
let names = [SubCommandCustomHelp.self, SubCommandCustomHelp.ModifiedHelp.self].getHelpNames()
272+
let names = [
273+
SubCommandCustomHelp.self,
274+
SubCommandCustomHelp.ModifiedHelp.self
275+
].getHelpNames(visibility: .default)
266276
XCTAssertEqual(names, [.short("s"), .long("subcommand-help")])
267277
}
268278

@@ -271,7 +281,7 @@ extension HelpTests {
271281
SubCommandCustomHelp.self,
272282
SubCommandCustomHelp.ModifiedHelp.self,
273283
SubCommandCustomHelp.ModifiedHelp.InheritImmediateParentdHelp.self
274-
].getHelpNames()
284+
].getHelpNames(visibility: .default)
275285
XCTAssertEqual(names, [.short("s"), .long("subcommand-help")])
276286
}
277287
}

0 commit comments

Comments
 (0)