soybean 2.1.5 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +1 -0
 - data/VERSION +1 -1
 - data/bin/soybean +5 -49
 - data/lib/soybean/cli.rb +52 -0
 - data/lib/soybean/generators/mapping_generator.rb +58 -5
 - data/lib/soybean/generators/middleware_generator.rb +37 -0
 - data/lib/soybean/generators/model_generator.rb +6 -3
 - data/lib/soybean/generators/service_generator.rb +6 -2
 - data/lib/soybean/generators/templates/middleware.rb +39 -0
 - data/lib/soybean/generators/types_generator.rb +2 -10
 - data/lib/soybean/interface_builder.rb +3 -2
 - data/lib/soybean.rb +4 -0
 - data/soybean.gemspec +5 -2
 - data/vendor/soap4r/wsdl/soap/class_def_creator.rb +44 -10
 - data/vendor/soap4r/wsdl/xml_schema/importer.rb +1 -1
 - data/vendor/soap4r/xsd/codegen/moduledef.rb +145 -140
 - metadata +22 -19
 
    
        data/Gemfile
    CHANGED
    
    | 
         @@ -3,6 +3,7 @@ source "http://rubygems.org" 
     | 
|
| 
       3 
3 
     | 
    
         
             
            gem 'thor'
         
     | 
| 
       4 
4 
     | 
    
         
             
            gem 'activesupport', '~> 3.1'
         
     | 
| 
       5 
5 
     | 
    
         
             
            gem 'i18n'
         
     | 
| 
      
 6 
     | 
    
         
            +
            #gem "soap4r-middleware-192", "~> 0.8.2", :require => "soap4r-middleware"
         
     | 
| 
       6 
7 
     | 
    
         | 
| 
       7 
8 
     | 
    
         
             
            # Add dependencies to develop your gem here.
         
     | 
| 
       8 
9 
     | 
    
         
             
            # Include everything needed to run rake, tests, features, etc.
         
     | 
    
        data/VERSION
    CHANGED
    
    | 
         @@ -1 +1 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            2. 
     | 
| 
      
 1 
     | 
    
         
            +
            2.2.0
         
     | 
    
        data/bin/soybean
    CHANGED
    
    | 
         @@ -1,54 +1,10 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #!/usr/bin/env ruby
         
     | 
| 
       2 
     | 
    
         
            -
            $:.unshift File.expand_path('../vendor', File.dirname(__FILE__))
         
     | 
| 
       3 
     | 
    
         
            -
            $:.unshift File.expand_path('../vendor/soap4r', File.dirname(__FILE__))
         
     | 
| 
       4 
     | 
    
         
            -
            $:.unshift File.expand_path('../lib', File.dirname(__FILE__))
         
     | 
| 
       5 
     | 
    
         
            -
            require 'thor'
         
     | 
| 
       6 
     | 
    
         
            -
            require 'thor/actions'
         
     | 
| 
       7 
     | 
    
         
            -
            require 'soybean'
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
            class Soybean::CLI < Thor
         
     | 
| 
       11 
     | 
    
         
            -
              include Thor::Actions
         
     | 
| 
       12 
     | 
    
         
            -
              class_options :quiet => :boolean, :force => :boolean, :pretend => :boolean
         
     | 
| 
       13 
     | 
    
         
            -
              class_option :remove, :type => :boolean, :aliases => [:undo]
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
              desc "types [PATH_TO_XSD]", "Generate Ruby classes for xsd-schema from file_path.xsd"
         
     | 
| 
       16 
     | 
    
         
            -
              def types(location, destination = '.')
         
     | 
| 
       17 
     | 
    
         
            -
                Soybean::Generators::TypesGenerator.new(URI.parse(location)).generate do |filename, content|
         
     | 
| 
       18 
     | 
    
         
            -
                  if options[:remove]
         
     | 
| 
       19 
     | 
    
         
            -
                    remove_file File.join(destination, filename), options
         
     | 
| 
       20 
     | 
    
         
            -
                  else
         
     | 
| 
       21 
     | 
    
         
            -
                    create_file File.join(destination, filename), content, options
         
     | 
| 
       22 
     | 
    
         
            -
                  end
         
     | 
| 
       23 
     | 
    
         
            -
                end
         
     | 
| 
       24 
     | 
    
         
            -
              end
         
     | 
| 
       25 
2 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
               
     | 
| 
       28 
     | 
    
         
            -
                Soybean::Generators::ServiceGenerator.new(dir, wsdl, spec_dir(dir)).generate do |filename, content|
         
     | 
| 
       29 
     | 
    
         
            -
                  if options[:remove]
         
     | 
| 
       30 
     | 
    
         
            -
                    remove_file filename, options
         
     | 
| 
       31 
     | 
    
         
            -
                  else
         
     | 
| 
       32 
     | 
    
         
            -
                    create_file filename, content, options
         
     | 
| 
       33 
     | 
    
         
            -
                  end
         
     | 
| 
       34 
     | 
    
         
            -
                end
         
     | 
| 
       35 
     | 
    
         
            -
              end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
              desc "version", "Show current version"
         
     | 
| 
       38 
     | 
    
         
            -
              def version
         
     | 
| 
       39 
     | 
    
         
            -
                puts File.read File.expand_path('../../VERSION', __FILE__)
         
     | 
| 
       40 
     | 
    
         
            -
              end
         
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
              no_tasks do
         
     | 
| 
       43 
     | 
    
         
            -
                def spec_dir(dir)
         
     | 
| 
       44 
     | 
    
         
            -
                  default_spec_dir = "spec/#{dir}/models"
         
     | 
| 
       45 
     | 
    
         
            -
                  if options[:force]
         
     | 
| 
       46 
     | 
    
         
            -
                    default_spec_dir
         
     | 
| 
       47 
     | 
    
         
            -
                  else
         
     | 
| 
       48 
     | 
    
         
            -
                    ask("Spec directory: '#{default_spec_dir}'? ").presence || default_spec_dir
         
     | 
| 
       49 
     | 
    
         
            -
                  end
         
     | 
| 
       50 
     | 
    
         
            -
                end
         
     | 
| 
       51 
     | 
    
         
            -
              end
         
     | 
| 
      
 3 
     | 
    
         
            +
            if File.exists?(File.join(File.expand_path('../..', __FILE__), '.git'))
         
     | 
| 
      
 4 
     | 
    
         
            +
              $:.unshift File.expand_path('../lib', File.dirname(__FILE__))
         
     | 
| 
       52 
5 
     | 
    
         
             
            end
         
     | 
| 
       53 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
            require 'soybean'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'soybean/cli'
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       54 
10 
     | 
    
         
             
            Soybean::CLI.start
         
     | 
    
        data/lib/soybean/cli.rb
    ADDED
    
    | 
         @@ -0,0 +1,52 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'thor'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'thor/actions'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            class Soybean::CLI < Thor
         
     | 
| 
      
 5 
     | 
    
         
            +
              include Thor::Actions
         
     | 
| 
      
 6 
     | 
    
         
            +
              class_options :quiet => :boolean, :force => :boolean, :pretend => :boolean
         
     | 
| 
      
 7 
     | 
    
         
            +
              class_option :remove, :type => :boolean, :aliases => [:undo]
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              map "-v" => :version
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              desc "types [PATH_TO_XSD]", "Generate Ruby classes for xsd-schema from file_path.xsd"
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              def types(location, destination = '.')
         
     | 
| 
      
 15 
     | 
    
         
            +
                Soybean::Generators::TypesGenerator.new(URI.parse(location)).generate do |filename, content|
         
     | 
| 
      
 16 
     | 
    
         
            +
                  if options[:remove]
         
     | 
| 
      
 17 
     | 
    
         
            +
                    remove_file File.join(destination, filename), options
         
     | 
| 
      
 18 
     | 
    
         
            +
                  else
         
     | 
| 
      
 19 
     | 
    
         
            +
                    create_file File.join(destination, filename), content, options
         
     | 
| 
      
 20 
     | 
    
         
            +
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              desc "service [PATH_TO_WSDL] [DESTINATION_DIR]", "Generate classes for WebService from WSDL"
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
              def service(wsdl, dir)
         
     | 
| 
      
 27 
     | 
    
         
            +
                Soybean::Generators::ServiceGenerator.new(dir, wsdl, spec_dir(dir)).generate do |filename, content|
         
     | 
| 
      
 28 
     | 
    
         
            +
                  if options[:remove]
         
     | 
| 
      
 29 
     | 
    
         
            +
                    remove_file filename, options
         
     | 
| 
      
 30 
     | 
    
         
            +
                  else
         
     | 
| 
      
 31 
     | 
    
         
            +
                    create_file filename, content, options
         
     | 
| 
      
 32 
     | 
    
         
            +
                  end
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              desc "version", "Show current version"
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
              def version
         
     | 
| 
      
 39 
     | 
    
         
            +
                puts Soybean::VERSION
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              no_tasks do
         
     | 
| 
      
 43 
     | 
    
         
            +
                def spec_dir(dir)
         
     | 
| 
      
 44 
     | 
    
         
            +
                  default_spec_dir = "spec/#{dir}/models"
         
     | 
| 
      
 45 
     | 
    
         
            +
                  if options[:force]
         
     | 
