diff --git a/pkgs/args/CHANGELOG.md b/pkgs/args/CHANGELOG.md index f712877b..49829584 100644 --- a/pkgs/args/CHANGELOG.md +++ b/pkgs/args/CHANGELOG.md @@ -1,3 +1,8 @@ +## 3.0.0 + +* Breaking: ArgResults.operator[] and ArgResults.option now correctly throw + Exceptions rather than Errors when defined arguments are missing values. + ## 2.7.0 * Remove sorting of the `allowedHelp` argument in usage output. Ordering will diff --git a/pkgs/args/lib/src/arg_results.dart b/pkgs/args/lib/src/arg_results.dart index 240867f4..52313078 100644 --- a/pkgs/args/lib/src/arg_results.dart +++ b/pkgs/args/lib/src/arg_results.dart @@ -5,6 +5,7 @@ import 'dart:collection'; import 'arg_parser.dart'; +import 'arg_parser_exception.dart'; /// Creates a new [ArgResults]. /// @@ -71,7 +72,7 @@ class ArgResults { final option = _parser.options[name]!; if (option.mandatory && !_parsed.containsKey(name)) { - throw ArgumentError('Option $name is mandatory.'); + throw ArgParserException('Option $name is mandatory.'); } return option.valueOrDefault(_parsed[name]); @@ -103,7 +104,7 @@ class ArgResults { throw ArgumentError('"$name" is a multi-option.'); } if (option.mandatory && !_parsed.containsKey(name)) { - throw ArgumentError('Option $name is mandatory.'); + throw ArgParserException('Option $name is mandatory.'); } return option.valueOrDefault(_parsed[name]) as String?; } diff --git a/pkgs/args/test/command_runner_test.dart b/pkgs/args/test/command_runner_test.dart index b9fde8ae..3d9c7590 100644 --- a/pkgs/args/test/command_runner_test.dart +++ b/pkgs/args/test/command_runner_test.dart @@ -2,6 +2,7 @@ // 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. +import 'package:args/args.dart'; import 'package:args/command_runner.dart'; import 'package:test/test.dart'; @@ -736,7 +737,7 @@ Run "test help" to see global options.''')); runner.addCommand(subcommand); expect( () => runner.run([subcommand.name]), - throwsA(isA().having((e) => e.message, 'message', + throwsA(isA().having((e) => e.message, 'message', contains('Option mandatory-option is mandatory')))); expect(await runner.run([subcommand.name, '--mandatory-option', 'foo']), 'foo'); diff --git a/pkgs/args/test/parse_test.dart b/pkgs/args/test/parse_test.dart index eb2f3ae2..7b235fe9 100644 --- a/pkgs/args/test/parse_test.dart +++ b/pkgs/args/test/parse_test.dart @@ -595,7 +595,10 @@ void main() { var parser = ArgParser(); parser.addOption('username', mandatory: true); var results = parser.parse([]); - expect(() => results['username'], throwsA(isA())); + expect( + () => results['username'], + throwsA(isA().having((e) => e.message, + 'message', 'Option username is mandatory.'))); }); test('throw if no mandatory args', () { @@ -604,7 +607,10 @@ void main() { parser.addOption('username', mandatory: true); var results = parser.parse(['--test', 'test']); expect(results['test'], equals('test')); - expect(() => results['username'], throwsA(isA())); + expect( + () => results['username'], + throwsA(isA().having((e) => e.message, + 'message', 'Option username is mandatory.'))); }); test('parse successfully', () { @@ -620,8 +626,9 @@ void main() { parser.addOption('test', mandatory: true); var results = parser.parse(['-h']); expect(results['help'], true); - expect(() => results['test'], throwsA(isA())); - expect(() => results.option('test'), throwsA(isA())); + expect(() => results['test'], throwsA(isA())); + expect( + () => results.option('test'), throwsA(isA())); }); }); });