Allow access of aliases as symbols or strings just like its param

Prior to this rev, parameter aliases can only be access via dot
notation. This change allows one to use any of the following:

  keystone.request(:create_token) do |p|
    p[:tenant_name] = 'name'
  end

  keystone.request(:create_token) do |p|
    p['tenant_name'] = 'name'
  end

  keystone.request(:create_token) do |p|
    p.tenant_name = 'name'
  end
This commit is contained in:
Mark Maglana
2013-09-23 21:39:06 -07:00
parent e49d015645
commit 359a20af24
2 changed files with 63 additions and 14 deletions

View File

@@ -134,21 +134,10 @@ module Aviator
def params_class
all_params = required_params + optional_params
param_aliases = self.param_aliases
all_params = required_params + optional_params
if all_params.length > 0
@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
if all_params.length > 0 && @params_class.nil?
@params_class = build_params_class(all_params, self.param_aliases)
end
@params_class
@@ -178,6 +167,34 @@ module Aviator
private
def build_params_class(all_params, param_aliases)
Struct.new(*all_params) do
alias :param_getter :[]
alias :param_setter :[]=
define_method :[] do |key|
key = param_aliases[key.to_sym] if param_aliases.keys.include? key.to_sym
param_getter(key)
end
define_method :[]= do |key, value|
key = param_aliases[key.to_sym] if param_aliases.keys.include? key.to_sym
param_setter(key, value)
end
param_aliases.each do |param_alias, param_name|
define_method param_alias do
param_getter(param_name)
end
define_method "#{ param_alias }=" do |value|
param_setter(param_name, value)
end
end
end
end
def link(rel, href)
links << { rel: rel, href: href }
end

View File

@@ -243,6 +243,38 @@ class Aviator::Test
req.params.the_param.must_equal param_val
req.params.the_alias.must_equal param_val
end
it 'allows aliases to be accessible as symbols' 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
it 'allows aliases to be accessible as strings' 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