Add ability to specify an alias for a given request param

This allows us to call params with the more familiar Ruby
case/capitalization. For instance, defining the following:

param :imageRef, alias: :image_ref

in a request file makes the following possible:

session.compute_service.request :create_server do |params|
  params[:imageRef] = 'something'
end

session.compute_service.request :create_server do |params|
  params.image_ref = 'something'
end

NOTE: At this point, params can only be called via method
calls and not via the [] accessor.
This commit is contained in:
Mark Maglana
2013-09-23 15:27:31 -07:00
parent 4572e804c8
commit a20e57f924
2 changed files with 61 additions and 9 deletions

View File

@@ -53,7 +53,7 @@ module Aviator
def links
self.class.links
end
def optional_params
self.class.optional_params
@@ -83,7 +83,7 @@ module Aviator
def querystring?
self.class.querystring?
end
def url?
self.class.url?
@@ -121,18 +121,34 @@ module Aviator
def headers?
instance_methods.include? :headers
end
def links
@links ||= []
end
def param_aliases
@param_aliases ||= {}
end
def params_class
all_params = required_params + optional_params
all_params = required_params + optional_params
param_aliases = self.param_aliases
if all_params.length > 0
@params_class ||= Struct.new(*all_params)
@params_class ||= Struct.new(*all_params) do
param_aliases.each do |param_alias, param_name|
define_method param_alias do
self[param_name]
end
define_method "#{ param_alias }=" do |value|
self[param_name] = value
end
end
end
end
@params_class
@@ -147,12 +163,12 @@ module Aviator
def querystring?
instance_methods.include? :querystring
end
def required_params
@required_params ||= []
end
def url?
instance_methods.include? :url
@@ -176,12 +192,16 @@ module Aviator
self.class.send(attr_name)
end
end
def param(param_name, opts={})
opts = opts.with_indifferent_access
list = (opts[:required] == false ? optional_params : required_params)
list << param_name unless optional_params.include?(param_name)
if opts[:alias]
self.param_aliases[opts[:alias]] = param_name
end
end
end

View File

@@ -211,6 +211,38 @@ class Aviator::Test
error.message.wont_be_nil
error.message.must_include "private method"
end
it 'accepts an alias for a given parameter' do
klass = Class.new(Aviator::Request) do
param :the_param, required: true, alias: :the_alias
end
param_val = 999
req = klass.new do |params|
params.the_param = param_val
end
req.params.the_param.must_equal param_val
req.params.the_alias.must_equal param_val
end
it 'makes the param alias assignable' do
klass = Class.new(Aviator::Request) do
param :the_param, required: true, alias: :the_alias
end
param_val = 999
req = klass.new do |params|
params.the_alias = param_val
end
req.params.the_param.must_equal param_val
req.params.the_alias.must_equal param_val
end
end