From 3611c070ea7d1b97ca3f3076d6a78cb6a2ae0847 Mon Sep 17 00:00:00 2001 From: Alex Genco Date: Sat, 18 Aug 2018 16:39:23 -0700 Subject: [PATCH] Add Docopt::Exit#error? to infer exit status --- lib/docopt.rb | 11 ++++++++--- test/test_docopt.rb | 25 +++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/docopt.rb b/lib/docopt.rb index 0bdd9d2..0227426 100644 --- a/lib/docopt.rb +++ b/lib/docopt.rb @@ -18,8 +18,13 @@ def message @@message end - def initialize(message='') + def initialize(message='', error=true) @@message = (message + "\n" + @@usage).strip + @error = error + end + + def error? + !!@error end end @@ -634,11 +639,11 @@ def dump_patterns(pattern, indent=0) def extras(help, version, options, doc) if help and options.any? { |o| ['-h', '--help'].include?(o.name) && o.value } Exit.set_usage(nil) - raise Exit, doc.strip + raise Exit.new(doc.strip, false) end if version and options.any? { |o| o.name == '--version' && o.value } Exit.set_usage(nil) - raise Exit, version + raise Exit.new(version, false) end end diff --git a/test/test_docopt.rb b/test/test_docopt.rb index 7d9f697..bf2e6ea 100644 --- a/test/test_docopt.rb +++ b/test/test_docopt.rb @@ -1,5 +1,6 @@ require 'test/unit' require 'pathname' +require 'docopt' class DocoptTest < Test::Unit::TestCase @@ -9,4 +10,28 @@ def test_docopt_reference_testcases puts assert system('python', "test/language_agnostic_tester.py", "test/testee.rb", chdir: TOPDIR) end + + def test_exit_success_on_help + exception = assert_raises(Docopt::Exit) do + Docopt.docopt("Usage: mytool -a", :argv => ["--help"]) + end + + assert !exception.error? + end + + def test_exit_success_on_version + exception = assert_raises(Docopt::Exit) do + Docopt.docopt("Usage: mytool -a", :version => "1.2.3", :argv => ["--version"]) + end + + assert !exception.error? + end + + def test_exit_failure_on_unknown_option + exception = assert_raises(Docopt::Exit) do + Docopt.docopt("Usage: mytool -a", :argv => ["--foo"]) + end + + assert exception.error? + end end