summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--lib/optparse/kwargs.rb17
-rw-r--r--test/optparse/test_kwargs.rb40
3 files changed, 63 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 2b55de6fa9..338bab8527 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Oct 14 22:26:10 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/optparse/kwargs.rb (OptionParser#define_by_keywords):
+ [EXPERIMENTAL] extract command line option definitions from the
+ information of keyword arguments.
+
Fri Oct 14 18:27:18 2016 SHIBATA Hiroshi <hsbt@ruby-lang.org>
* object.c: Improve documentation for Float conversion.
diff --git a/lib/optparse/kwargs.rb b/lib/optparse/kwargs.rb
new file mode 100644
index 0000000000..ed58cc142b
--- /dev/null
+++ b/lib/optparse/kwargs.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+require 'optparse'
+
+class OptionParser
+ def define_by_keywords(options, meth, **opts)
+ meth.parameters.each do |type, name|
+ case type
+ when :key, :keyreq
+ op, cl = *(type == :key ? %w"[ ]" : ["", ""])
+ define("--#{name}=#{op}#{name.upcase}#{cl}", *opts[name]) do |o|
+ options[name] = o
+ end
+ end
+ end
+ options
+ end
+end
diff --git a/test/optparse/test_kwargs.rb b/test/optparse/test_kwargs.rb
new file mode 100644
index 0000000000..68fe207a2c
--- /dev/null
+++ b/test/optparse/test_kwargs.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: false
+require 'test/unit'
+require 'optparse'
+require 'optparse/kwargs'
+
+class TestOptionParser < Test::Unit::TestCase
+end
+class TestOptionParser::KwArg < Test::Unit::TestCase
+ class K
+ def initialize(host:, port: 8080)
+ @host = host
+ @port = port
+ end
+ end
+
+ class DummyOutput < String
+ alias write <<
+ end
+ def assert_no_error(*args)
+ $stderr, stderr = DummyOutput.new, $stderr
+ assert_nothing_raised(*args) {return yield}
+ ensure
+ stderr, $stderr = $stderr, stderr
+ $!.backtrace.delete_if {|e| /\A#{Regexp.quote(__FILE__)}:#{__LINE__-2}/o =~ e} if $!
+ assert_empty(stderr)
+ end
+ alias no_error assert_no_error
+
+ def test_kwarg
+ opt = OptionParser.new
+ options = opt.define_by_keywords({}, K.instance_method(:initialize),
+ port: [Integer])
+ assert_raise(OptionParser::MissingArgument) {opt.parse!(%w"--host")}
+ assert_nothing_raised {opt.parse!(%w"--host=localhost")}
+ assert_equal("localhost", options[:host])
+ assert_nothing_raised {opt.parse!(%w"--port")}
+ assert_nothing_raised {opt.parse!(%w"--port=80")}
+ assert_equal(80, options[:port])
+ end
+end