cmd-optparse.rb 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/.bundle/config +2 -0
  3. data/.document +7 -0
  4. data/.editorconfig +13 -0
  5. data/.github/dependabot.yml +6 -0
  6. data/.github/workflows/test.yml +26 -0
  7. data/.gitignore +12 -0
  8. data/.rdoc_options +4 -0
  9. data/COPYING +56 -0
  10. data/Gemfile +5 -0
  11. data/README.md +59 -0
  12. data/Rakefile +14 -0
  13. data/cmd-optparse.rb.gemspec +30 -0
  14. data/doc/optparse/.document +1 -0
  15. data/doc/optparse/argument_converters.rdoc +380 -0
  16. data/doc/optparse/creates_option.rdoc +7 -0
  17. data/doc/optparse/option_params.rdoc +509 -0
  18. data/doc/optparse/ruby/argument_abbreviation.rb +9 -0
  19. data/doc/optparse/ruby/argument_keywords.rb +6 -0
  20. data/doc/optparse/ruby/argument_strings.rb +6 -0
  21. data/doc/optparse/ruby/argv.rb +2 -0
  22. data/doc/optparse/ruby/array.rb +6 -0
  23. data/doc/optparse/ruby/basic.rb +17 -0
  24. data/doc/optparse/ruby/block.rb +9 -0
  25. data/doc/optparse/ruby/collected_options.rb +8 -0
  26. data/doc/optparse/ruby/custom_converter.rb +9 -0
  27. data/doc/optparse/ruby/date.rb +6 -0
  28. data/doc/optparse/ruby/datetime.rb +6 -0
  29. data/doc/optparse/ruby/decimal_integer.rb +7 -0
  30. data/doc/optparse/ruby/decimal_numeric.rb +7 -0
  31. data/doc/optparse/ruby/default_values.rb +8 -0
  32. data/doc/optparse/ruby/descriptions.rb +15 -0
  33. data/doc/optparse/ruby/explicit_array_values.rb +9 -0
  34. data/doc/optparse/ruby/explicit_hash_values.rb +9 -0
  35. data/doc/optparse/ruby/false_class.rb +6 -0
  36. data/doc/optparse/ruby/float.rb +6 -0
  37. data/doc/optparse/ruby/help.rb +18 -0
  38. data/doc/optparse/ruby/help_banner.rb +7 -0
  39. data/doc/optparse/ruby/help_format.rb +25 -0
  40. data/doc/optparse/ruby/help_program_name.rb +7 -0
  41. data/doc/optparse/ruby/integer.rb +6 -0
  42. data/doc/optparse/ruby/long_names.rb +9 -0
  43. data/doc/optparse/ruby/long_optional.rb +6 -0
  44. data/doc/optparse/ruby/long_required.rb +6 -0
  45. data/doc/optparse/ruby/long_simple.rb +9 -0
  46. data/doc/optparse/ruby/long_with_negation.rb +6 -0
  47. data/doc/optparse/ruby/match_converter.rb +9 -0
  48. data/doc/optparse/ruby/matched_values.rb +6 -0
  49. data/doc/optparse/ruby/method.rb +11 -0
  50. data/doc/optparse/ruby/missing_options.rb +12 -0
  51. data/doc/optparse/ruby/mixed_names.rb +12 -0
  52. data/doc/optparse/ruby/name_abbrev.rb +9 -0
  53. data/doc/optparse/ruby/no_abbreviation.rb +10 -0
  54. data/doc/optparse/ruby/numeric.rb +6 -0
  55. data/doc/optparse/ruby/object.rb +6 -0
  56. data/doc/optparse/ruby/octal_integer.rb +7 -0
  57. data/doc/optparse/ruby/optional_argument.rb +9 -0
  58. data/doc/optparse/ruby/parse.rb +13 -0
  59. data/doc/optparse/ruby/parse_bang.rb +13 -0
  60. data/doc/optparse/ruby/proc.rb +13 -0
  61. data/doc/optparse/ruby/regexp.rb +6 -0
  62. data/doc/optparse/ruby/required_argument.rb +9 -0
  63. data/doc/optparse/ruby/shellwords.rb +6 -0
  64. data/doc/optparse/ruby/short_names.rb +9 -0
  65. data/doc/optparse/ruby/short_optional.rb +6 -0
  66. data/doc/optparse/ruby/short_range.rb +6 -0
  67. data/doc/optparse/ruby/short_required.rb +6 -0
  68. data/doc/optparse/ruby/short_simple.rb +9 -0
  69. data/doc/optparse/ruby/string.rb +6 -0
  70. data/doc/optparse/ruby/terminator.rb +6 -0
  71. data/doc/optparse/ruby/time.rb +6 -0
  72. data/doc/optparse/ruby/true_class.rb +6 -0
  73. data/doc/optparse/ruby/uri.rb +6 -0
  74. data/doc/optparse/tutorial.rdoc +858 -0
  75. data/lib/optionparser.rb +2 -0
  76. data/lib/optparse/ac.rb +54 -0
  77. data/lib/optparse/date.rb +18 -0
  78. data/lib/optparse/kwargs.rb +22 -0
  79. data/lib/optparse/shellwords.rb +7 -0
  80. data/lib/optparse/time.rb +11 -0
  81. data/lib/optparse/uri.rb +7 -0
  82. data/lib/optparse/version.rb +71 -0
  83. data/lib/optparse.rb +2346 -0
  84. data/misc/rb_optparse.bash +21 -0
  85. data/misc/rb_optparse.zsh +39 -0
  86. data/rakelib/.document +0 -0
  87. data/rakelib/changelogs.rake +34 -0
  88. data/rakelib/epoch.rake +5 -0
  89. data/rakelib/version.rake +51 -0
  90. data/test/lib/helper.rb +4 -0
  91. data/test/optparse/test_acceptable.rb +198 -0
  92. data/test/optparse/test_autoconf.rb +69 -0
  93. data/test/optparse/test_bash_completion.rb +46 -0
  94. data/test/optparse/test_cclass.rb +18 -0
  95. data/test/optparse/test_did_you_mean.rb +48 -0
  96. data/test/optparse/test_getopts.rb +49 -0
  97. data/test/optparse/test_kwargs.rb +38 -0
  98. data/test/optparse/test_load.rb +141 -0
  99. data/test/optparse/test_noarg.rb +79 -0
  100. data/test/optparse/test_optarg.rb +60 -0
  101. data/test/optparse/test_optparse.rb +127 -0
  102. data/test/optparse/test_placearg.rb +76 -0
  103. data/test/optparse/test_reqarg.rb +95 -0
  104. data/test/optparse/test_summary.rb +81 -0
  105. data/test/optparse/test_zsh_completion.rb +21 -0
  106. metadata +154 -0
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: false
2
+ require 'test/unit'
3
+ require 'optparse'
4
+ require 'tmpdir'
5
+
6
+ class TestOptionParserLoad < Test::Unit::TestCase
7
+ def setup
8
+ @tmpdir = Dir.mktmpdir("optparse_test-")
9
+ @basename = File.basename($0, '.*')
10
+ @envs = %w[HOME XDG_CONFIG_HOME XDG_CONFIG_DIRS].each_with_object({}) do |v, h|
11
+ h[v] = ENV.delete(v)
12
+ end
13
+ end
14
+
15
+ def teardown
16
+ ENV.update(@envs)
17
+ FileUtils.rm_rf(@tmpdir)
18
+ end
19
+
20
+ def new_parser
21
+ @result = nil
22
+ OptionParser.new do |opt|
23
+ opt.on("--test=arg") {|v| @result = v}
24
+ end
25
+ end
26
+
27
+ def assert_load(result)
28
+ assert new_parser.load
29
+ assert_equal(result, @result)
30
+ assert new_parser.load(into: into = {})
31
+ assert_equal({test: result}, into)
32
+ end
33
+
34
+ def setup_options(env, dir, suffix = nil)
35
+ optdir = File.join(@tmpdir, dir)
36
+ FileUtils.mkdir_p(optdir)
37
+ file = File.join(optdir, [@basename, suffix].join(""))
38
+ File.write(file, "--test=#{dir}")
39
+ ENV.update(env)
40
+ if block_given?
41
+ begin
42
+ yield dir, optdir
43
+ ensure
44
+ File.unlink(file)
45
+ Dir.rmdir(optdir) rescue nil
46
+ end
47
+ else
48
+ return dir, optdir
49
+ end
50
+ end
51
+
52
+ def setup_options_home(&block)
53
+ setup_options({'HOME'=>@tmpdir}, ".options", &block)
54
+ end
55
+
56
+ def setup_options_xdg_config_home(&block)
57
+ setup_options({'XDG_CONFIG_HOME'=>@tmpdir+"/xdg"}, "xdg", ".options", &block)
58
+ end
59
+
60
+ def setup_options_home_config(&block)
61
+ setup_options({'HOME'=>@tmpdir}, ".config", ".options", &block)
62
+ end
63
+
64
+ def setup_options_xdg_config_dirs(&block)
65
+ setup_options({'XDG_CONFIG_DIRS'=>@tmpdir+"/xdgconf"}, "xdgconf", ".options", &block)
66
+ end
67
+
68
+ def setup_options_home_config_settings(&block)
69
+ setup_options({'HOME'=>@tmpdir}, "config/settings", ".options", &block)
70
+ end
71
+
72
+ def test_load_home_options
73
+ result, = setup_options_home
74
+ assert_load(result)
75
+
76
+ setup_options_xdg_config_home do
77
+ assert_load(result)
78
+ end
79
+
80
+ setup_options_home_config do
81
+ assert_load(result)
82
+ end
83
+
84
+ setup_options_xdg_config_dirs do
85
+ assert_load(result)
86
+ end
87
+
88
+ setup_options_home_config_settings do
89
+ assert_load(result)
90
+ end
91
+ end
92
+
93
+ def test_load_xdg_config_home
94
+ result, = setup_options_xdg_config_home
95
+ assert_load(result)
96
+
97
+ setup_options_home_config do
98
+ assert_load(result)
99
+ end
100
+
101
+ setup_options_xdg_config_dirs do
102
+ assert_load(result)
103
+ end
104
+
105
+ setup_options_home_config_settings do
106
+ assert_load(result)
107
+ end
108
+ end
109
+
110
+ def test_load_home_config
111
+ result, = setup_options_home_config
112
+ assert_load(result)
113
+
114
+ setup_options_xdg_config_dirs do
115
+ assert_load(result)
116
+ end
117
+
118
+ setup_options_home_config_settings do
119
+ assert_load(result)
120
+ end
121
+ end
122
+
123
+ def test_load_xdg_config_dirs
124
+ result, = setup_options_xdg_config_dirs
125
+ assert_load(result)
126
+
127
+ setup_options_home_config_settings do
128
+ assert_load(result)
129
+ end
130
+ end
131
+
132
+ def test_load_home_config_settings
133
+ result, = setup_options_home_config_settings
134
+ assert_load(result)
135
+ end
136
+
137
+ def test_load_nothing
138
+ assert !new_parser.load
139
+ assert_nil @result
140
+ end
141
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: false
2
+ require_relative 'test_optparse'
3
+
4
+ module TestOptionParserNoArg
5
+ def setup
6
+ super
7
+ @opt.def_option "--with_underscore" do |x| @flag = x end
8
+ @opt.def_option "--with-hyphen" do |x| @flag = x end
9
+ end
10
+
11
+ class Def1 < TestOptionParser
12
+ include TestOptionParserNoArg
13
+ def setup
14
+ super
15
+ @opt.def_option("-x") {|x| @flag = x}
16
+ @opt.def_option("--option") {|x| @flag = x}
17
+ end
18
+ end
19
+ class Def2 < TestOptionParser
20
+ include TestOptionParserNoArg
21
+ def setup
22
+ super
23
+ @opt.def_option("-x", "--option") {|x| @flag = x}
24
+ end
25
+ end
26
+
27
+ def test_short
28
+ assert_raise(OptionParser::InvalidOption) {@opt.parse!(%w"-xq")}
29
+ assert_equal(%w"", no_error {@opt.parse!(%w"-x")})
30
+ assert_equal(true, @flag)
31
+ @flag = nil
32
+ assert_equal(%w"foo", no_error {@opt.parse!(%w"-x foo")})
33
+ assert_equal(true, @flag)
34
+ end
35
+
36
+ def test_abbrev
37
+ assert_raise(OptionParser::InvalidOption) {@opt.parse!(%w"-oq")}
38
+ assert_equal(%w"", no_error {@opt.parse!(%w"-o")})
39
+ assert_equal(true, @flag)
40
+ @flag = nil
41
+ assert_raise(OptionParser::InvalidOption) {@opt.parse!(%w"-O")}
42
+ assert_nil(@flag)
43
+ @flag = nil
44
+ assert_equal(%w"foo", no_error {@opt.parse!(%w"-o foo")})
45
+ assert_equal(true, @flag)
46
+ end
47
+
48
+ def test_long
49
+ assert_raise(OptionParser::NeedlessArgument) {@opt.parse!(%w"--option=x")}
50
+ assert_equal(%w"", no_error {@opt.parse!(%w"--opt")})
51
+ assert_equal(true, @flag)
52
+ @flag = nil
53
+ assert_equal(%w"foo", no_error {@opt.parse!(%w"--opt foo")})
54
+ assert_equal(true, @flag)
55
+ end
56
+
57
+ def test_ambiguous
58
+ @opt.def_option("--open") {|x|}
59
+ assert_raise(OptionParser::AmbiguousOption) {@opt.parse!(%w"--op")}
60
+ assert_raise(OptionParser::AmbiguousOption) {@opt.parse!(%w"-o")}
61
+ assert_equal(%w"", no_error {@opt.parse!(%w"--opt")})
62
+ assert_equal(true, @flag)
63
+ end
64
+
65
+ def test_hyphenize
66
+ @flag = nil
67
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with_underscore")})
68
+ assert_equal(true, @flag)
69
+ @flag = nil
70
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with-underscore")})
71
+ assert_equal(true, @flag)
72
+ @flag = nil
73
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with-hyphen")})
74
+ assert_equal(true, @flag)
75
+ @flag = nil
76
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with_hyphen")})
77
+ assert_equal(true, @flag)
78
+ end
79
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: false
2
+ require_relative 'test_optparse'
3
+
4
+ class TestOptionParserOptArg < TestOptionParser
5
+ def setup
6
+ super
7
+ @opt.def_option("-x[VAL]") {|x| @flag = x}
8
+ @opt.def_option("--option[=VAL]") {|x| @flag = x}
9
+ @opt.def_option("--regexp[=REGEXP]", Regexp) {|x| @reopt = x}
10
+ @opt.def_option "--with_underscore[=VAL]" do |x| @flag = x end
11
+ @opt.def_option "--with-hyphen[=VAL]" do |x| @flag = x end
12
+ @reopt = nil
13
+ end
14
+
15
+ def test_short
16
+ assert_equal(%w"", no_error {@opt.parse!(%w"-x")})
17
+ assert_equal(nil, @flag)
18
+ @flag = false
19
+ assert_equal(%w"foo", no_error {@opt.parse!(%w"-x foo")})
20
+ assert_equal(nil, @flag)
21
+ assert_equal(%w"", no_error {@opt.parse!(%w"-xfoo")})
22
+ assert_equal("foo", @flag)
23
+ assert_equal(%w"", no_error {@opt.parse!(%w"-x=")})
24
+ assert_equal("=", @flag)
25
+ end
26
+
27
+ def test_abbrev
28
+ assert_equal(%w"", no_error {@opt.parse!(%w"-o")})
29
+ assert_equal(nil, @flag)
30
+ @flag = false
31
+ assert_equal(%w"foo", no_error {@opt.parse!(%w"-o foo")})
32
+ assert_equal(nil, @flag)
33
+ assert_equal(%w"", no_error {@opt.parse!(%w"-ofoo")})
34
+ assert_equal("foo", @flag)
35
+ assert_equal(%w"", no_error {@opt.parse!(%w"-o=")})
36
+ assert_equal("=", @flag)
37
+ end
38
+
39
+ def test_long
40
+ assert_equal(%w"", no_error {@opt.parse!(%w"--opt")})
41
+ assert_equal(nil, @flag)
42
+ assert_equal(%w"foo", no_error {@opt.parse!(%w"--opt= foo")})
43
+ assert_equal("", @flag)
44
+ assert_equal(%w"", no_error {@opt.parse!(%w"--opt=foo")})
45
+ assert_equal("foo", @flag)
46
+ assert_equal(%w"foo", no_error {@opt.parse!(%w"--opt foo")})
47
+ assert_equal(nil, @flag)
48
+ end
49
+
50
+ def test_hyphenize
51
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with_underscore=foo1")})
52
+ assert_equal("foo1", @flag)
53
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with-underscore=foo2")})
54
+ assert_equal("foo2", @flag)
55
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with-hyphen=foo3")})
56
+ assert_equal("foo3", @flag)
57
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with_hyphen=foo4")})
58
+ assert_equal("foo4", @flag)
59
+ end
60
+ end
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: false
2
+ require 'test/unit'
3
+ require 'optparse'
4
+
5
+ class TestOptionParser < Test::Unit::TestCase
6
+ def setup
7
+ @opt = OptionParser.new
8
+ @flag = self.class # cannot set by option
9
+ end
10
+
11
+ class DummyOutput < String
12
+ alias write concat
13
+ end
14
+ def assert_no_error(*args)
15
+ $stderr, stderr = DummyOutput.new, $stderr
16
+ assert_nothing_raised(*args) {return yield}
17
+ ensure
18
+ stderr, $stderr = $stderr, stderr
19
+ $!.backtrace.delete_if {|e| /\A#{Regexp.quote(__FILE__)}:#{__LINE__-2}/o =~ e} if $!
20
+ assert_empty(stderr)
21
+ end
22
+ alias no_error assert_no_error
23
+
24
+ def test_permute
25
+ assert_equal(%w"", no_error {@opt.permute!(%w"")})
26
+ assert_equal(self.class, @flag)
27
+ assert_equal(%w"foo bar", no_error {@opt.permute!(%w"foo bar")})
28
+ assert_equal(self.class, @flag)
29
+ assert_equal(%w"- foo bar", no_error {@opt.permute!(%w"- foo bar")})
30
+ assert_equal(self.class, @flag)
31
+ assert_equal(%w"foo bar", no_error {@opt.permute!(%w"-- foo bar")})
32
+ assert_equal(self.class, @flag)
33
+ assert_equal(%w"foo - bar", no_error {@opt.permute!(%w"foo - bar")})
34
+ assert_equal(self.class, @flag)
35
+ assert_equal(%w"foo bar", no_error {@opt.permute!(%w"foo -- bar")})
36
+ assert_equal(self.class, @flag)
37
+ assert_equal(%w"foo --help bar", no_error {@opt.permute!(%w"foo -- --help bar")})
38
+ assert_equal(self.class, @flag)
39
+ end
40
+
41
+ def test_order
42
+ assert_equal(%w"", no_error {@opt.order!(%w"")})
43
+ assert_equal(self.class, @flag)
44
+ assert_equal(%w"foo bar", no_error {@opt.order!(%w"foo bar")})
45
+ assert_equal(self.class, @flag)
46
+ assert_equal(%w"- foo bar", no_error {@opt.order!(%w"- foo bar")})
47
+ assert_equal(self.class, @flag)
48
+ assert_equal(%w"foo bar", no_error {@opt.permute!(%w"-- foo bar")})
49
+ assert_equal(self.class, @flag)
50
+ assert_equal(%w"foo - bar", no_error {@opt.order!(%w"foo - bar")})
51
+ assert_equal(self.class, @flag)
52
+ assert_equal(%w"foo -- bar", no_error {@opt.order!(%w"foo -- bar")})
53
+ assert_equal(self.class, @flag)
54
+ assert_equal(%w"foo -- --help bar", no_error {@opt.order!(%w"foo -- --help bar")})
55
+ assert_equal(self.class, @flag)
56
+ end
57
+
58
+ def test_regexp
59
+ return unless defined?(@reopt)
60
+ assert_equal(%w"", no_error {@opt.parse!(%w"--regexp=/foo/")})
61
+ assert_equal(/foo/, @reopt)
62
+ assert_equal(%w"", no_error {@opt.parse!(%w"--regexp=/foo/i")})
63
+ assert_equal(/foo/i, @reopt)
64
+ assert_equal(%w"", no_error {@opt.parse!(%w"--regexp=/foo/n")})
65
+ assert_equal(/foo/n, @reopt)
66
+ assert_equal(%w"", no_error {@opt.parse!(%W"--regexp=/\u{3042}/s")})
67
+ assert_equal(Encoding::Windows_31J, @reopt.encoding)
68
+ assert_equal("\x82\xa0".force_encoding(Encoding::Windows_31J), @reopt.source)
69
+ end
70
+
71
+ def test_into
72
+ @opt.def_option "-h", "--host=HOST", "hostname"
73
+ @opt.def_option "-p", "--port=PORT", "port", Integer
74
+ @opt.def_option "-v", "--verbose" do @verbose = true end
75
+ @opt.def_option "-q", "--quiet" do @quiet = true end
76
+ result = {}
77
+ @opt.parse %w(--host localhost --port 8000 -v), into: result
78
+ assert_equal({
79
+ h: "localhost", host: "localhost",
80
+ p: 8000, port: 8000,
81
+ v: true, verbose: true
82
+ }, result)
83
+ assert_equal(true, @verbose)
84
+ end
85
+
86
+ def test_require_exact
87
+ @opt.def_option('-F', '--zrs=IRS', 'zrs')
88
+ %w(--zrs --zr --z -zfoo -z -F -Ffoo).each do |arg|
89
+ result = {}
90
+ @opt.parse([arg, 'foo'], into: result)
91
+ assert_equal({F: 'foo', zrs: 'foo'}, result)
92
+ end
93
+
94
+ @opt.require_exact = true
95
+ %w(--zrs -F -Ffoo).each do |arg|
96
+ result = {}
97
+ @opt.parse([arg, 'foo'], into: result)
98
+ assert_equal({F: 'foo', zrs: 'foo'}, result)
99
+ end
100
+
101
+ assert_raise(OptionParser::InvalidOption) {@opt.parse(%w(--zr foo))}
102
+ assert_raise(OptionParser::InvalidOption) {@opt.parse(%w(--z foo))}
103
+ assert_raise(OptionParser::InvalidOption) {@opt.parse(%w(-zrs foo))}
104
+ assert_raise(OptionParser::InvalidOption) {@opt.parse(%w(-zr foo))}
105
+ assert_raise(OptionParser::InvalidOption) {@opt.parse(%w(-z foo))}
106
+ end
107
+
108
+ def test_raise_unknown
109
+ @opt.def_option('--my-foo [ARG]') {|arg| @foo = arg}
110
+ assert @opt.raise_unknown
111
+
112
+ @opt.raise_unknown = false
113
+ assert_equal(%w[--my-bar], @opt.parse(%w[--my-foo --my-bar]))
114
+ assert_nil(@foo)
115
+
116
+ assert_equal(%w[--my-bar], @opt.parse(%w[--my-foo x --my-bar]))
117
+ assert_equal("x", @foo)
118
+ end
119
+
120
+ def test_nonopt_pattern
121
+ @opt.def_option(/^[^-]/) do |arg|
122
+ assert(false, "Never gets called")
123
+ end
124
+ e = assert_raise(OptionParser::InvalidOption) {@opt.parse(%w(-t))}
125
+ assert_equal(["-t"], e.args)
126
+ end
127
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: false
2
+ require_relative 'test_optparse'
3
+
4
+ class TestOptionParserPlaceArg < TestOptionParser
5
+ def setup
6
+ super
7
+ @opt.def_option("-x [VAL]") {|x| @flag = x}
8
+ @opt.def_option("--option [VAL]") {|x| @flag = x}
9
+ @opt.def_option("-T [level]", /^[0-4]$/, Integer) {|x| @topt = x}
10
+ @topt = nil
11
+ @opt.def_option("-n") {}
12
+ @opt.def_option("--regexp [REGEXP]", Regexp) {|x| @reopt = x}
13
+ @reopt = nil
14
+ @opt.def_option "--with_underscore=VAL" do |x| @flag = x end
15
+ @opt.def_option "--with-hyphen=VAL" do |x| @flag = x end
16
+ end
17
+
18
+ def test_short
19
+ assert_equal(%w"", no_error {@opt.parse!(%w"-x -n")})
20
+ assert_equal(nil, @flag)
21
+ assert_equal(%w"", no_error {@opt.parse!(%w"-x -")})
22
+ assert_equal("-", @flag)
23
+ @flag = false
24
+ assert_equal(%w"", no_error {@opt.parse!(%w"-x foo")})
25
+ assert_equal("foo", @flag)
26
+ assert_equal(%w"", no_error {@opt.parse!(%w"-xbar")})
27
+ assert_equal("bar", @flag)
28
+ assert_equal(%w"", no_error {@opt.parse!(%w"-x=")})
29
+ assert_equal("=", @flag)
30
+ end
31
+
32
+ def test_abbrev
33
+ assert_equal(%w"", no_error {@opt.parse!(%w"-o -n")})
34
+ assert_equal(nil, @flag)
35
+ assert_equal(%w"", no_error {@opt.parse!(%w"-o -")})
36
+ assert_equal("-", @flag)
37
+ @flag = false
38
+ assert_equal(%w"", no_error {@opt.parse!(%w"-o foo")})
39
+ assert_equal("foo", @flag)
40
+ assert_equal(%w"", no_error {@opt.parse!(%w"-obar")})
41
+ assert_equal("bar", @flag)
42
+ assert_equal(%w"", no_error {@opt.parse!(%w"-o=")})
43
+ assert_equal("=", @flag)
44
+ end
45
+
46
+ def test_long
47
+ assert_equal(%w"", no_error {@opt.parse!(%w"--opt -n")})
48
+ assert_equal(nil, @flag)
49
+ assert_equal(%w"", no_error {@opt.parse!(%w"--opt -")})
50
+ assert_equal("-", @flag)
51
+ assert_equal(%w"foo", no_error {@opt.parse!(%w"--opt= foo")})
52
+ assert_equal("", @flag)
53
+ assert_equal(%w"", no_error {@opt.parse!(%w"--opt=foo")})
54
+ assert_equal("foo", @flag)
55
+ assert_equal(%w"", no_error {@opt.parse!(%w"--opt bar")})
56
+ assert_equal("bar", @flag)
57
+ end
58
+
59
+ def test_hyphenize
60
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with_underscore=foo1")})
61
+ assert_equal("foo1", @flag)
62
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with-underscore=foo2")})
63
+ assert_equal("foo2", @flag)
64
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with-hyphen=foo3")})
65
+ assert_equal("foo3", @flag)
66
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with_hyphen=foo4")})
67
+ assert_equal("foo4", @flag)
68
+ end
69
+
70
+ def test_conv
71
+ assert_equal(%w"te.rb", no_error('[ruby-dev:38333]') {@opt.parse!(%w"-T te.rb")})
72
+ assert_nil(@topt)
73
+ assert_equal(%w"te.rb", no_error('[ruby-dev:38333]') {@opt.parse!(%w"-T1 te.rb")})
74
+ assert_equal(1, @topt)
75
+ end
76
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: false
2
+ require_relative 'test_optparse'
3
+
4
+ module TestOptionParserReqArg
5
+ def setup
6
+ super
7
+ @opt.def_option "--with_underscore=VAL" do |x| @flag = x end
8
+ @opt.def_option "--with-hyphen=VAL" do |x| @flag = x end
9
+ end
10
+
11
+ class Def1 < TestOptionParser
12
+ include TestOptionParserReqArg
13
+ def setup
14
+ super
15
+ @opt.def_option("-xVAL") {|x| @flag = x}
16
+ @opt.def_option("--option=VAL") {|x| @flag = x}
17
+ @opt.def_option("--regexp=REGEXP", Regexp) {|x| @reopt = x}
18
+ @reopt = nil
19
+ end
20
+ end
21
+ class Def2 < TestOptionParser
22
+ include TestOptionParserReqArg
23
+ def setup
24
+ super
25
+ @opt.def_option("-x", "--option=VAL") {|x| @flag = x}
26
+ end
27
+ end
28
+ class Def3 < TestOptionParser
29
+ include TestOptionParserReqArg
30
+ def setup
31
+ super
32
+ @opt.def_option("--option=VAL", "-x") {|x| @flag = x}
33
+ end
34
+ end
35
+ class Def4 < TestOptionParser
36
+ include TestOptionParserReqArg
37
+ def setup
38
+ super
39
+ @opt.def_option("-xVAL", "--option=VAL") {|x| @flag = x}
40
+ end
41
+ end
42
+
43
+ def test_short
44
+ assert_raise(OptionParser::MissingArgument) {@opt.parse!(%w"-x")}
45
+ assert_equal(%w"", no_error {@opt.parse!(%w"-x foo")})
46
+ assert_equal("foo", @flag)
47
+ assert_equal(%w"", no_error {@opt.parse!(%w"-xbar")})
48
+ assert_equal("bar", @flag)
49
+ assert_equal(%w"", no_error {@opt.parse!(%w"-x=")})
50
+ assert_equal("=", @flag)
51
+ end
52
+
53
+ def test_abbrev
54
+ assert_raise(OptionParser::MissingArgument) {@opt.parse!(%w"-o")}
55
+ assert_equal(%w"", no_error {@opt.parse!(%w"-o foo")})
56
+ assert_equal("foo", @flag)
57
+ assert_equal(%w"", no_error {@opt.parse!(%w"-obar")})
58
+ assert_equal("bar", @flag)
59
+ assert_equal(%w"", no_error {@opt.parse!(%w"-o=")})
60
+ assert_equal("=", @flag)
61
+ end
62
+
63
+ def test_long
64
+ assert_raise(OptionParser::MissingArgument) {@opt.parse!(%w"--opt")}
65
+ assert_equal(%w"", no_error {@opt.parse!(%w"--opt foo")})
66
+ assert_equal("foo", @flag)
67
+ assert_equal(%w"foo", no_error {@opt.parse!(%w"--opt= foo")})
68
+ assert_equal("", @flag)
69
+ assert_equal(%w"", no_error {@opt.parse!(%w"--opt=foo")})
70
+ assert_equal("foo", @flag)
71
+ end
72
+
73
+ def test_hyphenize
74
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with_underscore foo1")})
75
+ assert_equal("foo1", @flag)
76
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with-underscore foo2")})
77
+ assert_equal("foo2", @flag)
78
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with-hyphen foo3")})
79
+ assert_equal("foo3", @flag)
80
+ assert_equal(%w"", no_error {@opt.parse!(%w"--with_hyphen foo4")})
81
+ assert_equal("foo4", @flag)
82
+ end
83
+
84
+ class TestOptionParser::WithPattern < TestOptionParser
85
+ def test_pattern
86
+ pat = num = nil
87
+ @opt.def_option("--pattern=VAL", /(\w+)(?:\s*:\s*(\w+))?/) {|x, y, z| pat = [x, y, z]}
88
+ @opt.def_option("-T NUM", /\A[1-4]\z/) {|n| num = n}
89
+ no_error {@opt.parse!(%w"--pattern=key:val")}
90
+ assert_equal(%w"key:val key val", pat, '[ruby-list:45645]')
91
+ no_error {@opt.parse!(%w"-T 4")}
92
+ assert_equal("4", num, '[ruby-dev:37514]')
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: false
2
+ require_relative 'test_optparse'
3
+
4
+ class TestOptionParserSummaryTest < TestOptionParser
5
+ def test_short_clash
6
+ r = nil
7
+ o = OptionParser.new do |opts|
8
+ opts.on("-f", "--first-option", "description 1", "description 2"){r = "first-option"}
9
+ opts.on("-t", "--test-option"){r = "test-option"}
10
+ opts.on("-t", "--another-test-option"){r = "another-test-option"}
11
+ opts.separator "this is\nseparator"
12
+ opts.on("-l", "--last-option"){r = "last-option"}
13
+ end
14
+ s = o.summarize
15
+ o.parse("-t")
16
+ assert_match(/--#{r}/, s.grep(/^\s*-t,/)[0])
17
+ assert_match(/first-option/, s[0])
18
+ assert_match(/description 1/, s[0])
19
+ assert_match(/description 2/, s[1])
20
+ assert_match(/last-option/, s[-1])
21
+ end
22
+
23
+ def test_banner
24
+ o = OptionParser.new("foo bar")
25
+ assert_equal("foo bar", o.banner)
26
+ end
27
+
28
+ def test_banner_from_progname
29
+ o = OptionParser.new
30
+ o.program_name = "foobar"
31
+ assert_equal("Usage: foobar [options]\n", o.help)
32
+ end
33
+
34
+ def test_summary
35
+ o = OptionParser.new("foo\nbar")
36
+ assert_equal("foo\nbar\n", o.to_s)
37
+ assert_equal(["foo\n", "bar"], o.to_a)
38
+ end
39
+
40
+ def test_summary_containing_space
41
+ # test for r35467. OptionParser#to_a shouldn't split str by spaces.
42
+ bug6348 = '[ruby-dev:45568]'
43
+ o = OptionParser.new("foo bar")
44
+ assert_equal("foo bar\n", o.to_s, bug6348)
45
+ assert_equal(["foo bar"], o.to_a, bug6348)
46
+ end
47
+
48
+ def test_ver
49
+ o = OptionParser.new("foo bar")
50
+ o.program_name = "foo"
51
+ assert_warning('') {assert_nil(o.version)}
52
+ assert_warning('') {assert_nil(o.release)}
53
+ o.version = [0, 1]
54
+ assert_equal "foo 0.1", o.ver
55
+ o.release = "rel"
56
+ assert_equal "foo 0.1 (rel)", o.ver
57
+ end
58
+
59
+ # https://github.com/ruby/optparse/issues/37
60
+ def test_very_long_without_short
61
+ o = OptionParser.new do |opts|
62
+ # This causes TypeError
63
+ opts.on('', '--long-long-option-param-without-short', "Error desc") { options[:long_long_option_param_without_short] = true }
64
+ opts.on('', '--long-option-param', "Long desc") { options[:long_option_param_without_short] = true }
65
+ opts.on('-a', '--long-long-option-param-with-short', "Normal description") { options[:long_long_option_param_with_short] = true }
66
+
67
+ opts.on('', '--long-long-option-param-without-short-but-with-desc', 'Description of the long long param') { options[:long_long_option_param_without_short_but_with_desc] = true }
68
+ end
69
+
70
+ s = o.summarize
71
+
72
+ assert_match(/^\s*--long-long-option-param-without-short$/, s[0])
73
+ assert_match(/^\s*Error desc$/, s[1])
74
+ assert_match(/^\s*--long-option-param\s+Long desc$/, s[2])
75
+ assert_match(/^\s*-a\s+Normal description$/, s[3])
76
+ assert_match(/^\s*--long-long-option-param-with-short$/, s[4])
77
+
78
+ assert_match(/^\s*--long-long-option-param-without-short-but-with-desc$/, s[5])
79
+ assert_match(/^\s*Description of the long long param$/, s[6])
80
+ end
81
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: false
2
+ require 'test/unit'
3
+ require 'optparse'
4
+
5
+ class TestOptionParserZshCompletion < Test::Unit::TestCase
6
+ def setup
7
+ @opt = OptionParser.new
8
+ @opt.define("-z", "zzz") {}
9
+ @opt.define("--foo") {}
10
+ @opt.define("--bar=BAR") {}
11
+ @opt.define("--for=TYPE", [:hello, :help, :zot]) {}
12
+ end
13
+
14
+ def test_compsys
15
+ compsys = @opt.compsys("", "zshcompsys")
16
+ assert_match(/\"-z\[zzz\]\"/, compsys)
17
+ assert_match(/\"--foo\[\]\"/, compsys)
18
+ assert_match(/\"--bar\[\]\"/, compsys)
19
+ assert_match(/\"--for\[\]\"/, compsys)
20
+ end
21
+ end