class PayPal::SDK::Core::API::DataTypes::Base

Create attributes and restrict the object type.

Example

class ConvertCurrencyRequest < Core::API::DataTypes::Base
  object_of :baseAmountList,        CurrencyList
  object_of :convertToCurrencyList, CurrencyCodeList
  object_of :countryCode,           String
  object_of :conversionType,        String
end

Constants

ContentKey
HashOptions

Public Class Methods

add_attribute(name, options = {}) click to toggle source

Add attribute

Arguments

  • name – attribute name

  • options – options

# File lib/paypal-sdk/core/api/data_types/base.rb, line 30
def add_attribute(name, options = {})
  add_member(name, SimpleTypes::String, options.merge( :attribute => true ))
end
add_member(member_name, klass, options = {}) click to toggle source

Add Field to class variable hash and generate methods

Example

add_member(:errorMessage, String)  # Generate Code
# attr_reader   :errorMessage
# alias_method  :error_message,  :errorMessage
# alias_method  :error_message=, :errorMessage=
# File lib/paypal-sdk/core/api/data_types/base.rb, line 50
def add_member(member_name, klass, options = {})
  member_name = member_name.to_sym
  return if members[member_name]
  members[member_name] = options.merge( :type => klass )
  member_variable_name = "@#{member_name}"
  define_method "#{member_name}=" do |value|
    object = options[:array] ? convert_array(value, klass) : convert_object(value, klass)
    instance_variable_set(member_variable_name, object)
  end
  default_value = ( options[:array] ? [] : ( klass < Base ? Util::OrderedHash.new : nil ) )
  define_method member_name do |&block|
    value = instance_variable_get(member_variable_name) || ( default_value && send("#{member_name}=", default_value) )
    value.instance_eval(&block) if block
    value
  end
  define_alias_methods(member_name, options)
end
array_of(key, klass, options = {}) click to toggle source

define method for given member and the class name

Example

array_of(:errorMessage, ErrorMessage) # It Generate below code
# def errorMessage=(array)
#   @errorMessage = array.map{|options| ErrorMessage.new(options) }
# end
# add_member :errorMessage, ErrorMessage
# File lib/paypal-sdk/core/api/data_types/base.rb, line 98
def array_of(key, klass, options = {})
  add_member(key, klass, options.merge(:array => true))
end
define_alias_methods(member_name, options) click to toggle source

Define alias methods for getter and setter

# File lib/paypal-sdk/core/api/data_types/base.rb, line 69
def define_alias_methods(member_name, options)
  snakecase_name = snakecase(member_name)
  alias_method snakecase_name, member_name
  alias_method "#{snakecase_name}=", "#{member_name}="
  alias_method "#{options[:namespace]}:#{member_name}=", "#{member_name}=" if options[:namespace]
  if options[:attribute]
    alias_method "@#{member_name}=", "#{member_name}="
    alias_method "@#{options[:namespace]}:#{member_name}=", "#{member_name}=" if options[:namespace]
  end
end
members() click to toggle source

Fields list for the DataTye

# File lib/paypal-sdk/core/api/data_types/base.rb, line 35
def members
  @members ||=
    begin
      superclass.load_members if defined? superclass.load_members
      parent_members = superclass.instance_variable_get("@members")
      parent_members ? parent_members.dup : Util::OrderedHash.new
    end
end
new(options = {}, &block) click to toggle source

Initialize options.

# File lib/paypal-sdk/core/api/data_types/base.rb, line 113
def initialize(options = {}, &block)
  merge!(options, &block)
end
object_of(key, klass, options = {}) click to toggle source

define method for given member and the class name

Example

object_of(:errorMessage, ErrorMessage) # Generate Code
# def errorMessage=(options)
#   @errorMessage = ErrorMessage.new(options)
# end
# add_member :errorMessage, ErrorMessage
# File lib/paypal-sdk/core/api/data_types/base.rb, line 87
def object_of(key, klass, options = {})
  add_member(key, klass, options)
end
snakecase(string) click to toggle source

Generate snakecase string.

Example

snakecase(“errorMessage”) # error_message

# File lib/paypal-sdk/core/api/data_types/base.rb, line 106
def snakecase(string)
  string.to_s.gsub(/([a-z])([A-Z])/, '\1_\2').gsub(/([A-Z])([A-Z][a-z])/, '\1_\2').downcase
