diff --git a/pkgs/args/lib/src/parser.dart b/pkgs/args/lib/src/parser.dart index 660e56de..0e344af1 100644 --- a/pkgs/args/lib/src/parser.dart +++ b/pkgs/args/lib/src/parser.dart @@ -207,6 +207,11 @@ class Parser { // The first character is a non-flag option, so the rest must be the // value. var value = '${lettersAndDigits.substring(1)}$rest'; + // If the value starts with '=' (like in -o=value), strip it to match + // the behavior of long options (--option=value). + if (value.startsWith('=')) { + value = value.substring(1); + } _setOption(_results, first, value, '-$c'); } else { // If we got some non-flag characters, then it must be a value, but diff --git a/pkgs/args/test/short_flag_equals_test.dart b/pkgs/args/test/short_flag_equals_test.dart new file mode 100644 index 00000000..a5e912f8 --- /dev/null +++ b/pkgs/args/test/short_flag_equals_test.dart @@ -0,0 +1,64 @@ +import 'package:args/args.dart'; +import 'package:test/test.dart'; + +void main() { + group('Short flag with equals syntax', () { + test('should parse value correctly without including equals sign', () { + final parser = ArgParser(); + parser.addOption('option', abbr: 'o'); + + // Test long flag with equals + final result1 = parser.parse(['--option=value']); + expect(result1['option'], equals('value')); + + // Test short flag with equals - currently fails + final result2 = parser.parse(['-o=value']); + expect(result2['option'], equals('value')); // Currently gets '=value' + + // Test short flag with space (this works correctly) + final result3 = parser.parse(['-o', 'value']); + expect(result3['option'], equals('value')); + + // All three should produce the same result + expect(result1['option'], equals(result2['option'])); + expect(result2['option'], equals(result3['option'])); + }); + + test('should handle complex values with equals', () { + final parser = ArgParser(); + parser.addOption('config', abbr: 'c'); + + final result1 = parser.parse(['--config=key=value']); + final result2 = parser.parse(['-c=key=value']); + + expect(result1['config'], equals('key=value')); + expect(result2['config'], + equals('key=value')); // Currently gets '=key=value' + }); + + test('should handle empty value after equals', () { + final parser = ArgParser(); + parser.addOption('value', abbr: 'v'); + + final result1 = parser.parse(['--value=']); + final result2 = parser.parse(['-v=']); + + expect(result1['value'], equals('')); + expect(result2['value'], equals('')); // Currently gets '=' + }); + + test('should work with real-world example (bundle ID)', () { + final parser = ArgParser(); + parser.addOption('ios-bundle-id', abbr: 'i'); + + final bundleId = 'com.example.app'; + + final result1 = parser.parse(['--ios-bundle-id=$bundleId']); + final result2 = parser.parse(['-i=$bundleId']); + + expect(result1['ios-bundle-id'], equals(bundleId)); + expect(result2['ios-bundle-id'], + equals(bundleId)); // Currently gets '=com.example.app' + }); + }); +}