Skip to content

Commit 5ade2c1

Browse files
authored
Merge branch 'main' into async
2 parents 610dff8 + 4de2281 commit 5ade2c1

File tree

13 files changed

+98
-75
lines changed

13 files changed

+98
-75
lines changed

Sources/ArgumentParser/Completions/BashCompletionsGenerator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ struct BashCompletionsGenerator {
180180
extension ArgumentDefinition {
181181
/// Returns the different completion names for this argument.
182182
fileprivate func bashCompletionWords() -> [String] {
183-
return help.visibility == .default
183+
return help.visibility.base == .default
184184
? names.map { $0.synopsisString }
185185
: []
186186
}

Sources/ArgumentParser/Completions/FishCompletionsGenerator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ extension Name {
100100

101101
extension ArgumentDefinition {
102102
fileprivate func argumentSegments(_ commandChain: [String]) -> [([String], String)] {
103-
guard help.visibility == .default else { return [] }
103+
guard help.visibility.base == .default else { return [] }
104104

105105
var results = [([String], String)]()
106106
var formattedFlags = [String]()

Sources/ArgumentParser/Completions/ZshCompletionsGenerator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ extension ArgumentDefinition {
134134
}
135135

136136
func zshCompletionString(_ commands: [ParsableCommand.Type]) -> String? {
137-
guard help.visibility == .default else { return nil }
137+
guard help.visibility.base == .default else { return nil }
138138

139139
var inputs: String
140140
switch update {

Sources/ArgumentParser/Parsable Properties/ArgumentHelp.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public struct ArgumentHelp {
3333
@available(*, deprecated, message: "Use visibility level instead.")
3434
public var shouldDisplay: Bool {
3535
get {
36-
return visibility == .default
36+
return visibility.base == .default
3737
}
3838
set {
3939
visibility = newValue ? .default : .hidden

Sources/ArgumentParser/Parsable Properties/ArgumentVisibility.swift

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,35 @@
1010
//===----------------------------------------------------------------------===//
1111

1212
/// Visibility level of an argument's help.
13-
public enum ArgumentVisibility {
14-
/// Show help for this argument whenever appropriate.
13+
public struct ArgumentVisibility {
14+
/// Internal implementation of `ArgumentVisibility` to allow for easier API
15+
/// evolution.
16+
internal enum Representation {
1517
case `default`
16-
17-
/// Only show help for this argument in the extended help screen.
1818
case hidden
19-
20-
/// Never show help for this argument.
2119
case `private`
20+
}
21+
22+
internal var base: Representation
23+
24+
/// Show help for this argument whenever appropriate.
25+
public static let `default` = Self(base: .default)
26+
27+
/// Only show help for this argument in the extended help screen.
28+
public static let hidden = Self(base: .hidden)
29+
30+
/// Never show help for this argument.
31+
public static let `private` = Self(base: .private)
2232
}
2333

24-
extension ArgumentVisibility {
34+
extension ArgumentVisibility.Representation {
2535
/// A raw Integer value that represents each visibility level.
2636
///
2737
/// `_comparableLevel` can be used to test if a Visibility case is more or
2838
/// less visible than another, without committing this behavior to API.
2939
/// A lower `_comparableLevel` indicates that the case is less visible (more
3040
/// secret).
31-
private var _comparableLevel: Int {
41+
internal var _comparableLevel: Int {
3242
switch self {
3343
case .default:
3444
return 2
@@ -38,9 +48,11 @@ extension ArgumentVisibility {
3848
return 0
3949
}
4050
}
51+
}
4152

53+
extension ArgumentVisibility {
4254
/// - Returns: true if `self` is at least as visible as the supplied argument.
43-
func isAtLeastAsVisible(as other: Self) -> Bool {
44-
self._comparableLevel >= other._comparableLevel
55+
internal func isAtLeastAsVisible(as other: Self) -> Bool {
56+
self.base._comparableLevel >= other.base._comparableLevel
4557
}
4658
}

Sources/ArgumentParser/Parsable Types/ParsableArguments.swift

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,6 @@ extension ArgumentSetProvider {
270270

271271
extension ArgumentSet {
272272
init(_ type: ParsableArguments.Type, visibility: ArgumentVisibility) {
273-
274273
#if DEBUG
275274
do {
276275
try type._validate()
@@ -286,7 +285,7 @@ extension ArgumentSet {
286285

287286
if let parsed = child.value as? ArgumentSetProvider {
288287
guard parsed._visibility.isAtLeastAsVisible(as: visibility)
289-
else { return nil }
288+
else { return nil }
290289

291290
// Property wrappers have underscore-prefixed names
292291
codingKey = String(codingKey.first == "_"
@@ -296,17 +295,12 @@ extension ArgumentSet {
296295
return parsed.argumentSet(for: key)
297296
} else {
298297
// Save a non-wrapped property as is
299-
var definition = ArgumentDefinition(
300-
key: InputKey(rawValue: codingKey),
301-
kind: .default,
302-
parser: { _ in nil },
303-
default: nilOrValue(child.value),
304-
completion: .default)
305-
definition.help.updateArgumentHelp(help: .hidden)
306-
return ArgumentSet(definition)
298+
return ArgumentSet(
299+
ArgumentDefinition(unparsedKey: codingKey, default: nilOrValue(child.value)))
307300
}
308301
}
309-
self.init(sets: a)
302+
self.init(
303+
a.joined().filter { $0.help.visibility.isAtLeastAsVisible(as: visibility) })
310304
}
311305
}
312306

Sources/ArgumentParser/Parsing/ArgumentSet.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,23 @@ extension ArgumentDefinition {
190190
}
191191
}
192192

193+
extension ArgumentDefinition {
194+
/// Creates an argument definition for a property that isn't parsed from the
195+
/// command line.
196+
///
197+
/// This initializer is used for any property defined on a `ParsableArguments`
198+
/// type that isn't decorated with one of ArgumentParser's property wrappers.
199+
init(unparsedKey: String, default defaultValue: Any?) {
200+
self.init(
201+
key: InputKey(rawValue: unparsedKey),
202+
kind: .default,
203+
parser: { _ in nil },
204+
default: defaultValue,
205+
completion: .default)
206+
help.updateArgumentHelp(help: .private)
207+
}
208+
}
209+
193210
// MARK: - Parsing from SplitArguments
194211
extension ArgumentSet {
195212
/// Parse the given input for this set of defined arguments.

Sources/ArgumentParser/Usage/DumpHelpGenerator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ fileprivate extension ArgumentInfoV0 {
125125
guard let kind = ArgumentInfoV0.KindV0(argument: argument) else { return nil }
126126
self.init(
127127
kind: kind,
128-
shouldDisplay: argument.help.visibility == .default,
128+
shouldDisplay: argument.help.visibility.base == .default,
129129
isOptional: argument.help.options.contains(.isOptional),
130130
isRepeating: argument.help.options.contains(.isRepeating),
131131
names: argument.names.map(ArgumentInfoV0.NameInfoV0.init),

Sources/ArgumentParser/Usage/HelpGenerator.swift

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ internal struct HelpGenerator {
106106
if let usage = currentCommand.configuration.usage {
107107
self.usage = usage
108108
} else {
109-
var usage = UsageGenerator(toolName: toolName, definition: [currentArgSet]).synopsis
109+
var usage = UsageGenerator(toolName: toolName, definition: [currentArgSet])
110+
.synopsis
110111
if !currentCommand.configuration.subcommands.isEmpty {
111112
if usage.last != " " { usage += " " }
112113
usage += "<subcommand>"
@@ -140,7 +141,7 @@ internal struct HelpGenerator {
140141
/// more elements at a time.
141142
var args = commandStack.argumentsForHelp(visibility: visibility)[...]
142143
while let arg = args.popFirst() {
143-
guard arg.help.visibility == .default else { continue }
144+
assert(arg.help.visibility.isAtLeastAsVisible(as: visibility))
144145

145146
let synopsis: String
146147
let description: String
@@ -154,7 +155,6 @@ internal struct HelpGenerator {
154155

155156
synopsis = groupedArgs
156157
.lazy
157-
.filter { $0.help.visibility == .default }
158158
.map { $0.synopsisForHelp }
159159
.joined(separator: "/")
160160

@@ -172,9 +172,7 @@ internal struct HelpGenerator {
172172
.filter { !$0.isEmpty }
173173
.joined(separator: " ")
174174
} else {
175-
synopsis = arg.help.visibility == .default
176-
? arg.synopsisForHelp
177-
: ""
175+
synopsis = arg.synopsisForHelp
178176

179177
let defaultValue = arg.help.defaultValue.flatMap { $0.isEmpty ? nil : "(default: \($0))" }
180178
description = [arg.help.abstract, defaultValue]
@@ -275,10 +273,10 @@ fileprivate extension NameSpecification {
275273
self
276274
.makeNames(InputKey(rawValue: "help"))
277275
.compactMap { name in
278-
guard visibility != .default else { return name }
276+
guard visibility.base != .default else { return name }
279277
switch name {
280278
case .long(let helpName):
281-
return .long("\(helpName)-\(visibility)")
279+
return .long("\(helpName)-\(visibility.base)")
282280
case .longWithSingleDash(let helpName):
283281
return .longWithSingleDash("\(helpName)-\(visibility)")
284282
case .short:

Sources/ArgumentParser/Usage/UsageGenerator.swift

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ extension UsageGenerator {
2222
self.init(toolName: toolName, definition: definition)
2323
}
2424

25-
init(toolName: String, parsable: ParsableArguments) {
25+
init(toolName: String, parsable: ParsableArguments, visibility: ArgumentVisibility) {
2626
self.init(
2727
toolName: toolName,
28-
definition: ArgumentSet(type(of: parsable), visibility: .default))
28+
definition: ArgumentSet(type(of: parsable), visibility: visibility))
2929
}
3030

3131
init(toolName: String, definition: [ArgumentSet]) {
@@ -38,9 +38,7 @@ extension UsageGenerator {
3838
///
3939
/// In `roff`.
4040
var synopsis: String {
41-
// Filter out options that should not be displayed.
42-
var options = definition
43-
.filter { $0.help.visibility == .default }
41+
var options = Array(definition)
4442
switch options.count {
4543
case 0:
4644
return toolName
@@ -346,7 +344,7 @@ extension ErrorMessageGenerator {
346344
func noValueMessage(key: InputKey) -> String? {
347345
let args = arguments(for: key)
348346
let possibilities: [String] = args.compactMap {
349-
$0.help.visibility == .default
347+
$0.help.visibility.base == .default
350348
? $0.nonOptional.synopsis
351349
: nil
352350
}

Sources/ArgumentParserTestHelpers/TestHelpers.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public func AssertHelp<T: ParsableArguments>(
122122
let flag: String
123123
let includeHidden: Bool
124124

125-
switch visibility {
125+
switch visibility.base {
126126
case .default:
127127
flag = "--help"
128128
includeHidden = false
@@ -158,7 +158,7 @@ public func AssertHelp<T: ParsableCommand, U: ParsableCommand>(
158158
) {
159159
let includeHidden: Bool
160160

161-
switch visibility {
161+
switch visibility.base {
162162
case .default:
163163
includeHidden = false
164164
case .hidden:

Tests/ArgumentParserUnitTests/HelpGenerationTests.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,6 @@ extension HelpGenerationTests {
7272
7373
""")
7474

75-
#if !os(Linux)
76-
XCTExpectFailure("""
77-
The following test fails to properly generate the help-hidden
78-
message properly because help-hidden is not fully supported yet.
79-
""")
8075
AssertHelp(.hidden, for: B.self, equals: """
8176
USAGE: b --name <name> [--title <title>] [<hidden-name>] [--hidden-title <hidden-title>] [--hidden-flag] [--hidden-inverted-flag] [--no-hidden-inverted-flag]
8277
@@ -93,7 +88,6 @@ extension HelpGenerationTests {
9388
-h, --help Show help information.
9489
9590
""")
96-
#endif
9791
}
9892

9993
struct C: ParsableArguments {

0 commit comments

Comments
 (0)