Improved Hash-arg keys validation (see: https://github.com/geemus/fog/issues#issue/41)

This commit is contained in:
Juris Galang 2010-11-09 17:57:34 -08:00
parent 2a71ed0a4c
commit ec15def557
3 changed files with 38 additions and 15 deletions

View File

@ -2,7 +2,8 @@ module Fog
module AWS
class Compute < Fog::Service
requires :aws_access_key_id, :aws_secret_access_key
requires :aws_access_key_id, :aws_secret_access_key
recognizes :endpoint, :region, :host, :path, :port, :scheme, :persistent
model_path 'fog/aws/models/compute'
model :address

View File

@ -40,17 +40,9 @@ module Fog
options = default_credentials.merge(options)
end
missing = []
for requirement in requirements
missing << requirement unless options[requirement]
end
unless missing.empty?
if missing.length == 1
raise(ArgumentError, [missing.first, "is required for this service"].join(' '))
else
raise(ArgumentError, [missing[0...-1].join(", "), 'and', missing[-1], 'are required for this service'].join(' '))
end
end
validate_arguments options, \
:required => requirements,
:optional => recognized
setup_requirements
@ -129,10 +121,40 @@ module Fog
@requirements ||= []
end
def recognizes(*args)
recognized.concat(args)
end
def recognized
@recognized ||= []
end
def reset_data(keys=Mock.data.keys)
Mock.reset_data(keys)
end
def validate_arguments(opts, spec = {})
spec[:required] ||= []
spec[:optional] ||= []
sorter = lambda{ |x, y| x.to_s <=> y.to_s }
allowed = (spec[:optional] + spec[:required]).sort &sorter
keys = opts.keys.map{ |k| k.to_sym }
keys.sort! &sorter
spec[:required].sort! &sorter
unless spec[:required].empty?
k = spec[:required] & keys
raise ArgumentError, "Missing required arguments: #{(spec[:required] - k).join(', ')}" \
unless k == spec[:required]
end
k = keys - allowed
raise ArgumentError, "Unrecognized arguments: #{k.join(', ')}" \
unless k.empty?
end
end
end