Skip to content

Commit

Permalink
Merge pull request #132 from dart-lang/recreateSigurdsPR
Browse files Browse the repository at this point in the history
Add option `hideNegatable` to `ArgParser.flag()`
  • Loading branch information
sigurdm authored Oct 21, 2024
2 parents dec28c1 + 25efc0f commit ba4b4af
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 2 deletions.
4 changes: 3 additions & 1 deletion pkgs/args/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
## 2.6.1-wip

* Fix the reporitory URL in `pubspec.yaml`.
* Fix the repository URL in `pubspec.yaml`.
* Added option `hideNegatedUsage` to `ArgParser.flag()` allowing a flag to be
`negatable` without showing it in the usage text.

## 2.6.0

Expand Down
1 change: 1 addition & 0 deletions pkgs/args/lib/src/allow_anything_parser.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class AllowAnythingParser implements ArgParser {
bool negatable = true,
void Function(bool)? callback,
bool hide = false,
bool hideNegatedUsage = false,
List<String> aliases = const []}) {
throw UnsupportedError(
"ArgParser.allowAnything().addFlag() isn't supported.");
Expand Down
16 changes: 16 additions & 0 deletions pkgs/args/lib/src/arg_parser.dart
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,11 @@ class ArgParser {
///
/// If [hide] is `true`, this option won't be included in [usage].
///
/// If [hideNegatedUsage] is `true`, the fact that this flag can be negated
/// will not be documented in [usage].
/// It is an error for [hideNegatedUsage] to be `true` if [negatable] is
/// `false`.
///
/// If [aliases] is provided, these are used as aliases for [name]. These
/// aliases will not appear as keys in the [options] map.
///
Expand All @@ -133,6 +138,7 @@ class ArgParser {
bool negatable = true,
void Function(bool)? callback,
bool hide = false,
bool hideNegatedUsage = false,
List<String> aliases = const []}) {
_addOption(
name,
Expand All @@ -146,6 +152,7 @@ class ArgParser {
OptionType.flag,
negatable: negatable,
hide: hide,
hideNegatedUsage: hideNegatedUsage,
aliases: aliases);
}

Expand Down Expand Up @@ -285,6 +292,7 @@ class ArgParser {
bool? splitCommas,
bool mandatory = false,
bool hide = false,
bool hideNegatedUsage = false,
List<String> aliases = const []}) {
var allNames = [name, ...aliases];
if (allNames.any((name) => findByNameOrAlias(name) != null)) {
Expand All @@ -306,12 +314,20 @@ class ArgParser {
'The option $name cannot be mandatory and have a default value.');
}

if (!negatable && hideNegatedUsage) {
throw ArgumentError(
'The option $name cannot have `hideNegatedUsage` '
'without being negatable.',
);
}

var option = newOption(name, abbr, help, valueHelp, allowed, allowedHelp,
defaultsTo, callback, type,
negatable: negatable,
splitCommas: splitCommas,
mandatory: mandatory,
hide: hide,
hideNegatedUsage: hideNegatedUsage,
aliases: aliases);
_options[name] = option;
_optionsAndSeparators.add(option);
Expand Down
8 changes: 8 additions & 0 deletions pkgs/args/lib/src/option.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@ Option newOption(
bool? splitCommas,
bool mandatory = false,
bool hide = false,
bool hideNegatedUsage = false,
List<String> aliases = const []}) {
return Option._(name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo,
callback, type,
negatable: negatable,
splitCommas: splitCommas,
mandatory: mandatory,
hide: hide,
hideNegatedUsage: hideNegatedUsage,
aliases: aliases);
}

Expand Down Expand Up @@ -66,6 +68,11 @@ class Option {
/// This is `null` unless [type] is [OptionType.flag].
final bool? negatable;

/// Whether to document that this flag is [negatable].
///
/// This is `null` unless [type] is [OptionType.flag].
final bool? hideNegatedUsage;

/// The callback to invoke with the option's value when the option is parsed.
final Function? callback;

Expand Down Expand Up @@ -108,6 +115,7 @@ class Option {
bool? splitCommas,
this.mandatory = false,
this.hide = false,
this.hideNegatedUsage,
this.aliases = const []})
: allowed = allowed == null ? null : List.unmodifiable(allowed),
allowedHelp =
Expand Down
2 changes: 1 addition & 1 deletion pkgs/args/lib/src/usage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ class _Usage {

String _longOption(Option option) {
String result;
if (option.negatable!) {
if (option.negatable! && !option.hideNegatedUsage!) {
result = '--[no-]${option.name}';
} else {
result = '--${option.name}';
Expand Down
10 changes: 10 additions & 0 deletions pkgs/args/test/usage_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,16 @@ void main() {
''');
});

test('negatable flags with hideNegatedUsage don\'t show "no-" in title',
() {
var parser = ArgParser();
parser.addFlag('mode', help: 'The mode', hideNegatedUsage: true);

validateUsage(parser, '''
--mode The mode
''');
});

test('non-negatable flags don\'t show "no-" in title', () {
var parser = ArgParser();
parser.addFlag('mode', negatable: false, help: 'The mode');
Expand Down

0 comments on commit ba4b4af

Please sign in to comment.