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,2 @@
1
+ # frozen_string_literal: false
2
+ require_relative 'optparse'
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: false
2
+ require_relative '../optparse'
3
+
4
+ class OptionParser::AC < OptionParser
5
+ private
6
+
7
+ def _check_ac_args(name, block)
8
+ unless /\A\w[-\w]*\z/ =~ name
9
+ raise ArgumentError, name
10
+ end
11
+ unless block
12
+ raise ArgumentError, "no block given", ParseError.filter_backtrace(caller)
13
+ end
14
+ end
15
+
16
+ ARG_CONV = proc {|val| val.nil? ? true : val}
17
+
18
+ def _ac_arg_enable(prefix, name, help_string, block)
19
+ _check_ac_args(name, block)
20
+
21
+ sdesc = []
22
+ ldesc = ["--#{prefix}-#{name}"]
23
+ desc = [help_string]
24
+ q = name.downcase
25
+ ac_block = proc {|val| block.call(ARG_CONV.call(val))}
26
+ enable = Switch::PlacedArgument.new(nil, ARG_CONV, sdesc, ldesc, nil, desc, ac_block)
27
+ disable = Switch::NoArgument.new(nil, proc {false}, sdesc, ldesc, nil, desc, ac_block)
28
+ top.append(enable, [], ["enable-" + q], disable, ['disable-' + q])
29
+ enable
30
+ end
31
+
32
+ public
33
+
34
+ def ac_arg_enable(name, help_string, &block)
35
+ _ac_arg_enable("enable", name, help_string, block)
36
+ end
37
+
38
+ def ac_arg_disable(name, help_string, &block)
39
+ _ac_arg_enable("disable", name, help_string, block)
40
+ end
41
+
42
+ def ac_arg_with(name, help_string, &block)
43
+ _check_ac_args(name, block)
44
+
45
+ sdesc = []
46
+ ldesc = ["--with-#{name}"]
47
+ desc = [help_string]
48
+ q = name.downcase
49
+ with = Switch::PlacedArgument.new(*search(:atype, String), sdesc, ldesc, nil, desc, block)
50
+ without = Switch::NoArgument.new(nil, proc {}, sdesc, ldesc, nil, desc, block)
51
+ top.append(with, [], ["with-" + q], without, ['without-' + q])
52
+ with
53
+ end
54
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: false
2
+ require_relative '../optparse'
3
+ require 'date'
4
+
5
+ OptionParser.accept(DateTime) do |s,|
6
+ begin
7
+ DateTime.parse(s) if s
8
+ rescue ArgumentError
9
+ raise OptionParser::InvalidArgument, s
10
+ end
11
+ end
12
+ OptionParser.accept(Date) do |s,|
13
+ begin
14
+ Date.parse(s) if s
15
+ rescue ArgumentError
16
+ raise OptionParser::InvalidArgument, s
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ require_relative '../optparse'
3
+
4
+ class OptionParser
5
+ # :call-seq:
6
+ # define_by_keywords(options, method, **params)
7
+ #
8
+ # :include: ../../doc/optparse/creates_option.rdoc
9
+ #
10
+ def define_by_keywords(options, meth, **opts)
11
+ meth.parameters.each do |type, name|
12
+ case type
13
+ when :key, :keyreq
14
+ op, cl = *(type == :key ? %w"[ ]" : ["", ""])
15
+ define("--#{name}=#{op}#{name.upcase}#{cl}", *opts[name]) do |o|
16
+ options[name] = o
17
+ end
18
+ end
19
+ end
20
+ options
21
+ end
22
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: false
2
+ # -*- ruby -*-
3
+
4
+ require 'shellwords'
5
+ require_relative '../optparse'
6
+
7
+ OptionParser.accept(Shellwords) {|s,| Shellwords.shellwords(s)}
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: false
2
+ require_relative '../optparse'
3
+ require 'time'
4
+
5
+ OptionParser.accept(Time) do |s,|
6
+ begin
7
+ (Time.httpdate(s) rescue Time.parse(s)) if s
8
+ rescue
9
+ raise OptionParser::InvalidArgument, s
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: false
2
+ # -*- ruby -*-
3
+
4
+ require_relative '../optparse'
5
+ require 'uri'
6
+
7
+ OptionParser.accept(URI) {|s,| URI.parse(s) if s}
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: false
2
+ # OptionParser internal utility
3
+
4
+ class << OptionParser
5
+ def show_version(*pkgs)
6
+ progname = ARGV.options.program_name
7
+ result = false
8
+ show = proc do |klass, cname, version|
9
+ str = "#{progname}"
10
+ unless klass == ::Object and cname == :VERSION
11
+ version = version.join(".") if Array === version
12
+ str << ": #{klass}" unless klass == Object
13
+ str << " version #{version}"
14
+ end
15
+ [:Release, :RELEASE].find do |rel|
16
+ if klass.const_defined?(rel)
17
+ str << " (#{klass.const_get(rel)})"
18
+ end
19
+ end
20
+ puts str
21
+ result = true
22
+ end
23
+ if pkgs.size == 1 and pkgs[0] == "all"
24
+ self.search_const(::Object, /\AV(?:ERSION|ersion)\z/) do |klass, cname, version|
25
+ unless cname[1] == ?e and klass.const_defined?(:Version)
26
+ show.call(klass, cname.intern, version)
27
+ end
28
+ end
29
+ else
30
+ pkgs.each do |pkg|
31
+ begin
32
+ pkg = pkg.split(/::|\//).inject(::Object) {|m, c| m.const_get(c)}
33
+ v = case
34
+ when pkg.const_defined?(:Version)
35
+ pkg.const_get(n = :Version)
36
+ when pkg.const_defined?(:VERSION)
37
+ pkg.const_get(n = :VERSION)
38
+ else
39
+ n = nil
40
+ "unknown"
41
+ end
42
+ show.call(pkg, n, v)
43
+ rescue NameError
44
+ end
45
+ end
46
+ end
47
+ result
48
+ end
49
+
50
+ def each_const(path, base = ::Object)
51
+ path.split(/::|\//).inject(base) do |klass, name|
52
+ raise NameError, path unless Module === klass
53
+ klass.constants.grep(/#{name}/i) do |c|
54
+ klass.const_defined?(c) or next
55
+ klass.const_get(c)
56
+ end
57
+ end
58
+ end
59
+
60
+ def search_const(klass, name)
61
+ klasses = [klass]
62
+ while klass = klasses.shift
63
+ klass.constants.each do |cname|
64
+ klass.const_defined?(cname) or next
65
+ const = klass.const_get(cname)
66
+ yield klass, cname, const if name === cname
67
+ klasses << const if Module === const and const != ::Object
68
+ end
69
+ end
70
+ end
71
+ end