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:
|