| 
      
 46 
     | 
    
         
            +
                    default_spec_dir
         
     | 
| 
      
 47 
     | 
    
         
            +
                  else
         
     | 
| 
      
 48 
     | 
    
         
            +
                    ask("Spec directory: '#{default_spec_dir}'? ").presence || default_spec_dir
         
     | 
| 
      
 49 
     | 
    
         
            +
                  end
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -9,9 +9,10 @@ module Soybean 
     | 
|
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
                  attr_reader :name
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
                  def initialize(schema)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  def initialize(schema, wsdl)
         
     | 
| 
       13 
13 
     | 
    
         
             
                    @schema = schema
         
     | 
| 
       14 
     | 
    
         
            -
                    @ 
     | 
| 
      
 14 
     | 
    
         
            +
                    @wsdl = wsdl
         
     | 
| 
      
 15 
     | 
    
         
            +
                    @name = namespace.underscore
         
     | 
| 
       15 
16 
     | 
    
         
             
                    @name_creator = WSDL::SOAP::ClassNameCreator.new
         
     | 
| 
       16 
17 
     | 
    
         
             
                    @defined_const = {}
         
     | 
| 
       17 
18 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -34,7 +35,13 @@ module Soybean 
     | 
|
| 
       34 
35 
     | 
    
         
             
                    end
         
     | 
| 
       35 
36 
     | 
    
         | 
| 
       36 
37 
     | 
    
         
             
                    registry = ModuleDef.new("Mappings", [m])
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                    @schema.importedschema.values.map(&:targetnamespace).map do |ns|
         
     | 
| 
      
 40 
     | 
    
         
            +
                      registry.def_require('mappings/'+URI.parse(ns).path[1..-2].underscore)
         
     | 
| 
      
 41 
     | 
    
         
            +
                    end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                    registry.def_require(type_path)
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
       38 
45 
     | 
    
         
             
                    registry.def_code('EncodedRegistry ||= ::SOAP::Mapping::EncodedRegistry.new')
         
     | 
| 
       39 
46 
     | 
    
         
             
                    registry.def_code('LiteralRegistry ||= ::SOAP::Mapping::LiteralRegistry.new')
         
     | 
| 
       40 
47 
     | 
    
         | 
| 
         @@ -46,11 +53,11 @@ module Soybean 
     | 
|
| 
       46 
53 
     | 
    
         
             
                  end
         
     | 
| 
       47 
54 
     | 
    
         | 
| 
       48 
55 
     | 
    
         
             
                  def literal_creator
         
     | 
