class EbayTrading::Schema::ApiSchemaImporter

Constants

Ignores

Attributes

complex_types[R]
simple_types[R]

Public Class Methods

new(schema, data) click to toggle source
# File lib/ebay_trading/schema/mapper/ebay_schema_importer.rb, line 13
def initialize(schema, data)
  @xml = XML::Parser.string(data).parse.root
  
  @elements = schema.collect_elements
  @elements.uniq!
  @attributes = schema.collect_attributes
  @attributes.uniq!
  # Only want the simple types that have an enumeration (codes)
  @simple_types = schema.collect_simpletypes
  @simple_types.uniq!
  
  @code_types = @simple_types.reject{ |e| e.restriction.enumeration.empty? || Ignores.include?(e.name.name) }

  @complex_types = schema.collect_complextypes
  @complex_types.uniq!
  @fault_types = nil
  if schema.respond_to?(:collect_faulttypes)
    @fault_types = schema.collect_faulttypes
  end

  @unused_files = []
end

Public Instance Methods

export_classes(base_dir) click to toggle source
# File lib/ebay_trading/schema/mapper/ebay_schema_importer.rb, line 36
def export_classes(base_dir)
  @base_dir = base_dir
  write_classes
end
write_classes() click to toggle source
# File lib/ebay_trading/schema/mapper/ebay_schema_importer.rb, line 41
def write_classes
  
  complex_classes = @complex_types.collect do |type|
    puts "Generating class for #{type.name.name}"
    RubyClassGenerator.new(type, @simple_types, @complex_types, @xml)
  end
  
  simple_classes = @code_types.collect do |type|
    puts "Generating simple type class for #{type.name.name}"
    RubyClassGenerator.new(type, @simple_types, @complex_types, @xml)
  end
 
  
  write_requires_files(complex_classes)
  write_class_files(complex_classes) 

  write_class_files(simple_classes) 
  write_requires_file('types', simple_classes)

  remove_unused_files
end

Private Instance Methods

generate_filename(name, module_name, simple) click to toggle source
# File lib/ebay_trading/schema/mapper/ebay_schema_importer.rb, line 123
def generate_filename(name, module_name, simple)
  name = name.gsub(/Type$/,'')
  name.gsub!(/(Response|Request)$/, '') unless simple
  
  "#{@base_dir}/#{module_name.downcase}/#{ebay_underscore(name)}.rb"
end
remove_unused_files() click to toggle source
# File lib/ebay_trading/schema/mapper/ebay_schema_importer.rb, line 130
def remove_unused_files
  unless @unused_files.empty?
    @unused_files.uniq!.each do |file|
      if File.exists?(file)
        puts "Removing #{file}"
        File.delete(file)
      end
    end 
  end
end
write_class(klass) click to toggle source
# File lib/ebay_trading/schema/mapper/ebay_schema_importer.rb, line 116
def write_class(klass)
  File.open(generate_filename(klass.name, klass.module_name, klass.type? && !klass.abstract?), "w") do |file|
    file.puts klass.to_s
    @unused_files.concat(klass.ignored_classes.collect{|c| generate_filename(c, 'types', true)})
  end
end
write_class_files(classes) click to toggle source
# File lib/ebay_trading/schema/mapper/ebay_schema_importer.rb, line 64
def write_class_files(classes)
  classes.each do |klass|
    write_class(klass)
  end
end
write_method_calls(requests) click to toggle source
# File lib/ebay_trading/schema/mapper/ebay_schema_importer.rb, line 81
      def write_method_calls(requests)
        File.open("#{@base_dir}/api_methods.rb", "w") do |f|
          f.puts
          f.puts "module EbayTrading"
          f.puts "  module ApiMethods"
          begin
            requests.each do |r|
              name = r.name.gsub(/Request$/, '')
              #r.documentation.each{|l| f.puts "    # #{l.strip}"}
              f.puts <<-DEF
    # Builds EbayTrading::Requests##{name}
    #
    # Returns EbayTrading::Responses##{name}
    #
    # Official Documentation for #{name}[http://developer.ebay.com/DevZone/XML/docs/Reference/eBay/#{name}.html]
    def #{ebay_underscore(name)}(params = {})
      commit(EbayTrading::Requests::#{name}, params)
    end
              DEF
            end
          ensure
            f.puts "  end"
            f.puts "end"
          end
        end
      end
write_requires_file(name, classes, add_abstract = false) click to toggle source
# File lib/ebay_trading/schema/mapper/ebay_schema_importer.rb, line 108
def write_requires_file(name, classes, add_abstract = false)
  prefix = "ebay_trading/#{name}"
  File.open("#{@base_dir}/#{name}.rb", 'w') do |file|
    file.puts require_statement("#{prefix}/abstract") if add_abstract
    file.puts classes.inject(''){|memo, c| memo << require_statement("#{prefix}/#{ebay_underscore(c.name.gsub(/(Request|Response)$/, ''))}")}
  end
end
write_requires_files(classes) click to toggle source
# File lib/ebay_trading/schema/mapper/ebay_schema_importer.rb, line 70
def write_requires_files(classes)
  requests = classes.select{|c| c.derived_request? }
  responses = classes.select{|c| c.derived_response? }
  types = classes.select{|c| c.type?}

  write_requires_file('requests', requests, true) 
  write_requires_file('responses', requests, true)
  
  write_method_calls(requests)
end