From 5f61af0cd74c2bf0a0776a04a7e05b97e45bd795 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Wed, 31 May 2023 16:12:51 -0700 Subject: [PATCH 1/8] introduce types methods to ArgResults --- CHANGELOG.md | 6 + README.md | 12 +- analysis_options.yaml | 12 +- example/command_runner/draw.dart | 18 +-- lib/command_runner.dart | 6 +- lib/src/arg_results.dart | 54 ++++++++- lib/src/help_command.dart | 4 +- pubspec.yaml | 10 +- test/args_test.dart | 2 + test/command_parse_test.dart | 2 + test/command_runner_test.dart | 4 +- test/parse_test.dart | 187 +++++++++++++++++++++++++++++++ test/trailing_options_test.dart | 2 + 13 files changed, 278 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16515ba..c93d163 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 2.5.0-wip + +* Introduce new typed `ArgResults.getFlag`, `ArgResults.getOption`, and + `ArgResults.getMultiOption` methods. +* Deprecate the untyped `ArgResults` `dynamic operator [](String)` method. + ## 2.4.2 * Change the validation of `mandatory` options; they now perform validation when diff --git a/README.md b/README.md index e47bfc7..e756d66 100644 --- a/README.md +++ b/README.md @@ -111,8 +111,8 @@ parser.addOption('mode'); parser.addFlag('verbose', defaultsTo: true); var results = parser.parse(['--mode', 'debug', 'something', 'else']); -print(results['mode']); // debug -print(results['verbose']); // true +print(results.getOption('mode')); // debug +print(results.getFlag('verbose')); // true ``` By default, the `parse()` method allows additional flags and options to be @@ -187,7 +187,7 @@ overriding earlier ones; for example: var parser = ArgParser(); parser.addOption('mode'); var results = parser.parse(['--mode', 'on', '--mode', 'off']); -print(results['mode']); // prints 'off' +print(results.getOption('mode')); // prints 'off' ``` Multiple values can be parsed with `addMultiOption()`. With this method, an @@ -198,7 +198,7 @@ values: var parser = ArgParser(); parser.addMultiOption('mode'); var results = parser.parse(['--mode', 'on', '--mode', 'off']); -print(results['mode']); // prints '[on, off]' +print(results.getMultiOption('mode')); // prints '[on, off]' ``` By default, values for a multi-valued option may also be separated with commas: @@ -207,7 +207,7 @@ By default, values for a multi-valued option may also be separated with commas: var parser = ArgParser(); parser.addMultiOption('mode'); var results = parser.parse(['--mode', 'on,off']); -print(results['mode']); // prints '[on, off]' +print(results.getMultiOption('mode')); // prints '[on, off]' ``` This can be disabled by passing `splitCommas: false`. @@ -325,7 +325,7 @@ class CommitCommand extends Command { void run() { // [argResults] is set before [run()] is called and contains the flags/options // passed to this command. - print(argResults['all']); + print(argResults.getFlag('all')); } } ``` diff --git a/analysis_options.yaml b/analysis_options.yaml index a9dbdb5..7c2b0f2 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,27 +1,17 @@ # https://dart.dev/guides/language/analysis-options -include: package:lints/recommended.yaml +include: package:dart_flutter_team_lints/analysis_options.yaml linter: rules: - - always_declare_return_types - - avoid_dynamic_calls - avoid_unused_constructor_parameters - cancel_subscriptions - comment_references - - directives_ordering - - lines_longer_than_80_chars - literal_only_boolean_expressions - missing_whitespace_between_adjacent_strings - no_adjacent_strings_in_list - no_runtimeType_toString - - omit_local_variable_types - package_api_docs - prefer_relative_imports - - prefer_single_quotes - test_types_in_equals - - throw_in_finally - - type_annotate_public_apis - - unawaited_futures - unnecessary_await_in_return - - unnecessary_lambdas - use_super_parameters diff --git a/example/command_runner/draw.dart b/example/command_runner/draw.dart index 3f0baec..5ff9a2d 100644 --- a/example/command_runner/draw.dart +++ b/example/command_runner/draw.dart @@ -33,8 +33,8 @@ class SquareCommand extends Command { @override FutureOr? run() { - final size = int.parse(argResults?['size'] ?? '20'); - final char = (globalResults?['char'] as String?)?[0] ?? '#'; + final size = int.parse(argResults.getOption('size') ?? '20'); + final char = globalResults?.getOption('char')?[0] ?? '#'; return draw(size, size, char, (x, y) => true); } } @@ -55,8 +55,8 @@ class CircleCommand extends Command { @override FutureOr? run() { - final size = 2 * int.parse(argResults?['radius'] ?? '10'); - final char = (globalResults?['char'] as String?)?[0] ?? '#'; + final size = 2 * int.parse(argResults.getOption('radius') ?? '10'); + final char = globalResults?.getOption('char')?[0] ?? '#'; return draw(size, size, char, (x, y) => x * x + y * y < 1); } } @@ -93,8 +93,8 @@ class EquilateralTriangleCommand extends Command { @override FutureOr? run() { - final size = int.parse(argResults?['size'] ?? '20'); - final char = (globalResults?['char'] as String?)?[0] ?? '#'; + final size = int.parse(argResults.getOption('size') ?? '20'); + final char = globalResults?.getOption('char')?[0] ?? '#'; return drawTriangle(size, size * sqrt(3) ~/ 2, char); } } @@ -116,9 +116,9 @@ class IsoscelesTriangleCommand extends Command { @override FutureOr? run() { - final width = int.parse(argResults?['width'] ?? '50'); - final height = int.parse(argResults?['height'] ?? '10'); - final char = (globalResults?['char'] as String?)?[0] ?? '#'; + final width = int.parse(argResults.getOption('width') ?? '50'); + final height = int.parse(argResults.getOption('height') ?? '10'); + final char = globalResults?.getOption('char')?[0] ?? '#'; return drawTriangle(width, height, char); } } diff --git a/lib/command_runner.dart b/lib/command_runner.dart index 183264d..d45fec6 100644 --- a/lib/command_runner.dart +++ b/lib/command_runner.dart @@ -192,13 +192,13 @@ class CommandRunner { commands = command._subcommands as Map>; commandString += ' ${argResults.name}'; - if (argResults.options.contains('help') && argResults['help']) { + if (argResults.options.contains('help') && argResults.getFlag('help')) { command.printUsage(); return null; } } - if (topLevelResults['help']) { + if (topLevelResults.getFlag('help')) { command!.printUsage(); return null; } @@ -320,7 +320,7 @@ abstract class Command { /// The parsed argument results for this command. /// /// This will be `null` until just before [Command.run] is called. - ArgResults? get argResults => _argResults; + ArgResults get argResults => _argResults!; ArgResults? _argResults; /// The argument parser for this command. diff --git a/lib/src/arg_results.dart b/lib/src/arg_results.dart index 3761ab1..1fbcd73 100644 --- a/lib/src/arg_results.dart +++ b/lib/src/arg_results.dart @@ -21,7 +21,7 @@ ArgResults newArgResults( } /// The results of parsing a series of command line arguments using -/// [ArgParser.parse()]. +/// [ArgParser.parse]. /// /// Includes the parsed options and any remaining unparsed command line /// arguments. @@ -57,9 +57,10 @@ class ArgResults { : rest = UnmodifiableListView(rest), arguments = UnmodifiableListView(arguments); - /// Returns the parsed ore default command-line option named [name]. + /// Returns the parsed or default command-line option named [name]. /// /// [name] must be a valid option name in the parser. + @Deprecated('Prefer the getFlag, getOption, and getMultiOption methods') dynamic operator [](String name) { if (!_parser.options.containsKey(name)) { throw ArgumentError('Could not find an option named "$name".'); @@ -73,11 +74,56 @@ class ArgResults { return option.valueOrDefault(_parsed[name]); } + /// Returns the parsed or default command-line flag named [name]. + /// + /// [name] must be a valid flag name in the parser. + bool getFlag(String name) { + if (!_parser.options.containsKey(name)) { + throw ArgumentError('Could not find an option named "$name".'); + } + + var option = _parser.options[name]!; + if (!option.isFlag) { + throw ArgumentError('"$name" is not a flag.'); + } + return option.valueOrDefault(_parsed[name]) as bool; + } + + /// Returns the parsed or default command-line option named [name]. + /// + /// [name] must be a valid option name in the parser. + String? getOption(String name) { + if (!_parser.options.containsKey(name)) { + throw ArgumentError('Could not find an option named "$name".'); + } + + var option = _parser.options[name]!; + if (!option.isSingle) { + throw ArgumentError('"$name" is not an option.'); + } + return option.valueOrDefault(_parsed[name]) as String?; + } + + /// Returns the list of parsed (or default) command-line options for [name]. + /// + /// [name] must be a valid option name in the parser. + List getMultiOption(String name) { + if (!_parser.options.containsKey(name)) { + throw ArgumentError('Could not find an option named "$name".'); + } + + var option = _parser.options[name]!; + if (!option.isMultiple) { + throw ArgumentError('"$name" is not a multi-option.'); + } + return option.valueOrDefault(_parsed[name]) as List; + } + /// The names of the available options. /// /// Includes the options whose values were parsed or that have defaults. /// Options that weren't present and have no default are omitted. - Iterable get options { + List get options { var result = _parsed.keys.toSet(); // Include the options that have defaults. @@ -85,7 +131,7 @@ class ArgResults { if (option.defaultsTo != null) result.add(name); }); - return result; + return result.toList(); } /// Returns `true` if the option with [name] was parsed from an actual diff --git a/lib/src/help_command.dart b/lib/src/help_command.dart index f04d014..08fbad6 100644 --- a/lib/src/help_command.dart +++ b/lib/src/help_command.dart @@ -24,7 +24,7 @@ class HelpCommand extends Command { @override Null run() { // Show the default help if no command was specified. - if (argResults!.rest.isEmpty) { + if (argResults.rest.isEmpty) { runner!.printUsage(); return; } @@ -35,7 +35,7 @@ class HelpCommand extends Command { Command? command; var commandString = runner!.executableName; - for (var name in argResults!.rest) { + for (var name in argResults.rest) { if (commands.isEmpty) { command!.usageException( 'Command "$commandString" does not expect a subcommand.'); diff --git a/pubspec.yaml b/pubspec.yaml index dec55a9..807db2d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,16 +1,16 @@ name: args -version: 2.4.2 +version: 2.5.0-wip description: >- - Library for defining parsers for parsing raw command-line arguments into a set - of options and values using GNU and POSIX style options. + Library for defining parsers for parsing raw command-line arguments into a set + of options and values using GNU and POSIX style options. repository: https://github.com/dart-lang/args topics: - cli environment: - sdk: '>=2.18.0 <3.0.0' + sdk: '>=2.18.0 <4.0.0' dev_dependencies: - lints: ^2.0.0 + dart_flutter_team_lints: ^1.0.0 test: ^1.16.0 diff --git a/test/args_test.dart b/test/args_test.dart index 04bbc47..08c14b3 100644 --- a/test/args_test.dart +++ b/test/args_test.dart @@ -2,6 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +// ignore_for_file: deprecated_member_use_from_same_package + import 'package:args/args.dart'; import 'package:test/test.dart'; diff --git a/test/command_parse_test.dart b/test/command_parse_test.dart index b6437c1..b3eca7f 100644 --- a/test/command_parse_test.dart +++ b/test/command_parse_test.dart @@ -2,6 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +// ignore_for_file: deprecated_member_use_from_same_package + import 'package:args/args.dart'; import 'package:test/test.dart'; diff --git a/test/command_runner_test.dart b/test/command_runner_test.dart index 9031dd1..e275066 100644 --- a/test/command_runner_test.dart +++ b/test/command_runner_test.dart @@ -2,6 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +// ignore_for_file: deprecated_member_use_from_same_package + import 'package:args/command_runner.dart'; import 'package:test/test.dart'; @@ -755,5 +757,5 @@ class _MandatoryOptionCommand extends Command { String get name => 'mandatory-option-command'; @override - String run() => argResults!['mandatory-option']; + String run() => argResults['mandatory-option'] as String; } diff --git a/test/parse_test.dart b/test/parse_test.dart index 318d2b5..8acffb0 100644 --- a/test/parse_test.dart +++ b/test/parse_test.dart @@ -2,6 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +// ignore_for_file: deprecated_member_use_from_same_package + import 'package:args/args.dart'; import 'package:test/test.dart'; @@ -83,6 +85,79 @@ void main() { var results = parser.parse(['--no-b']); expect(results['a'], isFalse); }); + + test('throws if requested as a multi-option', () { + var parser = ArgParser(); + parser.addFlag('a', defaultsTo: true); + var results = parser.parse(['--a']); + throwsIllegalArg(() => results.getMultiOption('a')); + }); + }); + + group('getFlag', () { + test('are true if present', () { + var parser = ArgParser(); + parser.addFlag('verbose'); + + var args = parser.parse(['--verbose']); + expect(args.getFlag('verbose'), isTrue); + }); + + test('default if missing', () { + var parser = ArgParser(); + parser.addFlag('a', defaultsTo: true); + parser.addFlag('b', defaultsTo: false); + + var args = parser.parse([]); + expect(args.getFlag('a'), isTrue); + expect(args.getFlag('b'), isFalse); + }); + + test('are false if missing with no default', () { + var parser = ArgParser(); + parser.addFlag('verbose'); + + var args = parser.parse([]); + expect(args.getFlag('verbose'), isFalse); + }); + + test('are case-sensitive', () { + var parser = ArgParser(); + parser.addFlag('verbose'); + parser.addFlag('Verbose'); + var results = parser.parse(['--verbose']); + expect(results.getFlag('verbose'), isTrue); + expect(results.getFlag('Verbose'), isFalse); + }); + + test('match letters, numbers, hyphens and underscores', () { + var parser = ArgParser(); + var allCharacters = + 'abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789'; + parser.addFlag(allCharacters); + var results = parser.parse(['--$allCharacters']); + expect(results.getFlag(allCharacters), isTrue); + }); + + test('can match by alias', () { + var parser = ArgParser()..addFlag('a', aliases: ['b']); + var results = parser.parse(['--b']); + expect(results.getFlag('a'), isTrue); + }); + + test('can be negated by alias', () { + var parser = ArgParser() + ..addFlag('a', aliases: ['b'], defaultsTo: true, negatable: true); + var results = parser.parse(['--no-b']); + expect(results.getFlag('a'), isFalse); + }); + + test('throws if requested as a multi-option', () { + var parser = ArgParser(); + parser.addFlag('a', defaultsTo: true); + var results = parser.parse(['--a']); + throwsIllegalArg(() => results.getMultiOption('a')); + }); }); group('flags negated with "no-"', () { @@ -475,6 +550,13 @@ void main() { expect(args['define'], equals('2')); }); + test('throws if requested as a multi-option', () { + var parser = ArgParser(); + parser.addOption('a', defaultsTo: 'b'); + var results = parser.parse(['--a=c']); + throwsIllegalArg(() => results.getMultiOption('a')); + }); + group('returns a List', () { test('with addMultiOption', () { var parser = ArgParser(); @@ -545,6 +627,111 @@ void main() { }); }); + group('getOption', () { + test('are parsed if present', () { + var parser = ArgParser(); + parser.addOption('mode'); + var args = parser.parse(['--mode=release']); + expect(args.getOption('mode'), equals('release')); + }); + + test('are null if not present', () { + var parser = ArgParser(); + parser.addOption('mode'); + var args = parser.parse([]); + expect(args.getOption('mode'), isNull); + }); + + test('default if missing', () { + var parser = ArgParser(); + parser.addOption('mode', defaultsTo: 'debug'); + var args = parser.parse([]); + expect(args.getOption('mode'), equals('debug')); + }); + + test('allow the value to be separated by whitespace', () { + var parser = ArgParser(); + parser.addOption('mode'); + var args = parser.parse(['--mode', 'release']); + expect(args.getOption('mode'), equals('release')); + }); + + test('do not throw if the value is in the allowed set', () { + var parser = ArgParser(); + parser.addOption('mode', allowed: ['debug', 'release']); + var args = parser.parse(['--mode=debug']); + expect(args.getOption('mode'), equals('debug')); + }); + + test('do not throw if there is no allowed set with allowedHelp', () { + var parser = ArgParser(); + parser.addOption('mode', allowedHelp: { + 'debug': 'During development.', + 'release': 'For customers.' + }); + var args = parser.parse(['--mode=profile']); + expect(args.getOption('mode'), equals('profile')); + }); + + test('returns last provided value', () { + var parser = ArgParser(); + parser.addOption('define'); + var args = parser.parse(['--define=1', '--define=2']); + expect(args.getOption('define'), equals('2')); + }); + + test('throws if requested as a multi-option', () { + var parser = ArgParser(); + parser.addOption('a', defaultsTo: 'b'); + var results = parser.parse(['--a=c']); + throwsIllegalArg(() => results.getMultiOption('a')); + }); + + group('returns a List', () { + test('with addMultiOption', () { + var parser = ArgParser(); + parser.addMultiOption('define'); + var args = parser.parse(['--define=1']); + expect(args.getMultiOption('define'), equals(['1'])); + args = parser.parse(['--define=1', '--define=2']); + expect(args.getMultiOption('define'), equals(['1', '2'])); + }); + }); + + group('returns the default value if not explicitly set', () { + test('with addMultiOption', () { + var parser = ArgParser(); + parser.addMultiOption('define', defaultsTo: ['0']); + var args = parser.parse(['']); + expect(args.getMultiOption('define'), equals(['0'])); + }); + }); + + test('are case-sensitive', () { + var parser = ArgParser(); + parser.addOption('verbose', defaultsTo: 'no'); + parser.addOption('Verbose', defaultsTo: 'no'); + var results = parser.parse(['--verbose', 'chatty']); + expect(results.getOption('verbose'), equals('chatty')); + expect(results.getOption('Verbose'), equals('no')); + }); + + test('can be set by alias', () { + var parser = ArgParser()..addOption('a', aliases: ['b']); + var results = parser.parse(['--b=1']); + expect(results.getOption('a'), '1'); + }); + + group('mandatory', () { + test('parse successfully', () { + var parser = ArgParser(); + parser.addOption('test', mandatory: true); + var results = parser.parse(['--test', 'test']); + expect(results.getOption('test'), equals('test')); + }); + }); + }); + group('remaining args', () { test('stops parsing args when a non-option-like arg is encountered', () { var parser = ArgParser(); diff --git a/test/trailing_options_test.dart b/test/trailing_options_test.dart index 505b6b1..4b3412d 100644 --- a/test/trailing_options_test.dart +++ b/test/trailing_options_test.dart @@ -2,6 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +// ignore_for_file: deprecated_member_use_from_same_package + import 'package:args/args.dart'; import 'package:test/test.dart'; From 493b82f5725ea4b619a0e2a78444265050a02f3f Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Wed, 31 May 2023 16:20:51 -0700 Subject: [PATCH 2/8] rename methods --- CHANGELOG.md | 1 - analysis_options.yaml | 12 ++++++- example/command_runner/draw.dart | 18 +++++----- lib/command_runner.dart | 4 +-- lib/src/arg_results.dart | 7 ++-- pubspec.yaml | 2 +- test/args_test.dart | 2 -- test/command_parse_test.dart | 2 -- test/command_runner_test.dart | 2 -- test/parse_test.dart | 56 +++++++++++++++----------------- test/trailing_options_test.dart | 2 -- 11 files changed, 53 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c93d163..9c15411 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,6 @@ * Introduce new typed `ArgResults.getFlag`, `ArgResults.getOption`, and `ArgResults.getMultiOption` methods. -* Deprecate the untyped `ArgResults` `dynamic operator [](String)` method. ## 2.4.2 diff --git a/analysis_options.yaml b/analysis_options.yaml index 7c2b0f2..a9dbdb5 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,17 +1,27 @@ # https://dart.dev/guides/language/analysis-options -include: package:dart_flutter_team_lints/analysis_options.yaml +include: package:lints/recommended.yaml linter: rules: + - always_declare_return_types + - avoid_dynamic_calls - avoid_unused_constructor_parameters - cancel_subscriptions - comment_references + - directives_ordering + - lines_longer_than_80_chars - literal_only_boolean_expressions - missing_whitespace_between_adjacent_strings - no_adjacent_strings_in_list - no_runtimeType_toString + - omit_local_variable_types - package_api_docs - prefer_relative_imports + - prefer_single_quotes - test_types_in_equals + - throw_in_finally + - type_annotate_public_apis + - unawaited_futures - unnecessary_await_in_return + - unnecessary_lambdas - use_super_parameters diff --git a/example/command_runner/draw.dart b/example/command_runner/draw.dart index 5ff9a2d..cf40842 100644 --- a/example/command_runner/draw.dart +++ b/example/command_runner/draw.dart @@ -33,8 +33,8 @@ class SquareCommand extends Command { @override FutureOr? run() { - final size = int.parse(argResults.getOption('size') ?? '20'); - final char = globalResults?.getOption('char')?[0] ?? '#'; + final size = int.parse(argResults.option('size') ?? '20'); + final char = globalResults?.option('char')?[0] ?? '#'; return draw(size, size, char, (x, y) => true); } } @@ -55,8 +55,8 @@ class CircleCommand extends Command { @override FutureOr? run() { - final size = 2 * int.parse(argResults.getOption('radius') ?? '10'); - final char = globalResults?.getOption('char')?[0] ?? '#'; + final size = 2 * int.parse(argResults.option('radius') ?? '10'); + final char = globalResults?.option('char')?[0] ?? '#'; return draw(size, size, char, (x, y) => x * x + y * y < 1); } } @@ -93,8 +93,8 @@ class EquilateralTriangleCommand extends Command { @override FutureOr? run() { - final size = int.parse(argResults.getOption('size') ?? '20'); - final char = globalResults?.getOption('char')?[0] ?? '#'; + final size = int.parse(argResults.option('size') ?? '20'); + final char = globalResults?.option('char')?[0] ?? '#'; return drawTriangle(size, size * sqrt(3) ~/ 2, char); } } @@ -116,9 +116,9 @@ class IsoscelesTriangleCommand extends Command { @override FutureOr? run() { - final width = int.parse(argResults.getOption('width') ?? '50'); - final height = int.parse(argResults.getOption('height') ?? '10'); - final char = globalResults?.getOption('char')?[0] ?? '#'; + final width = int.parse(argResults.option('width') ?? '50'); + final height = int.parse(argResults.option('height') ?? '10'); + final char = globalResults?.option('char')?[0] ?? '#'; return drawTriangle(width, height, char); } } diff --git a/lib/command_runner.dart b/lib/command_runner.dart index d45fec6..0dc9636 100644 --- a/lib/command_runner.dart +++ b/lib/command_runner.dart @@ -192,13 +192,13 @@ class CommandRunner { commands = command._subcommands as Map>; commandString += ' ${argResults.name}'; - if (argResults.options.contains('help') && argResults.getFlag('help')) { + if (argResults.options.contains('help') && argResults.flag('help')) { command.printUsage(); return null; } } - if (topLevelResults.getFlag('help')) { + if (topLevelResults.flag('help')) { command!.printUsage(); return null; } diff --git a/lib/src/arg_results.dart b/lib/src/arg_results.dart index 1fbcd73..c95eacb 100644 --- a/lib/src/arg_results.dart +++ b/lib/src/arg_results.dart @@ -60,7 +60,6 @@ class ArgResults { /// Returns the parsed or default command-line option named [name]. /// /// [name] must be a valid option name in the parser. - @Deprecated('Prefer the getFlag, getOption, and getMultiOption methods') dynamic operator [](String name) { if (!_parser.options.containsKey(name)) { throw ArgumentError('Could not find an option named "$name".'); @@ -77,7 +76,7 @@ class ArgResults { /// Returns the parsed or default command-line flag named [name]. /// /// [name] must be a valid flag name in the parser. - bool getFlag(String name) { + bool flag(String name) { if (!_parser.options.containsKey(name)) { throw ArgumentError('Could not find an option named "$name".'); } @@ -92,7 +91,7 @@ class ArgResults { /// Returns the parsed or default command-line option named [name]. /// /// [name] must be a valid option name in the parser. - String? getOption(String name) { + String? option(String name) { if (!_parser.options.containsKey(name)) { throw ArgumentError('Could not find an option named "$name".'); } @@ -107,7 +106,7 @@ class ArgResults { /// Returns the list of parsed (or default) command-line options for [name]. /// /// [name] must be a valid option name in the parser. - List getMultiOption(String name) { + List multiOption(String name) { if (!_parser.options.containsKey(name)) { throw ArgumentError('Could not find an option named "$name".'); } diff --git a/pubspec.yaml b/pubspec.yaml index 807db2d..373bd31 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,5 +12,5 @@ environment: sdk: '>=2.18.0 <4.0.0' dev_dependencies: - dart_flutter_team_lints: ^1.0.0 + lints: ^2.0.0 test: ^1.16.0 diff --git a/test/args_test.dart b/test/args_test.dart index 08c14b3..04bbc47 100644 --- a/test/args_test.dart +++ b/test/args_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -// ignore_for_file: deprecated_member_use_from_same_package - import 'package:args/args.dart'; import 'package:test/test.dart'; diff --git a/test/command_parse_test.dart b/test/command_parse_test.dart index b3eca7f..b6437c1 100644 --- a/test/command_parse_test.dart +++ b/test/command_parse_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -// ignore_for_file: deprecated_member_use_from_same_package - import 'package:args/args.dart'; import 'package:test/test.dart'; diff --git a/test/command_runner_test.dart b/test/command_runner_test.dart index e275066..2079377 100644 --- a/test/command_runner_test.dart +++ b/test/command_runner_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -// ignore_for_file: deprecated_member_use_from_same_package - import 'package:args/command_runner.dart'; import 'package:test/test.dart'; diff --git a/test/parse_test.dart b/test/parse_test.dart index 8acffb0..5a45a72 100644 --- a/test/parse_test.dart +++ b/test/parse_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -// ignore_for_file: deprecated_member_use_from_same_package - import 'package:args/args.dart'; import 'package:test/test.dart'; @@ -90,7 +88,7 @@ void main() { var parser = ArgParser(); parser.addFlag('a', defaultsTo: true); var results = parser.parse(['--a']); - throwsIllegalArg(() => results.getMultiOption('a')); + throwsIllegalArg(() => results.multiOption('a')); }); }); @@ -100,7 +98,7 @@ void main() { parser.addFlag('verbose'); var args = parser.parse(['--verbose']); - expect(args.getFlag('verbose'), isTrue); + expect(args.flag('verbose'), isTrue); }); test('default if missing', () { @@ -109,8 +107,8 @@ void main() { parser.addFlag('b', defaultsTo: false); var args = parser.parse([]); - expect(args.getFlag('a'), isTrue); - expect(args.getFlag('b'), isFalse); + expect(args.flag('a'), isTrue); + expect(args.flag('b'), isFalse); }); test('are false if missing with no default', () { @@ -118,7 +116,7 @@ void main() { parser.addFlag('verbose'); var args = parser.parse([]); - expect(args.getFlag('verbose'), isFalse); + expect(args.flag('verbose'), isFalse); }); test('are case-sensitive', () { @@ -126,8 +124,8 @@ void main() { parser.addFlag('verbose'); parser.addFlag('Verbose'); var results = parser.parse(['--verbose']); - expect(results.getFlag('verbose'), isTrue); - expect(results.getFlag('Verbose'), isFalse); + expect(results.flag('verbose'), isTrue); + expect(results.flag('Verbose'), isFalse); }); test('match letters, numbers, hyphens and underscores', () { @@ -136,27 +134,27 @@ void main() { 'abcdefghijklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789'; parser.addFlag(allCharacters); var results = parser.parse(['--$allCharacters']); - expect(results.getFlag(allCharacters), isTrue); + expect(results.flag(allCharacters), isTrue); }); test('can match by alias', () { var parser = ArgParser()..addFlag('a', aliases: ['b']); var results = parser.parse(['--b']); - expect(results.getFlag('a'), isTrue); + expect(results.flag('a'), isTrue); }); test('can be negated by alias', () { var parser = ArgParser() ..addFlag('a', aliases: ['b'], defaultsTo: true, negatable: true); var results = parser.parse(['--no-b']); - expect(results.getFlag('a'), isFalse); + expect(results.flag('a'), isFalse); }); test('throws if requested as a multi-option', () { var parser = ArgParser(); parser.addFlag('a', defaultsTo: true); var results = parser.parse(['--a']); - throwsIllegalArg(() => results.getMultiOption('a')); + throwsIllegalArg(() => results.multiOption('a')); }); }); @@ -554,7 +552,7 @@ void main() { var parser = ArgParser(); parser.addOption('a', defaultsTo: 'b'); var results = parser.parse(['--a=c']); - throwsIllegalArg(() => results.getMultiOption('a')); + throwsIllegalArg(() => results.multiOption('a')); }); group('returns a List', () { @@ -632,35 +630,35 @@ void main() { var parser = ArgParser(); parser.addOption('mode'); var args = parser.parse(['--mode=release']); - expect(args.getOption('mode'), equals('release')); + expect(args.option('mode'), equals('release')); }); test('are null if not present', () { var parser = ArgParser(); parser.addOption('mode'); var args = parser.parse([]); - expect(args.getOption('mode'), isNull); + expect(args.option('mode'), isNull); }); test('default if missing', () { var parser = ArgParser(); parser.addOption('mode', defaultsTo: 'debug'); var args = parser.parse([]); - expect(args.getOption('mode'), equals('debug')); + expect(args.option('mode'), equals('debug')); }); test('allow the value to be separated by whitespace', () { var parser = ArgParser(); parser.addOption('mode'); var args = parser.parse(['--mode', 'release']); - expect(args.getOption('mode'), equals('release')); + expect(args.option('mode'), equals('release')); }); test('do not throw if the value is in the allowed set', () { var parser = ArgParser(); parser.addOption('mode', allowed: ['debug', 'release']); var args = parser.parse(['--mode=debug']); - expect(args.getOption('mode'), equals('debug')); + expect(args.option('mode'), equals('debug')); }); test('do not throw if there is no allowed set with allowedHelp', () { @@ -670,21 +668,21 @@ void main() { 'release': 'For customers.' }); var args = parser.parse(['--mode=profile']); - expect(args.getOption('mode'), equals('profile')); + expect(args.option('mode'), equals('profile')); }); test('returns last provided value', () { var parser = ArgParser(); parser.addOption('define'); var args = parser.parse(['--define=1', '--define=2']); - expect(args.getOption('define'), equals('2')); + expect(args.option('define'), equals('2')); }); test('throws if requested as a multi-option', () { var parser = ArgParser(); parser.addOption('a', defaultsTo: 'b'); var results = parser.parse(['--a=c']); - throwsIllegalArg(() => results.getMultiOption('a')); + throwsIllegalArg(() => results.multiOption('a')); }); group('returns a List', () { @@ -692,9 +690,9 @@ void main() { var parser = ArgParser(); parser.addMultiOption('define'); var args = parser.parse(['--define=1']); - expect(args.getMultiOption('define'), equals(['1'])); + expect(args.multiOption('define'), equals(['1'])); args = parser.parse(['--define=1', '--define=2']); - expect(args.getMultiOption('define'), equals(['1', '2'])); + expect(args.multiOption('define'), equals(['1', '2'])); }); }); @@ -703,7 +701,7 @@ void main() { var parser = ArgParser(); parser.addMultiOption('define', defaultsTo: ['0']); var args = parser.parse(['']); - expect(args.getMultiOption('define'), equals(['0'])); + expect(args.multiOption('define'), equals(['0'])); }); }); @@ -712,14 +710,14 @@ void main() { parser.addOption('verbose', defaultsTo: 'no'); parser.addOption('Verbose', defaultsTo: 'no'); var results = parser.parse(['--verbose', 'chatty']); - expect(results.getOption('verbose'), equals('chatty')); - expect(results.getOption('Verbose'), equals('no')); + expect(results.option('verbose'), equals('chatty')); + expect(results.option('Verbose'), equals('no')); }); test('can be set by alias', () { var parser = ArgParser()..addOption('a', aliases: ['b']); var results = parser.parse(['--b=1']); - expect(results.getOption('a'), '1'); + expect(results.option('a'), '1'); }); group('mandatory', () { @@ -727,7 +725,7 @@ void main() { var parser = ArgParser(); parser.addOption('test', mandatory: true); var results = parser.parse(['--test', 'test']); - expect(results.getOption('test'), equals('test')); + expect(results.option('test'), equals('test')); }); }); }); diff --git a/test/trailing_options_test.dart b/test/trailing_options_test.dart index 4b3412d..505b6b1 100644 --- a/test/trailing_options_test.dart +++ b/test/trailing_options_test.dart @@ -2,8 +2,6 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -// ignore_for_file: deprecated_member_use_from_same_package - import 'package:args/args.dart'; import 'package:test/test.dart'; From b6f0561bca53f1b7509f1ba80b8b09de2dfc6dbf Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Wed, 31 May 2023 17:13:08 -0700 Subject: [PATCH 3/8] updates --- CHANGELOG.md | 4 ++-- README.md | 12 ++++++------ lib/src/arg_results.dart | 4 ++-- pubspec.yaml | 2 +- test/parse_test.dart | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c15411..955d6c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ## 2.5.0-wip -* Introduce new typed `ArgResults.getFlag`, `ArgResults.getOption`, and - `ArgResults.getMultiOption` methods. +* Introduce new typed `ArgResults` `flag(String)`, `option(String)`, and + `multiOption(String)` methods. ## 2.4.2 diff --git a/README.md b/README.md index e756d66..65cab6c 100644 --- a/README.md +++ b/README.md @@ -111,8 +111,8 @@ parser.addOption('mode'); parser.addFlag('verbose', defaultsTo: true); var results = parser.parse(['--mode', 'debug', 'something', 'else']); -print(results.getOption('mode')); // debug -print(results.getFlag('verbose')); // true +print(results.option('mode')); // debug +print(results.flag('verbose')); // true ``` By default, the `parse()` method allows additional flags and options to be @@ -187,7 +187,7 @@ overriding earlier ones; for example: var parser = ArgParser(); parser.addOption('mode'); var results = parser.parse(['--mode', 'on', '--mode', 'off']); -print(results.getOption('mode')); // prints 'off' +print(results.option('mode')); // prints 'off' ``` Multiple values can be parsed with `addMultiOption()`. With this method, an @@ -198,7 +198,7 @@ values: var parser = ArgParser(); parser.addMultiOption('mode'); var results = parser.parse(['--mode', 'on', '--mode', 'off']); -print(results.getMultiOption('mode')); // prints '[on, off]' +print(results.multiOption('mode')); // prints '[on, off]' ``` By default, values for a multi-valued option may also be separated with commas: @@ -207,7 +207,7 @@ By default, values for a multi-valued option may also be separated with commas: var parser = ArgParser(); parser.addMultiOption('mode'); var results = parser.parse(['--mode', 'on,off']); -print(results.getMultiOption('mode')); // prints '[on, off]' +print(results.multiOption('mode')); // prints '[on, off]' ``` This can be disabled by passing `splitCommas: false`. @@ -325,7 +325,7 @@ class CommitCommand extends Command { void run() { // [argResults] is set before [run()] is called and contains the flags/options // passed to this command. - print(argResults.getFlag('all')); + print(argResults.flag('all')); } } ``` diff --git a/lib/src/arg_results.dart b/lib/src/arg_results.dart index c95eacb..4477272 100644 --- a/lib/src/arg_results.dart +++ b/lib/src/arg_results.dart @@ -122,7 +122,7 @@ class ArgResults { /// /// Includes the options whose values were parsed or that have defaults. /// Options that weren't present and have no default are omitted. - List get options { + Iterable get options { var result = _parsed.keys.toSet(); // Include the options that have defaults. @@ -130,7 +130,7 @@ class ArgResults { if (option.defaultsTo != null) result.add(name); }); - return result.toList(); + return result; } /// Returns `true` if the option with [name] was parsed from an actual diff --git a/pubspec.yaml b/pubspec.yaml index 373bd31..bdc13d8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,7 +9,7 @@ topics: - cli environment: - sdk: '>=2.18.0 <4.0.0' + sdk: '>=2.18.0 <3.0.0' dev_dependencies: lints: ^2.0.0 diff --git a/test/parse_test.dart b/test/parse_test.dart index 5a45a72..0bdcc52 100644 --- a/test/parse_test.dart +++ b/test/parse_test.dart @@ -92,7 +92,7 @@ void main() { }); }); - group('getFlag', () { + group('flag', () { test('are true if present', () { var parser = ArgParser(); parser.addFlag('verbose'); @@ -625,7 +625,7 @@ void main() { }); }); - group('getOption', () { + group('option', () { test('are parsed if present', () { var parser = ArgParser(); parser.addOption('mode'); From dcd993d7cb791572d2ec6a9a17ad9ac0d1bbe94e Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Tue, 12 Mar 2024 14:28:00 -0700 Subject: [PATCH 4/8] review feedback --- example/command_runner/draw.dart | 10 +++++----- lib/command_runner.dart | 2 +- lib/src/arg_results.dart | 17 +++++++---------- lib/src/help_command.dart | 4 ++-- test/command_runner_test.dart | 2 +- 5 files changed, 16 insertions(+), 19 deletions(-) diff --git a/example/command_runner/draw.dart b/example/command_runner/draw.dart index cf40842..37aedf0 100644 --- a/example/command_runner/draw.dart +++ b/example/command_runner/draw.dart @@ -33,7 +33,7 @@ class SquareCommand extends Command { @override FutureOr? run() { - final size = int.parse(argResults.option('size') ?? '20'); + final size = int.parse(argResults!.option('size') ?? '20'); final char = globalResults?.option('char')?[0] ?? '#'; return draw(size, size, char, (x, y) => true); } @@ -55,7 +55,7 @@ class CircleCommand extends Command { @override FutureOr? run() { - final size = 2 * int.parse(argResults.option('radius') ?? '10'); + final size = 2 * int.parse(argResults!.option('radius') ?? '10'); final char = globalResults?.option('char')?[0] ?? '#'; return draw(size, size, char, (x, y) => x * x + y * y < 1); } @@ -93,7 +93,7 @@ class EquilateralTriangleCommand extends Command { @override FutureOr? run() { - final size = int.parse(argResults.option('size') ?? '20'); + final size = int.parse(argResults!.option('size') ?? '20'); final char = globalResults?.option('char')?[0] ?? '#'; return drawTriangle(size, size * sqrt(3) ~/ 2, char); } @@ -116,8 +116,8 @@ class IsoscelesTriangleCommand extends Command { @override FutureOr? run() { - final width = int.parse(argResults.option('width') ?? '50'); - final height = int.parse(argResults.option('height') ?? '10'); + final width = int.parse(argResults!.option('width') ?? '50'); + final height = int.parse(argResults!.option('height') ?? '10'); final char = globalResults?.option('char')?[0] ?? '#'; return drawTriangle(width, height, char); } diff --git a/lib/command_runner.dart b/lib/command_runner.dart index 0dc9636..efd95ca 100644 --- a/lib/command_runner.dart +++ b/lib/command_runner.dart @@ -320,7 +320,7 @@ abstract class Command { /// The parsed argument results for this command. /// /// This will be `null` until just before [Command.run] is called. - ArgResults get argResults => _argResults!; + ArgResults? get argResults => _argResults; ArgResults? _argResults; /// The argument parser for this command. diff --git a/lib/src/arg_results.dart b/lib/src/arg_results.dart index 4477272..26f9140 100644 --- a/lib/src/arg_results.dart +++ b/lib/src/arg_results.dart @@ -77,11 +77,10 @@ class ArgResults { /// /// [name] must be a valid flag name in the parser. bool flag(String name) { - if (!_parser.options.containsKey(name)) { + var option = _parser.options[name]; + if (option == null) { throw ArgumentError('Could not find an option named "$name".'); } - - var option = _parser.options[name]!; if (!option.isFlag) { throw ArgumentError('"$name" is not a flag.'); } @@ -92,13 +91,12 @@ class ArgResults { /// /// [name] must be a valid option name in the parser. String? option(String name) { - if (!_parser.options.containsKey(name)) { + var option = _parser.options[name]; + if (option == null) { throw ArgumentError('Could not find an option named "$name".'); } - - var option = _parser.options[name]!; if (!option.isSingle) { - throw ArgumentError('"$name" is not an option.'); + throw ArgumentError('"$name" is a multi-option.'); } return option.valueOrDefault(_parsed[name]) as String?; } @@ -107,11 +105,10 @@ class ArgResults { /// /// [name] must be a valid option name in the parser. List multiOption(String name) { - if (!_parser.options.containsKey(name)) { + var option = _parser.options[name]; + if (option == null) { throw ArgumentError('Could not find an option named "$name".'); } - - var option = _parser.options[name]!; if (!option.isMultiple) { throw ArgumentError('"$name" is not a multi-option.'); } diff --git a/lib/src/help_command.dart b/lib/src/help_command.dart index 08fbad6..f04d014 100644 --- a/lib/src/help_command.dart +++ b/lib/src/help_command.dart @@ -24,7 +24,7 @@ class HelpCommand extends Command { @override Null run() { // Show the default help if no command was specified. - if (argResults.rest.isEmpty) { + if (argResults!.rest.isEmpty) { runner!.printUsage(); return; } @@ -35,7 +35,7 @@ class HelpCommand extends Command { Command? command; var commandString = runner!.executableName; - for (var name in argResults.rest) { + for (var name in argResults!.rest) { if (commands.isEmpty) { command!.usageException( 'Command "$commandString" does not expect a subcommand.'); diff --git a/test/command_runner_test.dart b/test/command_runner_test.dart index 2079377..cc80c6b 100644 --- a/test/command_runner_test.dart +++ b/test/command_runner_test.dart @@ -755,5 +755,5 @@ class _MandatoryOptionCommand extends Command { String get name => 'mandatory-option-command'; @override - String run() => argResults['mandatory-option'] as String; + String run() => argResults!['mandatory-option'] as String; } From 04d42b15878b1cfef2756c65fa19fd461d5771dc Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Tue, 12 Mar 2024 14:30:23 -0700 Subject: [PATCH 5/8] reduce PR diffs --- example/command_runner/draw.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/command_runner/draw.dart b/example/command_runner/draw.dart index 37aedf0..8261a03 100644 --- a/example/command_runner/draw.dart +++ b/example/command_runner/draw.dart @@ -33,7 +33,7 @@ class SquareCommand extends Command { @override FutureOr? run() { - final size = int.parse(argResults!.option('size') ?? '20'); + final size = int.parse(argResults?.option('size') ?? '20'); final char = globalResults?.option('char')?[0] ?? '#'; return draw(size, size, char, (x, y) => true); } @@ -55,7 +55,7 @@ class CircleCommand extends Command { @override FutureOr? run() { - final size = 2 * int.parse(argResults!.option('radius') ?? '10'); + final size = 2 * int.parse(argResults?.option('radius') ?? '10'); final char = globalResults?.option('char')?[0] ?? '#'; return draw(size, size, char, (x, y) => x * x + y * y < 1); } @@ -93,7 +93,7 @@ class EquilateralTriangleCommand extends Command { @override FutureOr? run() { - final size = int.parse(argResults!.option('size') ?? '20'); + final size = int.parse(argResults?.option('size') ?? '20'); final char = globalResults?.option('char')?[0] ?? '#'; return drawTriangle(size, size * sqrt(3) ~/ 2, char); } @@ -116,7 +116,7 @@ class IsoscelesTriangleCommand extends Command { @override FutureOr? run() { - final width = int.parse(argResults!.option('width') ?? '50'); + final width = int.parse(argResults?.option('width') ?? '50'); final height = int.parse(argResults!.option('height') ?? '10'); final char = globalResults?.option('char')?[0] ?? '#'; return drawTriangle(width, height, char); From 4b5737f184bd434eef89e508777bb64b8f8693d5 Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Tue, 12 Mar 2024 14:31:13 -0700 Subject: [PATCH 6/8] reduce PR diffs --- example/command_runner/draw.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/command_runner/draw.dart b/example/command_runner/draw.dart index 8261a03..018bf59 100644 --- a/example/command_runner/draw.dart +++ b/example/command_runner/draw.dart @@ -117,7 +117,7 @@ class IsoscelesTriangleCommand extends Command { @override FutureOr? run() { final width = int.parse(argResults?.option('width') ?? '50'); - final height = int.parse(argResults!.option('height') ?? '10'); + final height = int.parse(argResults?.option('height') ?? '10'); final char = globalResults?.option('char')?[0] ?? '#'; return drawTriangle(width, height, char); } From dee26685af54a48cff16398098ac6cb0cb86673b Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Thu, 14 Mar 2024 15:37:00 -0700 Subject: [PATCH 7/8] review feedback --- lib/src/arg_results.dart | 4 ++++ test/parse_test.dart | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/src/arg_results.dart b/lib/src/arg_results.dart index 26f9140..e1e3044 100644 --- a/lib/src/arg_results.dart +++ b/lib/src/arg_results.dart @@ -60,6 +60,10 @@ class ArgResults { /// Returns the parsed or default command-line option named [name]. /// /// [name] must be a valid option name in the parser. + /// + /// > [!Note] + /// > Callers should prefer using the most strongly typed methods - [flag] for + /// > flags, [option] for options, and [multiOption] for multi-options. dynamic operator [](String name) { if (!_parser.options.containsKey(name)) { throw ArgumentError('Could not find an option named "$name".'); diff --git a/test/parse_test.dart b/test/parse_test.dart index 0bdcc52..9276fc4 100644 --- a/test/parse_test.dart +++ b/test/parse_test.dart @@ -92,8 +92,8 @@ void main() { }); }); - group('flag', () { - test('are true if present', () { + group('flag()', () { + test('returns true if present', () { var parser = ArgParser(); parser.addFlag('verbose'); @@ -101,7 +101,7 @@ void main() { expect(args.flag('verbose'), isTrue); }); - test('default if missing', () { + test('returns default if missing', () { var parser = ArgParser(); parser.addFlag('a', defaultsTo: true); parser.addFlag('b', defaultsTo: false); @@ -548,7 +548,7 @@ void main() { expect(args['define'], equals('2')); }); - test('throws if requested as a multi-option', () { + test('throw if requested as a multi-option', () { var parser = ArgParser(); parser.addOption('a', defaultsTo: 'b'); var results = parser.parse(['--a=c']); @@ -625,7 +625,7 @@ void main() { }); }); - group('option', () { + group('option()', () { test('are parsed if present', () { var parser = ArgParser(); parser.addOption('mode'); @@ -678,7 +678,7 @@ void main() { expect(args.option('define'), equals('2')); }); - test('throws if requested as a multi-option', () { + test('throw if requested as a multi-option', () { var parser = ArgParser(); parser.addOption('a', defaultsTo: 'b'); var results = parser.parse(['--a=c']); From 8befc1c6ef87ea5923d939f937c8af4596a738cf Mon Sep 17 00:00:00 2001 From: Devon Carew Date: Thu, 14 Mar 2024 18:51:35 -0700 Subject: [PATCH 8/8] Update arg_results.dart --- lib/src/arg_results.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/arg_results.dart b/lib/src/arg_results.dart index e1e3044..9fa87cd 100644 --- a/lib/src/arg_results.dart +++ b/lib/src/arg_results.dart @@ -62,7 +62,7 @@ class ArgResults { /// [name] must be a valid option name in the parser. /// /// > [!Note] - /// > Callers should prefer using the most strongly typed methods - [flag] for + /// > Callers should prefer using the more strongly typed methods - [flag] for /// > flags, [option] for options, and [multiOption] for multi-options. dynamic operator [](String name) { if (!_parser.options.containsKey(name)) {