class EbayTrading::Schema::RubyClassGenerator

Constants

BuiltInTypes

Attributes

documentation[R]
ignored_classes[R]

Public Class Methods

new(type, simple_types, complex_types, xml) click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 10
def initialize(type, simple_types, complex_types, xml)
  @xml = xml

  @indent = 2
  @type = type
  @simple_types, @complex_types = simple_types, complex_types
  @ignored_classes = []
  # node = @xml.find_first("xs:complexType[@name='#{xml_type}']/xs:annotation/xs:documentation")
  # @documentation = (node && node.content) || ''
  find_base
end

Public Instance Methods

abstract?() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 87
def abstract?
  abstract_request? || abstract_response?
end
abstract_request?() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 91
def abstract_request?
  name == 'AbstractRequest'
end
abstract_response?() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 95
def abstract_response?
  name == 'AbstractResponse'
end
base_class() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 75
def base_class
  if abstract_request? || abstract_response?
    'Base'
  else
    trim_type(@base.name.name) unless @base.nil?
  end
end
complex?() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 30
def complex?
  @type.is_a?(WSDL::XMLSchema::ComplexType)
end
derived_request?() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 117
def derived_request?
  base_class == 'AbstractRequest'
end
derived_response?() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 121
def derived_response?
  base_class == 'AbstractResponse'
end
generate_class() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 38
def generate_class
  
  template = simple? ? 'value' : 'base'
  base = ClassTemplate.new(template).load
 
  customization = ClassTemplate.new(ebay_underscore(name))
  customization.load if customization.exists?
 
  if request? || response?
    class_name = ebay_camelize(name).gsub(/(Request|Response)$/, '')
  else
    class_name = ebay_camelize(name)
  end

  element_name = ebay_camelize(name)
  
    
  class_def = ClassDefinition.new(class_name, element_name, module_name, base_class)
  nodes = generate_nodes

  class_def.nodes.concat nodes
  
  class_def.customization = customization.render(class_def) if customization.exists?

  # class_def.documentation = @documentation
  
  base.render(class_def)
end
module_name() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 99
def module_name
  if request?
    'Requests'
  elsif response?
    'Responses'
  else
    'Types'
  end
end
name() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 71
def name
  @name ||= trim_type(@type.name.name)
end
request?() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 109
def request?
  abstract_request? || derived_request?
end
response?() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 113
def response?
  abstract_response? || derived_response?
end
simple?() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 26
def simple?
  @type.is_a?(WSDL::XMLSchema::SimpleType)
end
simple_content?() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 22
def simple_content?
  @type.simplecontent
end
to_s() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 34
def to_s
  @class_def ||= generate_class
end
type?() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 83
def type?
  !(derived_request? || derived_response?)
end
xml_type() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 67
def xml_type
  @type.name.name
end

Private Instance Methods

build_node_for_built_in_type(name, type, options) click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 222
def build_node_for_built_in_type(name, type, options)
  case type
  when 'string'
    if self.name == 'Item' && name == 'Description'
      CdataNode.new(name, options)
    else
      TextNode.new(name, options)
    end
  when 'anyURI', 'token', 'duration'
    TextNode.new(name, options)
  when 'int', 'float', 'long', 'decimal', 'double'
    NumericNode.new(name, options)
  when 'dateTime'
    DatetimeNode.new(name, options)
  when 'boolean'
    BooleanNode.new(name, options)
  when 'time'
    TimeNode.new(name, options)
  end
end
build_node_for_complex_type(name, type, options) click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 243
def build_node_for_complex_type(name, type, options)
  min, max = options[:min], options[:max]
  simple_type = @simple_types.find_name(type)

  case max.to_s
  when "1"
    if simple_type
      TextNode.new(name, options)
    elsif element = @complex_types.find_name(type)
      if element.elements.size == 1 && element.elements[0].maxoccurs.nil?
        # Found a container!
        child = element.elements[0]

        ignored = %w( MemberMessage BidApproval PromotionalSaleDetails BidAssistantList )
        
        unless BuiltInTypes.include?(child.type.name)
          @ignored_classes << name unless ignored.include?(name)
          options[:type] = child.type.name
          options[:child] = child.name.name
        end

        if simple_type = @simple_types.find_name(child.type.name)
          ValueArrayNode.new(name, options)
        else
          ArrayNode.new(name, options)
        end
      else
        if type == 'AmountType'
          MoneyNode.new(name, options)
        else
          ObjectNode.new(name, options)
        end
      end
    end
  else
    if simple_type
      ValueArrayNode.new(name, options)
    else
      ArrayNode.new(name, options)
    end
  end
end
find_base() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 136
def find_base
  type = @type.complexcontent.extension.base
  @base = @complex_types.find_name(type.name) unless type.nil?
rescue NoMethodError
end
generate_nodes() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 150
def generate_nodes
  if simple?
    enumeration = @type.restriction.enumeration
    if enumeration.any?
      @type.restriction.enumeration.select{|c| c != 'CustomCode'}
    end
  elsif simple_content?
    content = @type.simplecontent
    result = []
    result << build_node_for_built_in_type(trim_type(name), content.extension.base.name, :field => '', :min => '0')

    result.concat(content.attributes.collect do |a|
      TextNode.new(trim_code_type(a.type.name), :field => "@#{a.name.name}", :min => '0')
    end)
    result
  else
    result = nodes_for_complex_elements
    result.concat nodes_for_complex_attributes
  end
end
generate_require_statements() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 190
def generate_require_statements
  result = ''
  result << @nodes.inject('') do |memo, node|
    if node.respond_to?(:class_name)
      memo << require_statement(ebay_underscore(node.class_name))
    else
      memo
    end
  end

  result << "\n"
end
node_for(element) click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 203
def node_for(element)
  name = element.name.name
  type = element.type.name
  min = element.minoccurs || "1"
  max = element.maxoccurs || "1"
  max = nil if element.maxoccurs.nil?

  options = { :type => type,
    :min => min,
    :max => max
  }

  if BuiltInTypes.include?(type)
    build_node_for_built_in_type(name, type, options)
  else
    build_node_for_complex_type(name, type, options)
  end
end
nodes_for_complex_attributes() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 184
def nodes_for_complex_attributes
  @type.attributes.collect do |a|
    build_node_for_built_in_type(trim_code_type(a.name.name), a.type.name, :field => "@#{a.name.name}", :min => '0')
  end
end
nodes_for_complex_elements() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 171
def nodes_for_complex_elements
  begin
    non_inherited_elements.collect do |e|
      node_for(e)
    end.flatten
  rescue NoMethodError
    # Hack for when the type doesn't respond to elements
    @type.complexcontent.content.content.elements.collect do |e|
      node_for(e)
    end.flatten
  end
end
non_inherited_elements() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 142
def non_inherited_elements
  return @type.elements if @base.nil?

  @type.elements.reject do |e|
    @base.find_element(e.name)
  end
end
select_template() click to toggle source
# File lib/ebay_trading/schema/mapper/ruby_class_generator.rb, line 127
def select_template
  # First try and load a template for the class
  template = ClassTemplate.new(ebay_underscore(name))
  if !template.exists?
    template = ClassTemplate.new('ebay_class')
  end
  template.load
end