def add_service name, ruby_name, endpoint_pattern = nil, &endpoint_builder
svc = SERVICES[name]
svc_opt = svc.method_name
ruby_name = svc.old_name
add_option(svc_opt, {})
add_option "#{ruby_name}_endpoint""#{ruby_name}_endpoint" do |config,value|
if value
value
elsif endpoint = config.send(svc_opt)[:endpoint]
endpoint
elsif endpoint_pattern
endpoint_pattern % config.region
else
endpoint_builder.call(config.region)
end
end
add_option("#{ruby_name}_port""#{ruby_name}_port") do |config,value|
if value
value
elsif port = config.send(svc_opt)[:port]
port
else
config.use_ssl? ? 443 : 80
end
end
add_option("#{ruby_name}_region""#{ruby_name}_region") do |config,value|
if value
value
elsif region = config.send(svc_opt)[:region]
region
else
endpoint = config.send("#{ruby_name}_endpoint")
if endpoint =~ /us-gov/
if matches = endpoint.match(/(us-gov-west-\d+)/)
matches[1]
else
'us-gov-west-1'
end
elsif matches = endpoint.match(/^.+\.(.+)\.amazonaws.com$/)
matches[1]
else
AWS.const_get(name).global_endpoint? ? 'us-east-1' : config.region
end
end
end
needs = [
"#{ruby_name}_endpoint""#{ruby_name}_endpoint",
"#{ruby_name}_port""#{ruby_name}_port",
"#{ruby_name}_region""#{ruby_name}_region",
:credential_provider,
:http_handler,
:http_read_timeout,
:http_continue_timeout,
:http_continue_threshold,
:log_formatter,
:log_level,
:logger,
:proxy_uri,
:max_retries,
:stub_requests?,
:ssl_verify_peer?,
:ssl_ca_file,
:ssl_ca_path,
:use_ssl?,
:user_agent_prefix,
]
create_block = lambda do |config,client_options|
AWS.const_get(name)::Client.new(:config => config)
end
add_option_with_needs "#{ruby_name}_client""#{ruby_name}_client", needs, &create_block
end