From 0687baaf57ac2fef4ed5406d1a37e05658f8859f Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 14 Oct 2016 13:26:13 +0000 Subject: [PATCH] optparse/kwargs.rb * lib/optparse/kwargs.rb (OptionParser#define_by_keywords): [EXPERIMENTAL] extract command line option definitions from the information of keyword arguments. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56423 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ lib/optparse/kwargs.rb | 17 +++++++++++++++ test/optparse/test_kwargs.rb | 40 ++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 lib/optparse/kwargs.rb create mode 100644 test/optparse/test_kwargs.rb 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 + + * 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 * 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