| 
       49 
     | 
    
         
            -
                    LiteralMappingRegistryCreator.new(@schema, @name_creator,  
     | 
| 
      
 56 
     | 
    
         
            +
                    LiteralMappingRegistryCreator.new(@schema, @name_creator, module_name, @defined_const, mapping_cache[:literal])
         
     | 
| 
       50 
57 
     | 
    
         
             
                  end
         
     | 
| 
       51 
58 
     | 
    
         | 
| 
       52 
59 
     | 
    
         
             
                  def encoded_creator
         
     | 
| 
       53 
     | 
    
         
            -
                    EncodedMappingRegistryCreator.new(@schema, @name_creator,  
     | 
| 
      
 60 
     | 
    
         
            +
                    EncodedMappingRegistryCreator.new(@schema, @name_creator, module_name, @defined_const, mapping_cache[:encoded])
         
     | 
| 
       54 
61 
     | 
    
         
             
                  end
         
     | 
| 
       55 
62 
     | 
    
         | 
| 
       56 
63 
     | 
    
         
             
                  def name_from_namespace(ns)
         
     | 
| 
         @@ -58,6 +65,18 @@ module Soybean 
     | 
|
| 
       58 
65 
     | 
    
         
             
                    (name || 'base').underscore.gsub(/_service$/, '')
         
     | 
| 
       59 
66 
     | 
    
         
             
                  end
         
     | 
| 
       60 
67 
     | 
    
         | 
| 
      
 68 
     | 
    
         
            +
                  def namespace
         
     | 
| 
      
 69 
     | 
    
         
            +
                    URI.parse(@schema.targetnamespace).path[1..-2]
         
     | 
| 
      
 70 
     | 
    
         
            +
                  end
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                  def type_path
         
     | 
| 
      
 73 
     | 
    
         
            +
                    "types/" + namespace.underscore
         
     | 
| 
      
 74 
     | 
    
         
            +
                  end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                  def module_name
         
     | 
| 
      
 77 
     | 
    
         
            +
                    "::" + namespace.camelize
         
     | 
| 
      
 78 
     | 
    
         
            +
                  end
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
       61 
80 
     | 
    
         
             
                  class ModuleDef < XSD::CodeGen::ModuleDef
         
     | 
| 
       62 
81 
     | 
    
         
             
                    def initialize(name, modules = [])
         
     | 
| 
       63 
82 
     | 
    
         
             
                      super(name)
         
     | 
| 
         @@ -100,6 +119,40 @@ module Soybean 
     | 
|
| 
       100 
119 
     | 
    
         
             
                      buf.gsub(/^\s+$/, '')
         
     | 
| 
       101 
120 
     | 
    
         
             
                    end
         
     | 
| 
       102 
121 
     | 
    
         
             
                  end
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
                  class MethodDefCreator < WSDL::SOAP::MethodDefCreator
         
     | 
| 
      
 124 
     | 
    
         
            +
                    private
         
     | 
| 
      
 125 
     | 
    
         
            +
                    def dump_method(mdef)
         
     | 
| 
      
 126 
     | 
    
         
            +
                      style = mdef.style
         
     | 
| 
      
 127 
     | 
    
         
            +
                      inputuse = mdef.inputuse
         
     | 
| 
      
 128 
     | 
    
         
            +
                      outputuse = mdef.outputuse
         
     | 
| 
      
 129 
     | 
    
         
            +
                      paramstr = param2str(mdef.parameters)
         
     | 
| 
      
 130 
     | 
    
         
            +
                      if paramstr.empty?
         
     | 
| 
      
 131 
     | 
    
         
            +
                        paramstr = '[]'
         
     | 
| 
      
 132 
     | 
    
         
            +
                      else
         
     | 
| 
      
 133 
     | 
    
         
            +
                        paramstr = "[ " << paramstr.split(/\r?\n/).join("\n    ") << " ]"
         
     | 
| 
      
 134 
     | 
    
         
            +
                      end
         
     | 
| 
      
 135 
     | 
    
         
            +
                      definitions = <<__EOD__
         
     | 
| 
      
 136 
     | 
    
         
            +
            #{ndq(mdef.soapaction)},
         
     | 
| 
      
 137 
     | 
    
         
            +
              #{dq(mdef.name).underscore},
         
     | 
| 
      
 138 
     | 
    
         
            +
              #{paramstr},
         
     | 
| 
      
 139 
     | 
    
         
            +
              { :request_style =>  #{nsym(style)}, :request_use =>  #{nsym(inputuse)},
         
     | 
| 
      
 140 
     | 
    
         
            +
                :response_style => #{nsym(style)}, :response_use => #{nsym(outputuse)},
         
     | 
| 
      
 141 
     | 
    
         
            +
                :faults => #{mdef.faults.inspect} }
         
     | 
| 
      
 142 
     | 
    
         
            +
            __EOD__
         
     | 
| 
      
 143 
     | 
    
         
            +
                      if style == :rpc
         
     | 
| 
      
 144 
     | 
    
         
            +
                        assign_const(mdef.qname.namespace, 'Ns')
         
     | 
| 
      
 145 
     | 
    
         
            +
                        return <<__EOD__
         
     | 
| 
      
 146 
     | 
    
         
            +
            [ #{dqname(mdef.qname)},
         
     | 
| 
      
 147 
     | 
    
         
            +
              #{definitions}]
         
     | 
| 
      
 148 
     | 
    
         
            +
            __EOD__
         
     | 
| 
      
 149 
     | 
    
         
            +
                      else
         
     | 
| 
      
 150 
     | 
    
         
            +
                        return <<__EOD__
         
     | 
| 
      
 151 
     | 
    
         
            +
            [ #{definitions}]
         
     | 
| 
      
 152 
     | 
    
         
            +
            __EOD__
         
     | 
| 
      
 153 
     | 
    
         
            +
                      end
         
     | 
| 
      
 154 
     | 
    
         
            +
                    end
         
     | 
| 
      
 155 
     | 
    
         
            +
                  end
         
     | 
| 
       103 
156 
     | 
    
         
             
                end
         
     | 
| 
       104 
157 
     | 
    
         
             
              end
         
     | 
| 
       105 
158 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,37 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Soybean
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Generators
         
     | 
| 
      
 3 
     | 
    
         
            +
                class MiddlewareGenerator
         
     | 
| 
      
 4 
     | 
    
         
            +
                  include BaseGenerator
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
                  attr_reader :name, :model
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                  delegate :wsdl, :to => :model
         
     | 
| 
      
 9 
     | 
    
         
            +
                  delegate :class_name, :interface_name, :to => :model, :prefix => true
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  def initialize(model)
         
     | 
| 
      
 12 
     | 
    
         
            +
                    @model = model
         
     | 
| 
      
 13 
     | 
    
         
            +
                    @name = (wsdl.name.name.underscore.gsub(/service$/, '') rescue 'base') + 'middleware'
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                  def dir
         
     | 
| 
      
 17 
     | 
    
         
            +
                    'middlewares'
         
     | 
| 
      
 18 
     | 
    
         
            +
                  end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                  def generate
         
     | 
| 
      
 21 
     | 
    
         
            +
                    source = File.expand_path("../templates/middleware.rb", __FILE__)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    context = instance_eval('binding')
         
     | 
| 
      
 23 
     | 
    
         
            +
                    content = ERB.new(::File.binread(source), nil, '-').result(context)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    content
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  def class_name
         
     | 
| 
      
 28 
     | 
    
         
            +
                    @name.camelize
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                  def endpoint_path
         
     | 
| 
      
 32 
     | 
    
         
            +
                    model_class_name
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
              end
         
     | 
| 
      
 37 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -7,14 +7,17 @@ module Soybean 
     | 
|
| 
       7 
7 
     | 
    
         | 
| 
       8 
8 
     | 
    
         
             
                  def initialize(wsdl)
         
     | 
| 
       9 
9 
     | 
    
         
             
                    @wsdl = wsdl
         
     | 
| 
       10 
     | 
    
         
            -
                    @name = (wsdl.name.name.underscore.gsub(/service$/,'') rescue 'base') + 'service'
         
     | 
| 
      
 10 
     | 
    
         
            +
                    @name = (wsdl.name.name.underscore.gsub(/service$/, '') rescue 'base') + 'service'
         
     | 
| 
       11 
11 
     | 
    
         
             
                  end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
                  def dir
         
     | 
| 
       14 
     | 
    
         
            -
                    ' 
     | 
| 
      
 14 
     | 
    
         
            +
                    ''
         
     | 
| 
       15 
15 
     | 
    
         
             
                  end
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
17 
     | 
    
         
             
                  def generate
         
     | 
| 
      
 18 
     | 
    
         
            +
                    @wsdl.importedschema.map do |uri, schema|
         
     | 
| 
      
 19 
     | 
    
         
            +
                      "require 'mappings/#{URI.parse(schema.targetnamespace).path[1..-2].underscore}'\n"
         
     | 
| 
      
 20 
     | 
    
         
            +
                    end.join +
         
     | 
| 
       18 
21 
     | 
    
         
             
                    "class #{class_name} < #{interface_name}\nend"
         
     | 
| 
       19 
22 
     | 
    
         
             
                  end
         
     | 
| 
       20 
23 
     | 
    
         | 
| 
         @@ -23,7 +26,7 @@ module Soybean 
     | 
|
| 
       23 
26 
     | 
    
         
             
                  end
         
     | 
| 
       24 
27 
     | 
    
         | 
| 
       25 
28 
     | 
    
         
             
                  def interface_name
         
     | 
| 
       26 
     | 
    
         
            -
                    @name.camelize.gsub(/Service$/,'Interface')
         
     | 
| 
      
 29 
     | 
    
         
            +
                    @name.camelize.gsub(/Service$/, 'Interface')
         
     | 
| 
       27 
30 
     | 
    
         
             
                  end
         
     | 
| 
       28 
31 
     | 
    
         
             
                end
         
     | 
| 
       29 
32 
     | 
    
         
             
              end
         
     | 
| 
         @@ -15,13 +15,13 @@ module Soybean 
     | 
|
| 
       15 
15 
     | 
    
         
             
                  end
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
       17 
17 
     | 
    
         
             
                  def generate
         
     | 
| 
       18 
     | 
    
         
            -
                    (schemes + mappings + interface + model + specs).map do |generator|
         
     | 
| 
      
 18 
     | 
    
         
            +
                    (schemes + mappings + interface + model + specs + middleware).map do |generator|
         
     | 
| 
       19 
19 
     | 
    
         
             
                      yield generator.fullpath(path), generator.generate
         
     | 
| 
       20 
20 
     | 
    
         
             
                    end
         
     | 
| 
       21 
21 
     | 
    
         
             
                  end
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                  def mappings
         
     | 
| 
       24 
     | 
    
         
            -
                    @mappings ||= schemes.map { |gen| MappingGenerator.new(gen.xsd) }
         
     | 
| 
      
 24 
     | 
    
         
            +
                    @mappings ||= schemes.map { |gen| MappingGenerator.new(gen.xsd, @wsdl) }
         
     | 
| 
       25 
25 
     | 
    
         
             
                  end
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
                  def interface
         
     | 
| 
         @@ -32,6 +32,10 @@ module Soybean 
     | 
|
| 
       32 
32 
     | 
    
         
             
                    @model ||= [ModelGenerator.new(@wsdl)]
         
     | 
| 
       33 
33 
     | 
    
         
             
                  end
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
      
 35 
     | 
    
         
            +
                  def middleware
         
     | 
| 
      
 36 
     | 
    
         
            +
                    @middleware ||= model.map { |m| MiddlewareGenerator.new(m) }
         
     | 
| 
      
 37 
     | 
    
         
            +
                  end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
       35 
39 
     | 
    
         
             
                  def specs
         
     | 
| 
       36 
40 
     | 
    
         
             
                    @specs ||= model.map { |m| ModelSpecGenerator.new(m, @spec_dir) }
         
     | 
| 
       37 
41 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -0,0 +1,39 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Middlewares
         
     | 
| 
      
 2 
     | 
    
         
            +
              class <%= class_name %> < Soap4r::Middleware::Base
         
     | 
| 
      
 3 
     | 
    
         
            +
                setup do
         
     | 
| 
      
 4 
     | 
    
         
            +
                  self.endpoint = %r(^/<%= model_class_name %>)
         
     | 
| 
      
 5 
     | 
    
         
            +
                  service = <%= model_class_name %>.new
         
     | 
| 
      
 6 
     | 
    
         
            +
                  <%= model_interface_name %>::Methods.each do |definitions|
         
     | 
| 
      
 7 
     | 
    
         
            +
                    opt = definitions.last
         
     | 
| 
      
 8 
     | 
    
         
            +
                    if opt[:request_style] == :document
         
     | 
| 
      
 9 
     | 
    
         
            +
                      self.router.add_document_operation(service, *definitions)
         
     | 
| 
      
 10 
     | 
    
         
            +
                    else
         
     | 
| 
      
 11 
     | 
    
         
            +
                      self.router.add_rpc_operation(service, *definitions)
         
     | 
| 
      
 12 
     | 
    
         
            +
                    end
         
     | 
| 
      
 13 
     | 
    
         
            +
                  end
         
     | 
| 
      
 14 
     | 
    
         
            +
                  self.mapping_registry = Mappings::EncodedRegistry
         
     | 
| 
      
 15 
     | 
    
         
            +
                  self.literal_mapping_registry = Mappings::LiteralRegistry
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                def call(env)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  begin
         
     | 
| 
      
 20 
     | 
    
         
            +
                    if env['PATH_INFO'].match(self.class.endpoint)
         
     | 
| 
      
 21 
     | 
    
         
            +
                      handle(env)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    else
         
     | 
| 
      
 23 
     | 
    
         
            +
                      # we can act as both a middleware and an app
         
     | 
| 
      
 24 
     | 
    
         
            +
                      @app ?
         
     | 
| 
      
 25 
     | 
    
         
            +
                          @app.call(env) :
         
     | 
| 
      
 26 
     | 
    
         
            +
                          [404, {"Content-Type" => "text/plain"}, ["404 - Not Found"]]
         
     | 
| 
      
 27 
     | 
    
         
            +
                    end
         
     | 
| 
      
 28 
     | 
    
         
            +
                  rescue => e
         
     | 
| 
      
 29 
     | 
    
         
            +
                    puts e.message
         
     | 
| 
      
 30 
     | 
    
         
            +
                    xml = Nokogiri::XML(e.message)
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                    #xml.search('faultactor, detail, ivars, item').each { |elem| elem.remove }
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                    [200, {'Allow' => 'POST',
         
     | 
| 
      
 35 
     | 
    
         
            +
                           'Content-Type' => 'text/xml'}, [xml.to_s]]
         
     | 
| 
      
 36 
     | 
    
         
            +
                  end
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -8,9 +8,9 @@ module Soybean 
     | 
|
| 
       8 
8 
     | 
    
         
             
                  attr_reader :name
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
                  def initialize(url)
         
     | 
| 
       11 
     | 
    
         
            -
                    @name = xsd_name(url.path)
         
     | 
| 
       12 
11 
     | 
    
         
             
                    @definitions = import_scheme(url)
         
     | 
| 
       13 
     | 
    
         
            -
                     
     | 
| 
      
 12 
     | 
    
         
            +
                    @name = type_path
         
     | 
| 
      
 13 
     | 
    
         
            +
                    super(@definitions, WSDL::SOAP::ClassNameCreator.new, module_name)
         
     | 
| 
       14 
14 
     | 
    
         
             
                  end
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                  def xsd
         
     | 
| 
         @@ -49,14 +49,6 @@ module Soybean 
     | 
|
| 
       49 
49 
     | 
    
         | 
| 
       50 
50 
     | 
    
         
             
                  protected
         
     | 
| 
       51 
51 
     | 
    
         | 
| 
       52 
     | 
    
         
            -
                  def import_scheme(url)
         
     | 
| 
       53 
     | 
    
         
            -
                    WSDL::XMLSchema::Importer.import(url.path)
         
     | 
| 
       54 
     | 
    
         
            -
                  end
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                  def xsd_name(path)
         
     | 
| 
       57 
     | 
    
         
            -
                    Pathname.new(path).basename('.*').to_s.underscore.gsub(/_service$/, '')
         
     | 
| 
       58 
     | 
    
         
            -
                  end
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
52 
     | 
    
         
             
                  def with_cache
         
     | 
| 
       61 
53 
     | 
    
         
             
                    result = yield
         
     | 
| 
       62 
54 
     | 
    
         
             
                    if !classes_cache.key?(result.name) && result
         
     | 
| 
         @@ -62,8 +62,6 @@ module Soybean 
     | 
|
| 
       62 
62 
     | 
    
         
             
                def dump_porttype
         
     | 
| 
       63 
63 
     | 
    
         
             
                  class_name = mapped_class_basename(@porttype.name, @modulepath)
         
     | 
| 
       64 
64 
     | 
    
         
             
                  c = XSD::CodeGen::ClassDef.new(class_name, 'Soybean::Interface')
         
     | 
| 
       65 
     | 
    
         
            -
                  methoddef = MethodDefCreator.new(@definitions, @name_creator, @modulepath, {}).dump(@porttype.name)
         
     | 
| 
       66 
     | 
    
         
            -
                  c.def_code %Q{Methods = [\n#{methoddef.gsub(/^/, "  ")}\n]}
         
     | 
| 
       67 
65 
     | 
    
         | 
| 
       68 
66 
     | 
    
         
             
                  element_definitions = @definitions.collect_elements
         
     | 
| 
       69 
67 
     | 
    
         
             
                  actions.each do |method_name, params, operation|
         
     | 
| 
         @@ -77,6 +75,9 @@ module Soybean 
     | 
|
| 
       77 
75 
     | 
    
         
             
                    c.add_method(m)
         
     | 
| 
       78 
76 
     | 
    
         
             
                  end
         
     | 
| 
       79 
77 
     | 
    
         | 
| 
      
 78 
     | 
    
         
            +
                  methoddef = MethodDefCreator.new(@definitions, @name_creator, @modulepath, {}).dump(@porttype.name)
         
     | 
| 
      
 79 
     | 
    
         
            +
                  c.def_code %Q{Methods = [\n#{methoddef.gsub(/^/, "  ")}\n]}
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
       80 
81 
     | 
    
         
             
                  c.dump
         
     | 
| 
       81 
82 
     | 
    
         
             
                end
         
     | 
| 
       82 
83 
     | 
    
         | 
    
        data/lib/soybean.rb
    CHANGED
    
    | 
         @@ -5,10 +5,14 @@ require 'active_support/core_ext/array/grouping' 
     | 
|
| 
       5 
5 
     | 
    
         
             
            require 'active_support/deprecation'
         
     | 
| 
       6 
6 
     | 
    
         
             
            require 'active_support/dependencies'
         
     | 
| 
       7 
7 
     | 
    
         
             
            require 'active_support/dependencies/autoload'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'active_support/core_ext/module/delegation'
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            $:.unshift File.absolute_path(File.join(File.dirname(__FILE__), '..', 'vendor/soap4r'))
         
     | 
| 
       8 
11 
     | 
    
         | 
| 
       9 
12 
     | 
    
         
             
            ActiveSupport::Dependencies.autoload_paths << File.absolute_path(File.join(File.dirname(__FILE__), '..', 'vendor/soap4r'))
         
     | 
| 
       10 
13 
     | 
    
         
             
            ActiveSupport::Dependencies.autoload_paths << File.absolute_path(File.join(File.dirname(__FILE__), '..', 'lib'))
         
     | 
| 
       11 
14 
     | 
    
         | 
| 
       12 
15 
     | 
    
         
             
            module Soybean
         
     | 
| 
       13 
16 
     | 
    
         
             
              extend ActiveSupport::Autoload
         
     | 
| 
      
 17 
     | 
    
         
            +
              VERSION = File.read(File.expand_path('../../VERSION', __FILE__))
         
     | 
| 
       14 
18 
     | 
    
         
             
            end
         
     | 
    
        data/soybean.gemspec
    CHANGED
    
    | 
         @@ -5,11 +5,11 @@ 
     | 
|
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         
             
            Gem::Specification.new do |s|
         
     | 
| 
       7 
7 
     | 
    
         
             
              s.name = %q{soybean}
         
     | 
| 
       8 
     | 
    
         
            -
              s.version = "2. 
     | 
| 
      
 8 
     | 
    
         
            +
              s.version = "2.2.0"
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         
     | 
| 
       11 
11 
     | 
    
         
             
              s.authors = ["Anton Sozontov"]
         
     | 
| 
       12 
     | 
    
         
            -
              s.date = %q{2011- 
     | 
| 
      
 12 
     | 
    
         
            +
              s.date = %q{2011-10-07}
         
     | 
| 
       13 
13 
     | 
    
         
             
              s.default_executable = %q{soybean}
         
     | 
| 
       14 
14 
     | 
    
         
             
              s.description = %q{Generate soap web-services from you wsdl. Generate: all classes from xsd, and other.}
         
     | 
| 
       15 
15 
     | 
    
         
             
              s.email = %q{a.sozontov@gmail.com}
         
     | 
| 
         @@ -29,15 +29,18 @@ Gem::Specification.new do |s| 
     | 
|
| 
       29 
29 
     | 
    
         
             
                "VERSION",
         
     | 
| 
       30 
30 
     | 
    
         
             
                "bin/soybean",
         
     | 
| 
       31 
31 
     | 
    
         
             
                "lib/soybean.rb",
         
     | 
| 
      
 32 
     | 
    
         
            +
                "lib/soybean/cli.rb",
         
     | 
| 
       32 
33 
     | 
    
         
             
                "lib/soybean/complex_type.rb",
         
     | 
| 
       33 
34 
     | 
    
         
             
                "lib/soybean/encoded_mapping_registry_creator.rb",
         
     | 
| 
       34 
35 
     | 
    
         
             
                "lib/soybean/generators/base_generator.rb",
         
     | 
| 
       35 
36 
     | 
    
         
             
                "lib/soybean/generators/class_generator.rb",
         
     | 
| 
       36 
37 
     | 
    
         
             
                "lib/soybean/generators/interface_generator.rb",
         
     | 
| 
       37 
38 
     | 
    
         
             
                "lib/soybean/generators/mapping_generator.rb",
         
     | 
| 
      
 39 
     | 
    
         
            +
                "lib/soybean/generators/middleware_generator.rb",
         
     | 
| 
       38 
40 
     | 
    
         
             
                "lib/soybean/generators/model_generator.rb",
         
     | 
| 
       39 
41 
     | 
    
         
             
                "lib/soybean/generators/model_spec_generator.rb",
         
     | 
| 
       40 
42 
     | 
    
         
             
                "lib/soybean/generators/service_generator.rb",
         
     | 
| 
      
 43 
     | 
    
         
            +
                "lib/soybean/generators/templates/middleware.rb",
         
     | 
| 
       41 
44 
     | 
    
         
             
                "lib/soybean/generators/templates/model_spec.rb",
         
     | 
| 
       42 
45 
     | 
    
         
             
                "lib/soybean/generators/types_generator.rb",
         
     | 
| 
       43 
46 
     | 
    
         
             
                "lib/soybean/interface.rb",
         
     | 
| 
         @@ -42,42 +42,76 @@ module WSDL 
     | 
|
| 
       42 
42 
     | 
    
         
             
                    @defined_const = {}
         
     | 
| 
       43 
43 
     | 
    
         
             
                  end
         
     | 
| 
       44 
44 
     | 
    
         | 
| 
      
 45 
     | 
    
         
            +
                  def padding
         
     | 
| 
      
 46 
     | 
    
         
            +
                    @padding ||= "  " * modulepath_split(@modulepath).size
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                  def require_imported_types
         
     | 
| 
      
 50 
     | 
    
         
            +
                    @definitions.importedschema.values.map(&:targetnamespace).map do |ns|
         
     | 
| 
      
 51 
     | 
    
         
            +
                      "require 'types/#{type_path(ns)}'\n"
         
     | 
| 
      
 52 
     | 
    
         
            +
                    end.join
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  def include_imported_types
         
     | 
| 
      
 56 
     | 
    
         
            +
                    @definitions.importedschema.values.map(&:targetnamespace).map do |ns|
         
     | 
| 
      
 57 
     | 
    
         
            +
                      "include ::#{module_name(ns)}\n"
         
     | 
| 
      
 58 
     | 
    
         
            +
                    end.join
         
     | 
| 
      
 59 
     | 
    
         
            +
                  end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                  def import_scheme(url)
         
     | 
| 
      
 62 
     | 
    
         
            +
                    WSDL::XMLSchema::Importer.import(url.path)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                  def namespace(ns=@definitions.targetnamespace)
         
     | 
| 
      
 66 
     | 
    
         
            +
                    URI.parse(ns).path[1..-2]
         
     | 
| 
      
 67 
     | 
    
         
            +
                  end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                  def type_path(ns=@definitions.targetnamespace)
         
     | 
| 
      
 70 
     | 
    
         
            +
                    namespace(ns).underscore
         
     | 
| 
      
 71 
     | 
    
         
            +
                  end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                  def module_name(ns=@definitions.targetnamespace)
         
     | 
| 
      
 74 
     | 
    
         
            +
                    namespace(ns).camelize
         
     | 
| 
      
 75 
     | 
    
         
            +
                  end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
       45 
77 
     | 
    
         
             
                  def dump(type = nil)
         
     | 
| 
       46 
78 
     | 
    
         
             
                    result = "require 'xsd/qname'\n"
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
       47 
80 
     | 
    
         
             
                    # cannot use @modulepath because of multiple classes
         
     | 
| 
       48 
81 
     | 
    
         
             
                    if @modulepath
         
     | 
| 
       49 
82 
     | 
    
         
             
                      result << "\n"
         
     | 
| 
       50 
     | 
    
         
            -
                      result << modulepath_split(@modulepath).collect { |ele| "module #{ele}" }.join(" 
     | 
| 
      
 83 
     | 
    
         
            +
                      result << modulepath_split(@modulepath).each_with_index.collect { |ele, i| ("  " * i) + "module #{ele}" }.join("\n")
         
     | 
| 
       51 
84 
     | 
    
         
             
                      result << "\n\n"
         
     | 
| 
       52 
85 
     | 
    
         
             
                    end
         
     | 
| 
      
 86 
     | 
    
         
            +
                    result << padding + include_imported_types
         
     | 
| 
       53 
87 
     | 
    
         
             
                    str = dump_group(type)
         
     | 
| 
       54 
88 
     | 
    
         
             
                    unless str.empty?
         
     | 
| 
       55 
89 
     | 
    
         
             
                      result << "\n" unless result.empty?
         
     | 
| 
       56 
     | 
    
         
            -
                      result << str
         
     | 
| 
      
 90 
     | 
    
         
            +
                      result << str.gsub("\n", "\n#{padding}")
         
     | 
| 
       57 
91 
     | 
    
         
             
                    end
         
     | 
| 
       58 
92 
     | 
    
         
             
                    str = dump_complextype(type)
         
     | 
| 
       59 
93 
     | 
    
         
             
                    unless str.empty?
         
     | 
| 
       60 
94 
     | 
    
         
             
                      result << "\n" unless result.empty?
         
     | 
| 
       61 
     | 
    
         
            -
                      result << str
         
     | 
| 
      
 95 
     | 
    
         
            +
                      result << padding + str.gsub("\n", "\n#{padding}")
         
     | 
| 
       62 
96 
     | 
    
         
             
                    end
         
     | 
| 
       63 
     | 
    
         
            -
                    str = dump_simpletype(type)
         
     | 
| 
      
 97 
     | 
    
         
            +
                    str = dump_simpletype(type).gsub("\n", "\n#{padding}")
         
     | 
| 
       64 
98 
     | 
    
         
             
                    unless str.empty?
         
     | 
| 
       65 
99 
     | 
    
         
             
                      result << "\n" unless result.empty?
         
     | 
| 
       66 
     | 
    
         
            -
                      result << str
         
     | 
| 
      
 100 
     | 
    
         
            +
                      result << padding + str.gsub("\n", "\n#{padding}")
         
     | 
| 
       67 
101 
     | 
    
         
             
                    end
         
     | 
| 
       68 
     | 
    
         
            -
                    str = dump_element(type)
         
     | 
| 
      
 102 
     | 
    
         
            +
                    str = dump_element(type).gsub("\n", "\n#{padding}")
         
     | 
| 
       69 
103 
     | 
    
         
             
                    unless str.empty?
         
     | 
| 
       70 
104 
     | 
    
         
             
                      result << "\n" unless result.empty?
         
     | 
| 
       71 
     | 
    
         
            -
                      result << str
         
     | 
| 
      
 105 
     | 
    
         
            +
                      result << padding + str.gsub("\n", "\n#{padding}")
         
     | 
| 
       72 
106 
     | 
    
         
             
                    end
         
     | 
| 
       73 
     | 
    
         
            -
                    str = dump_attribute(type)
         
     | 
| 
      
 107 
     | 
    
         
            +
                    str = dump_attribute(type).gsub("\n", "\n#{padding}")
         
     | 
| 
       74 
108 
     | 
    
         
             
                    unless str.empty?
         
     | 
| 
       75 
109 
     | 
    
         
             
                      result << "\n" unless result.empty?
         
     | 
| 
       76 
     | 
    
         
            -
                      result << str
         
     | 
| 
      
 110 
     | 
    
         
            +
                      result << padding + str.gsub("\n", "\n#{padding}")
         
     | 
| 
       77 
111 
     | 
    
         
             
                    end
         
     | 
| 
       78 
112 
     | 
    
         
             
                    if @modulepath
         
     | 
| 
       79 
113 
     | 
    
         
             
                      result << "\n\n"
         
     | 
| 
       80 
     | 
    
         
            -
                      result << modulepath_split(@modulepath).collect { |ele| "end" }.join(" 
     | 
| 
      
 114 
     | 
    
         
            +
                      result << modulepath_split(@modulepath).each_with_index.collect { |ele, i| ("  " * i) + "end" }.reverse.join("\n")
         
     | 
| 
       81 
115 
     | 
    
         
             
                      result << "\n"
         
     | 
| 
       82 
116 
     | 
    
         
             
                    end
         
     | 
| 
       83 
117 
     | 
    
         
             
                    result
         
     | 
| 
         @@ -13,173 +13,178 @@ require 'xsd/codegen/commentdef' 
     | 
|
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
            module XSD
         
     | 
| 
       16 
     | 
    
         
            -
            module CodeGen
         
     | 
| 
      
 16 
     | 
    
         
            +
              module CodeGen
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
     | 
    
         
            -
            class ModuleDef
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
      
 19 
     | 
    
         
            +
                class ModuleDef
         
     | 
| 
      
 20 
     | 
    
         
            +
                  include GenSupport
         
     | 
| 
      
 21 
     | 
    
         
            +
                  include CommentDef
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
      
 23 
     | 
    
         
            +
                  attr_reader :name
         
     | 
| 
      
 24 
     | 
    
         
            +
                  attr_reader :innermodule
         
     | 
| 
       25 
25 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
      
 26 
     | 
    
         
            +
                  def initialize(name)
         
     | 
| 
      
 27 
     | 
    
         
            +
                    @name = name
         
     | 
| 
      
 28 
     | 
    
         
            +
                    @comment = nil
         
     | 
| 
      
 29 
     | 
    
         
            +
                    @const = []
         
     | 
| 
      
 30 
     | 
    
         
            +
                    @code = []
         
     | 
| 
      
 31 
     | 
    
         
            +
                    @requirepath = []
         
     | 
| 
      
 32 
     | 
    
         
            +
                    @methoddef = []
         
     | 
| 
      
 33 
     | 
    
         
            +
                    @innermodule = []
         
     | 
| 
      
 34 
     | 
    
         
            +
                  end
         
     | 
| 
       35 
35 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
      
 36 
     | 
    
         
            +
                  def def_require(path)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    @requirepath << path
         
     | 
| 
      
 38 
     | 
    
         
            +
                  end
         
     | 
| 
       39 
39 
     | 
    
         | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
      
 40 
     | 
    
         
            +
                  def def_const(const, value)
         
     | 
| 
      
 41 
     | 
    
         
            +
                    unless safeconstname?(const)
         
     | 
| 
      
 42 
     | 
    
         
            +
                      raise ArgumentError.new("#{const} seems to be unsafe")
         
     | 
| 
      
 43 
     | 
    
         
            +
                    end
         
     | 
| 
      
 44 
     | 
    
         
            +
                    @const << [const, value]
         
     | 
| 
      
 45 
     | 
    
         
            +
                  end
         
     | 
| 
       46 
46 
     | 
    
         | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
      
 47 
     | 
    
         
            +
                  def def_code(code)
         
     | 
| 
      
 48 
     | 
    
         
            +
                    @code << code
         
     | 
| 
      
 49 
     | 
    
         
            +
                  end
         
     | 
| 
       50 
50 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
              alias def_publicmethod def_method
         
     | 
| 
      
 51 
     | 
    
         
            +
                  def def_method(name, *params)
         
     | 
| 
      
 52 
     | 
    
         
            +
                    add_method(MethodDef.new(name, *params) { yield if block_given? }, :public)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
       55 
54 
     | 
    
         | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
                add_method(MethodDef.new(name, *params) { yield if block_given? },
         
     | 
| 
       58 
     | 
    
         
            -
                  :protected)
         
     | 
| 
       59 
     | 
    
         
            -
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
                  alias def_publicmethod def_method
         
     | 
| 
       60 
56 
     | 
    
         | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
      
 57 
     | 
    
         
            +
                  def def_protectedmethod(name, *params)
         
     | 
| 
      
 58 
     | 
    
         
            +
                    add_method(MethodDef.new(name, *params) { yield if block_given? },
         
     | 
| 
      
 59 
     | 
    
         
            +
                               :protected)
         
     | 
| 
      
 60 
     | 
    
         
            +
                  end
         
     | 
| 
       64 
61 
     | 
    
         | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
             
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
      
 62 
     | 
    
         
            +
                  def def_privatemethod(name, *params)
         
     | 
| 
      
 63 
     | 
    
         
            +
                    add_method(MethodDef.new(name, *params) { yield if block_given? }, :private)
         
     | 
| 
      
 64 
     | 
    
         
            +
                  end
         
     | 
| 
       68 
65 
     | 
    
         | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
             
     | 
| 
       72 
     | 
    
         
            -
                  buf << dump_requirepath 
         
     | 
| 
       73 
     | 
    
         
            -
                end
         
     | 
| 
       74 
     | 
    
         
            -
                buf << dump_emptyline unless buf.empty?
         
     | 
| 
       75 
     | 
    
         
            -
                package = @name.split(/::/)[0..-2]
         
     | 
| 
       76 
     | 
    
         
            -
                buf << dump_package_def(package) unless package.empty?
         
     | 
| 
       77 
     | 
    
         
            -
                buf << dump_comment if @comment
         
     | 
| 
       78 
     | 
    
         
            -
                buf << dump_module_def
         
     | 
| 
       79 
     | 
    
         
            -
                spacer = false
         
     | 
| 
       80 
     | 
    
         
            -
                unless @const.empty?
         
     | 
| 
       81 
     | 
    
         
            -
                  buf << dump_emptyline if spacer
         
     | 
| 
       82 
     | 
    
         
            -
                  spacer = true
         
     | 
| 
       83 
     | 
    
         
            -
                  buf << dump_const
         
     | 
| 
       84 
     | 
    
         
            -
                end
         
     | 
| 
       85 
     | 
    
         
            -
                unless @innermodule.empty?
         
     | 
| 
       86 
     | 
    
         
            -
                  buf << dump_emptyline # always add 1 empty line
         
     | 
| 
       87 
     | 
    
         
            -
                  spacer = true
         
     | 
| 
       88 
     | 
    
         
            -
                  buf << dump_innermodule
         
     | 
| 
       89 
     | 
    
         
            -
                end
         
     | 
| 
       90 
     | 
    
         
            -
                unless @code.empty?
         
     | 
| 
       91 
     | 
    
         
            -
                  buf << dump_emptyline if spacer
         
     | 
| 
       92 
     | 
    
         
            -
                  spacer = true
         
     | 
| 
       93 
     | 
    
         
            -
                  buf << dump_code
         
     | 
| 
       94 
     | 
    
         
            -
                end
         
     | 
| 
       95 
     | 
    
         
            -
                unless @methoddef.empty?
         
     | 
| 
       96 
     | 
    
         
            -
                  buf << dump_emptyline if spacer
         
     | 
| 
       97 
     | 
    
         
            -
                  spacer = true
         
     | 
| 
       98 
     | 
    
         
            -
                  buf << dump_methods
         
     | 
| 
       99 
     | 
    
         
            -
                end
         
     | 
| 
       100 
     | 
    
         
            -
                buf << dump_module_def_end
         
     | 
| 
       101 
     | 
    
         
            -
                buf << dump_package_def_end(package) unless package.empty?
         
     | 
| 
       102 
     | 
    
         
            -
                buf.gsub(/^\s+$/, '')
         
     | 
| 
       103 
     | 
    
         
            -
              end
         
     | 
| 
      
 66 
     | 
    
         
            +
                  def add_method(m, visibility = :public)
         
     | 
| 
      
 67 
     | 
    
         
            +
                    @methoddef << [visibility, m]
         
     | 
| 
      
 68 
     | 
    
         
            +
                  end
         
     | 
| 
       104 
69 
     | 
    
         | 
| 
       105 
     | 
    
         
            -
             
     | 
| 
      
 70 
     | 
    
         
            +
                  def dump
         
     | 
| 
      
 71 
     | 
    
         
            +
                    buf = ""
         
     | 
| 
      
 72 
     | 
    
         
            +
                    unless @requirepath.empty?
         
     | 
| 
      
 73 
     | 
    
         
            +
                      buf << dump_requirepath
         
     | 
| 
      
 74 
     | 
    
         
            +
                    end
         
     | 
| 
      
 75 
     | 
    
         
            +
                    buf << dump_emptyline unless buf.empty?
         
     | 
| 
      
 76 
     | 
    
         
            +
                    package = @name.split(/::/)[0..-2]
         
     | 
| 
      
 77 
     | 
    
         
            +
                    buf << dump_package_def(package) unless package.empty?
         
     | 
| 
      
 78 
     | 
    
         
            +
                    buf << dump_comment if @comment
         
     | 
| 
      
 79 
     | 
    
         
            +
                    buf << dump_module_def
         
     | 
| 
      
 80 
     | 
    
         
            +
                    spacer = false
         
     | 
| 
      
 81 
     | 
    
         
            +
                    unless @const.empty?
         
     | 
| 
      
 82 
     | 
    
         
            +
                      buf << dump_emptyline if spacer
         
     | 
| 
      
 83 
     | 
    
         
            +
                      spacer = true
         
     | 
| 
      
 84 
     | 
    
         
            +
                      buf << dump_const
         
     | 
| 
      
 85 
     | 
    
         
            +
                    end
         
     | 
| 
      
 86 
     | 
    
         
            +
                    unless @innermodule.empty?
         
     | 
| 
      
 87 
     | 
    
         
            +
                      buf << dump_emptyline # always add 1 empty line
         
     | 
| 
      
 88 
     | 
    
         
            +
                      spacer = true
         
     | 
| 
      
 89 
     | 
    
         
            +
                      buf << dump_innermodule
         
     | 
| 
      
 90 
     | 
    
         
            +
                    end
         
     | 
| 
      
 91 
     | 
    
         
            +
                    unless @code.empty?
         
     | 
| 
      
 92 
     | 
    
         
            +
                      buf << dump_emptyline if spacer
         
     | 
| 
      
 93 
     | 
    
         
            +
                      spacer = true
         
     | 
| 
      
 94 
     | 
    
         
            +
                      buf << dump_code
         
     | 
| 
      
 95 
     | 
    
         
            +
                    end
         
     | 
| 
      
 96 
     | 
    
         
            +
                    unless @methoddef.empty?
         
     | 
| 
      
 97 
     | 
    
         
            +
                      buf << dump_emptyline if spacer
         
     | 
| 
      
 98 
     | 
    
         
            +
                      spacer = true
         
     | 
| 
      
 99 
     | 
    
         
            +
                      buf << dump_methods
         
     | 
| 
      
 100 
     | 
    
         
            +
                    end
         
     | 
| 
      
 101 
     | 
    
         
            +
                    buf << dump_module_def_end
         
     | 
| 
      
 102 
     | 
    
         
            +
                    buf << dump_package_def_end(package) unless package.empty?
         
     | 
| 
      
 103 
     | 
    
         
            +
                    buf.gsub(/^\s+$/, '')
         
     | 
| 
      
 104 
     | 
    
         
            +
                  end
         
     | 
| 
       106 
105 
     | 
    
         | 
| 
       107 
     | 
    
         
            -
             
     | 
| 
       108 
     | 
    
         
            -
                format(
         
     | 
| 
       109 
     | 
    
         
            -
                  @requirepath.collect { |path|
         
     | 
| 
       110 
     | 
    
         
            -
                    %Q(require '#{path}')
         
     | 
| 
       111 
     | 
    
         
            -
                  }.join("\n")
         
     | 
| 
       112 
     | 
    
         
            -
                )
         
     | 
| 
       113 
     | 
    
         
            -
              end
         
     | 
| 
      
 106 
     | 
    
         
            +
                  private
         
     | 
| 
       114 
107 
     | 
    
         | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
             
     | 
| 
       117 
     | 
    
         
            -
             
     | 
| 
       118 
     | 
    
         
            -
             
     | 
| 
       119 
     | 
    
         
            -
             
     | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
      
 108 
     | 
    
         
            +
                  def dump_requirepath
         
     | 
| 
      
 109 
     | 
    
         
            +
                    format(
         
     | 
| 
      
 110 
     | 
    
         
            +
                        @requirepath.collect { |path|
         
     | 
| 
      
 111 
     | 
    
         
            +
                          %Q(require '#{path}')
         
     | 
| 
      
 112 
     | 
    
         
            +
                        }.join("\n")
         
     | 
| 
      
 113 
     | 
    
         
            +
                    )
         
     | 
| 
      
 114 
     | 
    
         
            +
                  end
         
     | 
| 
       122 
115 
     | 
    
         | 
| 
       123 
     | 
    
         
            -
             
     | 
| 
       124 
     | 
    
         
            -
             
     | 
| 
       125 
     | 
    
         
            -
             
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
       128 
     | 
    
         
            -
             
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
      
 116 
     | 
    
         
            +
                  def dump_const
         
     | 
| 
      
 117 
     | 
    
         
            +
                    dump_static(
         
     | 
| 
      
 118 
     | 
    
         
            +
                        @const.sort.collect { |var, value|
         
     | 
| 
      
 119 
     | 
    
         
            +
                          %Q(#{var} = #{dump_value(value)})
         
     | 
| 
      
 120 
     | 
    
         
            +
                        }.join("\n")
         
     | 
| 
      
 121 
     | 
    
         
            +
                    )
         
     | 
| 
      
 122 
     | 
    
         
            +
                  end
         
     | 
| 
       130 
123 
     | 
    
         | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
      
 124 
     | 
    
         
            +
                  def dump_innermodule
         
     | 
| 
      
 125 
     | 
    
         
            +
                    dump_static(
         
     | 
| 
      
 126 
     | 
    
         
            +
                        @innermodule.collect { |moduledef|
         
     | 
| 
      
 127 
     | 
    
         
            +
                          moduledef.dump
         
     | 
| 
      
 128 
     | 
    
         
            +
                        }.join("\n")
         
     | 
| 
      
 129 
     | 
    
         
            +
                    )
         
     | 
| 
      
 130 
     | 
    
         
            +
                  end
         
     | 
| 
       134 
131 
     | 
    
         | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
     | 
    
         
            -
             
     | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
      
 132 
     | 
    
         
            +
                  def dump_code
         
     | 
| 
      
 133 
     | 
    
         
            +
                    dump_static(@code.join("\n"))
         
     | 
| 
      
 134 
     | 
    
         
            +
                  end
         
     | 
| 
       138 
135 
     | 
    
         | 
| 
       139 
     | 
    
         
            -
             
     | 
| 
       140 
     | 
    
         
            -
             
     | 
| 
       141 
     | 
    
         
            -
                @methoddef.each do |visibility, method|
         
     | 
| 
       142 
     | 
    
         
            -
                  (methods[visibility] ||= []) << method
         
     | 
| 
       143 
     | 
    
         
            -
                end
         
     | 
| 
       144 
     | 
    
         
            -
                str = ""
         
     | 
| 
       145 
     | 
    
         
            -
                [:public, :protected, :private].each do |visibility|
         
     | 
| 
       146 
     | 
    
         
            -
                  if methods[visibility]
         
     | 
| 
       147 
     | 
    
         
            -
                    str << "\n" unless str.empty?
         
     | 
| 
       148 
     | 
    
         
            -
                    str << visibility.to_s << "\n\n" unless visibility == :public
         
     | 
| 
       149 
     | 
    
         
            -
                    str << methods[visibility].collect { |m| format(m.dump, 2) }.join("\n")
         
     | 
| 
      
 136 
     | 
    
         
            +
                  def dump_static(str)
         
     | 
| 
      
 137 
     | 
    
         
            +
                    format(str, 2)
         
     | 
| 
       150 
138 
     | 
    
         
             
                  end
         
     | 
| 
       151 
     | 
    
         
            -
                end
         
     | 
| 
       152 
     | 
    
         
            -
                str
         
     | 
| 
       153 
     | 
    
         
            -
              end
         
     | 
| 
       154 
139 
     | 
    
         | 
| 
       155 
     | 
    
         
            -
             
     | 
| 
       156 
     | 
    
         
            -
             
     | 
| 
       157 
     | 
    
         
            -
             
     | 
| 
       158 
     | 
    
         
            -
             
     | 
| 
       159 
     | 
    
         
            -
             
     | 
| 
       160 
     | 
    
         
            -
             
     | 
| 
       161 
     | 
    
         
            -
             
     | 
| 
      
 140 
     | 
    
         
            +
                  def dump_methods
         
     | 
| 
      
 141 
     | 
    
         
            +
                    methods = {}
         
     | 
| 
      
 142 
     | 
    
         
            +
                    @methoddef.each do |visibility, method|
         
     | 
| 
      
 143 
     | 
    
         
            +
                      (methods[visibility] ||= []) << method
         
     | 
| 
      
 144 
     | 
    
         
            +
                    end
         
     | 
| 
      
 145 
     | 
    
         
            +
                    str = ""
         
     | 
| 
      
 146 
     | 
    
         
            +
                    [:public, :protected, :private].each do |visibility|
         
     | 
| 
      
 147 
     | 
    
         
            +
                      if methods[visibility]
         
     | 
| 
      
 148 
     | 
    
         
            +
                        str << "\n" unless str.empty?
         
     | 
| 
      
 149 
     | 
    
         
            +
                        str << visibility.to_s << "\n\n" unless visibility == :public
         
     | 
| 
      
 150 
     | 
    
         
            +
                        str << methods[visibility].collect { |m| format(m.dump, 2) }.join("\n")
         
     | 
| 
      
 151 
     | 
    
         
            +
                      end
         
     | 
| 
      
 152 
     | 
    
         
            +
                    end
         
     | 
| 
      
 153 
     | 
    
         
            +
                    str
         
     | 
| 
      
 154 
     | 
    
         
            +
                  end
         
     | 
| 
       162 
155 
     | 
    
         | 
| 
       163 
     | 
    
         
            -
             
     | 
| 
       164 
     | 
    
         
            -
             
     | 
| 
       165 
     | 
    
         
            -
             
     | 
| 
      
 156 
     | 
    
         
            +
                  def dump_value(value)
         
     | 
| 
      
 157 
     | 
    
         
            +
                    if value.respond_to?(:to_src)
         
     | 
| 
      
 158 
     | 
    
         
            +
                      value.to_src
         
     | 
| 
      
 159 
     | 
    
         
            +
                    else
         
     | 
| 
      
 160 
     | 
    
         
            +
                      value
         
     | 
| 
      
 161 
     | 
    
         
            +
                    end
         
     | 
| 
      
 162 
     | 
    
         
            +
                  end
         
     | 
| 
       166 
163 
     | 
    
         | 
| 
       167 
     | 
    
         
            -
             
     | 
| 
       168 
     | 
    
         
            -
             
     | 
| 
       169 
     | 
    
         
            -
             
     | 
| 
      
 164 
     | 
    
         
            +
                  def padding(package)
         
     | 
| 
      
 165 
     | 
    
         
            +
                    @padding ||= "  " * package.size
         
     | 
| 
      
 166 
     | 
    
         
            +
                  end
         
     | 
| 
       170 
167 
     | 
    
         | 
| 
       171 
     | 
    
         
            -
             
     | 
| 
       172 
     | 
    
         
            -
             
     | 
| 
       173 
     | 
    
         
            -
             
     | 
| 
       174 
     | 
    
         
            -
              end
         
     | 
| 
      
 168 
     | 
    
         
            +
                  def dump_package_def(package)
         
     | 
| 
      
 169 
     | 
    
         
            +
                    format package.each_with_index.collect { |ele, i| ("  " * i) + "module #{ele}" }.join("\n")
         
     | 
| 
      
 170 
     | 
    
         
            +
                  end
         
     | 
| 
       175 
171 
     | 
    
         | 
| 
       176 
     | 
    
         
            -
             
     | 
| 
       177 
     | 
    
         
            -
             
     | 
| 
       178 
     | 
    
         
            -
             
     | 
| 
       179 
     | 
    
         
            -
            end
         
     | 
| 
      
 172 
     | 
    
         
            +
                  def dump_package_def_end(package)
         
     | 
| 
      
 173 
     | 
    
         
            +
                    format package.each_with_index.collect { |_, i| ("  " * i) + "end" }.reverse.join("\n")
         
     | 
| 
      
 174 
     | 
    
         
            +
                  end
         
     | 
| 
       180 
175 
     | 
    
         | 
| 
      
 176 
     | 
    
         
            +
                  def dump_module_def
         
     | 
| 
      
 177 
     | 
    
         
            +
                    name = @name.to_s.split(/::/)
         
     | 
| 
      
 178 
     | 
    
         
            +
                    format("module #{name.last}")
         
     | 
| 
      
 179 
     | 
    
         
            +
                  end
         
     | 
| 
       181 
180 
     | 
    
         | 
| 
       182 
     | 
    
         
            -
             
     | 
| 
      
 181 
     | 
    
         
            +
                  def dump_module_def_end
         
     | 
| 
      
 182 
     | 
    
         
            +
                    format("end")
         
     | 
| 
      
 183 
     | 
    
         
            +
                  end
         
     | 
| 
      
 184 
     | 
    
         
            +
                end
         
     | 
| 
      
 185 
     | 
    
         
            +
             
     | 
| 
      
 186 
     | 
    
         
            +
             
     | 
| 
      
 187 
     | 
    
         
            +
              end
         
     | 
| 
       183 
188 
     | 
    
         
             
            end
         
     | 
| 
       184 
189 
     | 
    
         | 
| 
       185 
190 
     | 
    
         | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: soybean
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 2. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 2.2.0
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       7 
7 
     | 
    
         
             
            authors:
         
     | 
| 
         @@ -9,12 +9,12 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date: 2011- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2011-10-07 00:00:00.000000000 +04:00
         
     | 
| 
       13 
13 
     | 
    
         
             
            default_executable: soybean
         
     | 
| 
       14 
14 
     | 
    
         
             
            dependencies:
         
     | 
| 
       15 
15 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       16 
16 
     | 
    
         
             
              name: thor
         
     | 
| 
       17 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 17 
     | 
    
         
            +
              requirement: &11455800 !ruby/object:Gem::Requirement
         
     | 
| 
       18 
18 
     | 
    
         
             
                none: false
         
     | 
| 
       19 
19 
     | 
    
         
             
                requirements:
         
     | 
| 
       20 
20 
     | 
    
         
             
                - - ! '>='
         
     | 
| 
         @@ -22,10 +22,10 @@ dependencies: 
     | 
|
| 
       22 
22 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       23 
23 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       24 
24 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       25 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 25 
     | 
    
         
            +
              version_requirements: *11455800
         
     | 
| 
       26 
26 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       27 
27 
     | 
    
         
             
              name: activesupport
         
     | 
| 
       28 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 28 
     | 
    
         
            +
              requirement: &11454320 !ruby/object:Gem::Requirement
         
     | 
| 
       29 
29 
     | 
    
         
             
                none: false
         
     | 
| 
       30 
30 
     | 
    
         
             
                requirements:
         
     | 
| 
       31 
31 
     | 
    
         
             
                - - ~>
         
     | 
| 
         @@ -33,10 +33,10 @@ dependencies: 
     | 
|
| 
       33 
33 
     | 
    
         
             
                    version: '3.1'
         
     | 
| 
       34 
34 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       35 
35 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       36 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 36 
     | 
    
         
            +
              version_requirements: *11454320
         
     | 
| 
       37 
37 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       38 
38 
     | 
    
         
             
              name: i18n
         
     | 
| 
       39 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 39 
     | 
    
         
            +
              requirement: &11449680 !ruby/object:Gem::Requirement
         
     | 
| 
       40 
40 
     | 
    
         
             
                none: false
         
     | 
| 
       41 
41 
     | 
    
         
             
                requirements:
         
     | 
| 
       42 
42 
     | 
    
         
             
                - - ! '>='
         
     | 
| 
         @@ -44,10 +44,10 @@ dependencies: 
     | 
|
| 
       44 
44 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       45 
45 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       46 
46 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       47 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 47 
     | 
    
         
            +
              version_requirements: *11449680
         
     | 
| 
       48 
48 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       49 
49 
     | 
    
         
             
              name: rspec
         
     | 
| 
       50 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 50 
     | 
    
         
            +
              requirement: &11448500 !ruby/object:Gem::Requirement
         
     | 
| 
       51 
51 
     | 
    
         
             
                none: false
         
     | 
| 
       52 
52 
     | 
    
         
             
                requirements:
         
     | 
| 
       53 
53 
     | 
    
         
             
                - - ~>
         
     | 
| 
         @@ -55,10 +55,10 @@ dependencies: 
     | 
|
| 
       55 
55 
     | 
    
         
             
                    version: 2.3.0
         
     | 
| 
       56 
56 
     | 
    
         
             
              type: :development
         
     | 
| 
       57 
57 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       58 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 58 
     | 
    
         
            +
              version_requirements: *11448500
         
     | 
| 
       59 
59 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       60 
60 
     | 
    
         
             
              name: yard
         
     | 
| 
       61 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 61 
     | 
    
         
            +
              requirement: &11443520 !ruby/object:Gem::Requirement
         
     | 
| 
       62 
62 
     | 
    
         
             
                none: false
         
     | 
| 
       63 
63 
     | 
    
         
             
                requirements:
         
     | 
| 
       64 
64 
     | 
    
         
             
                - - ~>
         
     | 
| 
         @@ -66,10 +66,10 @@ dependencies: 
     | 
|
| 
       66 
66 
     | 
    
         
             
                    version: 0.6.0
         
     | 
| 
       67 
67 
     | 
    
         
             
              type: :development
         
     | 
| 
       68 
68 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       69 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 69 
     | 
    
         
            +
              version_requirements: *11443520
         
     | 
| 
       70 
70 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       71 
71 
     | 
    
         
             
              name: bundler
         
     | 
| 
       72 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 72 
     | 
    
         
            +
              requirement: &11442440 !ruby/object:Gem::Requirement
         
     | 
| 
       73 
73 
     | 
    
         
             
                none: false
         
     | 
| 
       74 
74 
     | 
    
         
             
                requirements:
         
     | 
| 
       75 
75 
     | 
    
         
             
                - - ~>
         
     | 
| 
         @@ -77,10 +77,10 @@ dependencies: 
     | 
|
| 
       77 
77 
     | 
    
         
             
                    version: 1.0.0
         
     | 
| 
       78 
78 
     | 
    
         
             
              type: :development
         
     | 
| 
       79 
79 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       80 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 80 
     | 
    
         
            +
              version_requirements: *11442440
         
     | 
| 
       81 
81 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       82 
82 
     | 
    
         
             
              name: jeweler
         
     | 
| 
       83 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 83 
     | 
    
         
            +
              requirement: &11441320 !ruby/object:Gem::Requirement
         
     | 
| 
       84 
84 
     | 
    
         
             
                none: false
         
     | 
| 
       85 
85 
     | 
    
         
             
                requirements:
         
     | 
| 
       86 
86 
     | 
    
         
             
                - - ~>
         
     | 
| 
         @@ -88,10 +88,10 @@ dependencies: 
     | 
|
| 
       88 
88 
     | 
    
         
             
                    version: 1.6.4
         
     | 
| 
       89 
89 
     | 
    
         
             
              type: :development
         
     | 
| 
       90 
90 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       91 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 91 
     | 
    
         
            +
              version_requirements: *11441320
         
     | 
| 
       92 
92 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       93 
93 
     | 
    
         
             
              name: rcov
         
     | 
| 
       94 
     | 
    
         
            -
              requirement: & 
     | 
| 
      
 94 
     | 
    
         
            +
              requirement: &11440340 !ruby/object:Gem::Requirement
         
     | 
| 
       95 
95 
     | 
    
         
             
                none: false
         
     | 
| 
       96 
96 
     | 
    
         
             
                requirements:
         
     | 
| 
       97 
97 
     | 
    
         
             
                - - ! '>='
         
     | 
| 
         @@ -99,7 +99,7 @@ dependencies: 
     | 
|
| 
       99 
99 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       100 
100 
     | 
    
         
             
              type: :development
         
     | 
| 
       101 
101 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       102 
     | 
    
         
            -
              version_requirements: * 
     | 
| 
      
 102 
     | 
    
         
            +
              version_requirements: *11440340
         
     | 
| 
       103 
103 
     | 
    
         
             
            description: ! 'Generate soap web-services from you wsdl. Generate: all classes from
         
     | 
| 
       104 
104 
     | 
    
         
             
              xsd, and other.'
         
     | 
| 
       105 
105 
     | 
    
         
             
            email: a.sozontov@gmail.com
         
     | 
| 
         @@ -120,15 +120,18 @@ files: 
     | 
|
| 
       120 
120 
     | 
    
         
             
            - VERSION
         
     | 
| 
       121 
121 
     | 
    
         
             
            - bin/soybean
         
     | 
| 
       122 
122 
     | 
    
         
             
            - lib/soybean.rb
         
     | 
| 
      
 123 
     | 
    
         
            +
            - lib/soybean/cli.rb
         
     | 
| 
       123 
124 
     | 
    
         
             
            - lib/soybean/complex_type.rb
         
     | 
| 
       124 
125 
     | 
    
         
             
            - lib/soybean/encoded_mapping_registry_creator.rb
         
     | 
| 
       125 
126 
     | 
    
         
             
            - lib/soybean/generators/base_generator.rb
         
     | 
| 
       126 
127 
     | 
    
         
             
            - lib/soybean/generators/class_generator.rb
         
     | 
| 
       127 
128 
     | 
    
         
             
            - lib/soybean/generators/interface_generator.rb
         
     | 
| 
       128 
129 
     | 
    
         
             
            - lib/soybean/generators/mapping_generator.rb
         
     | 
| 
      
 130 
     | 
    
         
            +
            - lib/soybean/generators/middleware_generator.rb
         
     | 
| 
       129 
131 
     | 
    
         
             
            - lib/soybean/generators/model_generator.rb
         
     | 
| 
       130 
132 
     | 
    
         
             
            - lib/soybean/generators/model_spec_generator.rb
         
     | 
| 
       131 
133 
     | 
    
         
             
            - lib/soybean/generators/service_generator.rb
         
     | 
| 
      
 134 
     | 
    
         
            +
            - lib/soybean/generators/templates/middleware.rb
         
     | 
| 
       132 
135 
     | 
    
         
             
            - lib/soybean/generators/templates/model_spec.rb
         
     | 
| 
       133 
136 
     | 
    
         
             
            - lib/soybean/generators/types_generator.rb
         
     | 
| 
       134 
137 
     | 
    
         
             
            - lib/soybean/interface.rb
         
     | 
| 
         @@ -312,7 +315,7 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       312 
315 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       313 
316 
     | 
    
         
             
                  segments:
         
     | 
| 
       314 
317 
     | 
    
         
             
                  - 0
         
     | 
| 
       315 
     | 
    
         
            -
                  hash: - 
     | 
| 
      
 318 
     | 
    
         
            +
                  hash: -1482793293416004037
         
     | 
| 
       316 
319 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       317 
320 
     | 
    
         
             
              none: false
         
     | 
| 
       318 
321 
     | 
    
         
             
              requirements:
         
     |