diff --git a/bin/producer b/bin/producer new file mode 100755 index 0000000..6de0817 --- /dev/null +++ b/bin/producer @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby + +require 'producer/core' + +Producer::Core::CLI.new(ARGV).run! diff --git a/features/cli/usage.feature b/features/cli/usage.feature new file mode 100644 index 0000000..4c8fea5 --- /dev/null +++ b/features/cli/usage.feature @@ -0,0 +1,9 @@ +Feature: CLI usage + + Scenario: prints the usage when an argument is missing + When I run `producer` + Then the exit status must be 64 + And the output must contain exactly: + """ + Usage: producer host recipe_file + """ diff --git a/lib/producer/core.rb b/lib/producer/core.rb index 6a071ff..20feea1 100644 --- a/lib/producer/core.rb +++ b/lib/producer/core.rb @@ -2,5 +2,6 @@ require 'producer/core/version' module Producer module Core + autoload :CLI, 'producer/core/cli' end end diff --git a/lib/producer/core/cli.rb b/lib/producer/core/cli.rb new file mode 100644 index 0000000..d8014a3 --- /dev/null +++ b/lib/producer/core/cli.rb @@ -0,0 +1,27 @@ +module Producer + module Core + class CLI + attr_reader :arguments + + USAGE = "Usage: #{File.basename $0} host recipe_file" + + def initialize(arguments, stdout = $stdout) + @stdout = stdout + @arguments = arguments + end + + def run! + print_usage_and_exit(64) unless @arguments.length == 2 + end + + + private + + def print_usage_and_exit(status) + @stdout.puts USAGE + + exit status + end + end + end +end diff --git a/spec/producer/core/cli_spec.rb b/spec/producer/core/cli_spec.rb new file mode 100644 index 0000000..d5fe192 --- /dev/null +++ b/spec/producer/core/cli_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' + +module Producer::Core + describe CLI do + let(:arguments) { %w{host recipe.rb} } + subject(:cli) { CLI.new(arguments) } + + describe '#initialize' do + it 'assigns the arguments' do + expect(cli.arguments).to eq arguments + end + end + + describe '#run!' do + context 'missing argument' do + let(:arguments) { %w{host} } + let(:stdout) { StringIO.new } + subject(:cli) { CLI.new(arguments, stdout) } + + it 'exits' do + expect { cli.run! }.to raise_error SystemExit + end + + it 'prints the usage' do + begin + cli.run! + rescue SystemExit + end + expect(stdout.string).to match /\AUsage: .+/ + end + end + end + end +end