Skip to content

Commit

Permalink
Add param permitted
Browse files Browse the repository at this point in the history
  • Loading branch information
piotrmurach committed Apr 5, 2020
1 parent 48ceb08 commit 9342b54
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 0 deletions.
3 changes: 3 additions & 0 deletions lib/tty/option.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ module Option
# Raised when conversion type isn't registered
UnsupportedConversion = Class.new(Error)

# Raised when argument value isn't permitted
UnpermittedArgument = Class.new(Error)

# Enhance object with command line option parsing
#
# @api public
Expand Down
30 changes: 30 additions & 0 deletions lib/tty/option/param_permitted.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# frozen_string_literal: true

module TTY
module Option
module ParamPermitted
# Convert parameter value to another type
#
# @example
# param = Parameter::Argument.create(:foo, permit: %w[11 12 13])
# ParamPermitted[param, "12"] # => 12
#
# @api public
def call(param, value)
return value unless param.permit?

if param.permit.include?(value)
value
else
raise UnpermittedArgument,
format("unpermitted argument %s for %s parameter",
value, param.name.inspect)
end
end
module_function :call

alias :[] :call
module_function :[]
end # ParamPermitted
end # Option
end # TTY
1 change: 1 addition & 0 deletions lib/tty/option/pipeline.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# frozen_string_literal: true

require_relative "param_conversion"
require_relative "param_permitted"
require_relative "param_validation"

module TTY
Expand Down
24 changes: 24 additions & 0 deletions spec/unit/param_permitted_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# frozen_string_literal: true

RSpec.describe TTY::Option::ParamPermitted do
it "skips check when no permit setting" do
param = TTY::Option::Parameter::Option.create(:foo)

expect(described_class[param, "a"]).to eq("a")
end

it "permits an option argument" do
param = TTY::Option::Parameter::Option.create(:foo, permit: %w[a b c])

expect(described_class[param, "a"]).to eq("a")
end

it "doesn't permit an option arguemnt" do
param = TTY::Option::Parameter::Option.create(:foo, permit: %w[a b c])

expect {
described_class[param, "d"]
}.to raise_error(TTY::Option::UnpermittedArgument,
"unpermitted argument d for :foo parameter")
end
end

0 comments on commit 9342b54

Please sign in to comment.