end

Public Instance Methods

convert_array(array, klass) click to toggle source

Create array of objects.

Example

covert_array([{ :amount => “55”, :code => “USD”}], CurrencyType) covert_array({ “0” => { :amount => “55”, :code => “USD”} }, CurrencyType) covert_array({ :amount => “55”, :code => “USD”}, CurrencyType) # @return # [ <CurrencyType#object @amount=“55” @code=“USD” > ]

# File lib/paypal-sdk/core/api/data_types/base.rb, line 151
def convert_array(array, klass)
  default_value = ( klass < Base ? Util::OrderedHash.new : nil )
  data_type_array = ArrayWithBlock.new{|object| convert_object(object || default_value, klass) }
  data_type_array.merge!(array)
end
convert_object(object, klass) click to toggle source

Create object based on given data.

Example

covert_object({ :amount => “55”, :code => “USD”}, CurrencyType ) # @return # <CurrencyType#object @amount=“55” @code=“USD” >

# File lib/paypal-sdk/core/api/data_types/base.rb, line 162
def convert_object(object, klass)
  object.is_a?(klass) ? object : ( ( object.nil? or object == "" ) ? nil : klass.new(object) )
end
hash_key(key, options = {}) click to toggle source

Generate Hash key for given member name based on configuration

Example

hash_key(:amount) # @return :“ebl:amount” hash_key(:type) # @return :“@type”

# File lib/paypal-sdk/core/api/data_types/base.rb, line 196
def hash_key(key, options = {})
  unless key == ContentKey
    member_option = members[key]
    key = member_option[:name] if member_option.include? :name
    if !member_option[:attribute] and member_option[:namespace] and options[:namespace]
      key = "#{member_option[:namespace]}:#{key}"
    end
    key = "@#{key}" if member_option[:attribute] and options[:attribute]
  end
  options[:symbol] ? key.to_sym : key.to_s
end
member_names() click to toggle source

Get configured member names

# File lib/paypal-sdk/core/api/data_types/base.rb, line 172
def member_names
  members.keys
end
members() click to toggle source

Alias instance method for the class method.

# File lib/paypal-sdk/core/api/data_types/base.rb, line 167
def members
  self.class.members
end
merge!(options, &block) click to toggle source

Merge values

# File lib/paypal-sdk/core/api/data_types/base.rb, line 118
def merge!(options, &block)
  if options.is_a? Hash
    options.each do |key, value|
      set(key, value)
    end
  elsif members[ContentKey]
    set(ContentKey, options)
  else
    raise ArgumentError, "invalid data(#{options.inspect}) for #{self.class.name} class"
  end
  self.instance_eval(&block) if block
  self
end
set(key, value) click to toggle source

Set value for given member

Arguments

  • key – member name

  • value – value for member

# File lib/paypal-sdk/core/api/data_types/base.rb, line 136
def set(key, value)
  send("#{key}=", value)
rescue NoMethodError => error
  logger.warn error.message
rescue TypeError, ArgumentError => error
  raise TypeError, "#{error.message}(#{value.inspect}) for #{self.class.name}.#{key} member"
end
skip_value?(value) click to toggle source

Skip nil, empty array and empty hash.

# File lib/paypal-sdk/core/api/data_types/base.rb, line 188
def skip_value?(value)
  value.nil? || ( ( value.is_a?(Array) || value.is_a?(Hash) ) && value.empty? )
end
to_hash(options = {}) click to toggle source

Create Hash based configured members

# File lib/paypal-sdk/core/api/data_types/base.rb, line 177
def to_hash(options = {})
  options = HashOptions.merge(options)
  hash    = Util::OrderedHash.new
  member_names.each do |member|
    value = value_to_hash(instance_variable_get("@#{member}"), options)
    hash[hash_key(member, options)] = value unless skip_value?(value)
  end
  hash
end
value_to_hash(value, options = {}) click to toggle source

Covert the object to hash based on class.

# File lib/paypal-sdk/core/api/data_types/base.rb, line 209
def value_to_hash(value, options = {})
  case value
  when Array
    value = value.map{|object| value_to_hash(object, options) }
    value.delete_if{|v| skip_value?(v) }
    value
  when Base
    value.to_hash(options)
  else
    value
  end
end