soybean 2.2.2 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.2.2
1
+ 2.3.0
data/lib/soybean/cli.rb CHANGED
@@ -10,7 +10,6 @@ class Soybean::CLI < Thor
10
10
 
11
11
 
12
12
  desc "types [PATH_TO_XSD]", "Generate Ruby classes for xsd-schema from file_path.xsd"
13
-
14
13
  def types(location, destination = '.')
15
14
  Soybean::Generators::TypesGenerator.new(URI.parse(location)).generate do |filename, content|
16
15
  if options[:remove]
@@ -22,27 +21,43 @@ class Soybean::CLI < Thor
22
21
  end
23
22
 
24
23
  desc "service [PATH_TO_WSDL] [DESTINATION_DIR]", "Generate classes for WebService from WSDL"
25
-
26
24
  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
25
+ opts = options
26
+ raise 'PATH_TO_WSDL should be a exists wsdl file or directory with wsdl`s' unless File.exists? wsdl
27
+ full_path = File.expand_path wsdl, FileUtils.pwd
28
+ if File.directory? full_path
29
+ Dir["#{full_path}/*.wsdl"].each do |file|
30
+ puts file.inspect
31
+ generate_service(file, dir, opts)
32
32
  end
33
+ else
34
+ generate_service(full_path, dir, opts)
33
35
  end
34
36
  end
35
37
 
36
38
  desc "version", "Show current version"
37
-
38
39
  def version
39
40
  puts Soybean::VERSION
40
41
  end
41
42
 
42
43
  no_tasks do
44
+ def generate_service(wsdl, dir, options)
45
+ Soybean::Generators::ServiceGenerator.new(dir, wsdl, spec_dir(dir)).generate do |filename, content, generator|
46
+ opts = options
47
+ if generator.is_a? Soybean::Generators::ModelGenerator
48
+ opts = opts.merge(:skip => true, :force => false)
49
+ end
50
+ if opts[:remove]
51
+ remove_file filename, opts
52
+ else
53
+ create_file filename, content, opts
54
+ end
55
+ end
56
+ end
57
+
43
58
  def spec_dir(dir)
44
- default_spec_dir = "spec/#{dir}/models"
45
- if options[:force]
59
+ default_spec_dir = "spec/#{dir}"
60
+ if options[:force] || File.exists?(default_spec_dir)
46
61
  default_spec_dir
47
62
  else
48
63
  ask("Spec directory: '#{default_spec_dir}'? ").presence || default_spec_dir
@@ -7,6 +7,13 @@ module Soybean
7
7
  def attr_accessor(*attrs)
8
8
  self.attributes += attrs
9
9
  super
10
+ attrs.each do |meth|
11
+ self.class_eval <<-RUBY
12
+ def #{meth}
13
+ @#{meth} || @#{meth.to_s.camelize(:lower)}
14
+ end
15
+ RUBY
16
+ end
10
17
  end
11
18
  end
12
19
 
@@ -16,7 +16,7 @@ module Soybean
16
16
 
17
17
  def generate
18
18
  (schemes + mappings + interface + model + specs + middleware).map do |generator|
19
- yield generator.fullpath(path), generator.generate
19
+ yield generator.fullpath(path), generator.generate, generator
20
20
  end
21
21
  end
22
22
 
@@ -1,5 +1,5 @@
1
1
  module Middlewares
2
- class <%= class_name %> < Soap4r::Middleware::Base
2
+ class <%= class_name %> < Soybean::Middleware
3
3
  setup do
4
4
  self.endpoint = %r(^/<%= model_class_name %>)
5
5
  service = <%= model_class_name %>.new
@@ -0,0 +1,181 @@
1
+ require 'soap/rpc/router'
2
+
3
+ module Soybean
4
+ class Middleware
5
+ include SOAP
6
+
7
+ module ClassMethods
8
+ def setup
9
+ @router = ::SOAP::RPC::Router.new(self.class.name)
10
+ yield self
11
+ end
12
+
13
+ def router
14
+ @router
15
+ end
16
+
17
+ def endpoint=(regex)
18
+ @endpoint = regex
19
+ end
20
+
21
+ def endpoint
22
+ @endpoint
23
+ end
24
+
25
+ # SOAP interface
26
+
27
+ def mapping_registry
28
+ router.mapping_registry
29
+ end
30
+
31
+ def mapping_registry=(mapping_registry)
32
+ router.mapping_registry = mapping_registry
33
+ end
34
+
35
+ def literal_mapping_registry
36
+ router.literal_mapping_registry
37
+ end
38
+
39
+ def literal_mapping_registry=(literal_mapping_registry)
40
+ router.literal_mapping_registry = literal_mapping_registry
41
+ end
42
+
43
+ def generate_explicit_type
44
+ router.generate_explicit_type
45
+ end
46
+
47
+ def generate_explicit_type=(generate_explicit_type)
48
+ router.generate_explicit_type = generate_explicit_type
49
+ end
50
+
51
+ # servant entry interface
52
+
53
+ def add_rpc_servant(obj, namespace = self.default_namespace)
54
+ router.add_rpc_servant(obj, namespace)
55
+ end
56
+
57
+ alias add_servant add_rpc_servant
58
+
59
+ def add_headerhandler(obj)
60
+ router.add_headerhandler(obj)
61
+ end
62
+
63
+ alias add_rpc_headerhandler add_headerhandler
64
+
65
+ def filterchain
66
+ router.filterchain
67
+ end
68
+
69
+ # method entry interface
70
+
71
+ def add_rpc_method(obj, name, *param)
72
+ add_rpc_method_with_namespace_as(default_namespace, obj, name, name, *param)
73
+ end
74
+
75
+ alias add_method add_rpc_method
76
+
77
+ def add_rpc_method_as(obj, name, name_as, *param)
78
+ add_rpc_method_with_namespace_as(default_namespace, obj, name, name_as, *param)
79
+ end
80
+
81
+ alias add_method_as add_rpc_method_as
82
+
83
+ def add_rpc_method_with_namespace(namespace, obj, name, *param)
84
+ add_rpc_method_with_namespace_as(namespace, obj, name, name, *param)
85
+ end
86
+
87
+ alias add_method_with_namespace add_rpc_method_with_namespace
88
+
89
+ def add_rpc_method_with_namespace_as(namespace, obj, name, name_as, *param)
90
+ qname = XSD::QName.new(namespace, name_as)
91
+ soapaction = nil
92
+ param_def = SOAPMethod.derive_rpc_param_def(obj, name, *param)
93
+ router.add_rpc_operation(obj, qname, soapaction, name, param_def)
94
+ end
95
+
96
+ alias add_method_with_namespace_as add_rpc_method_with_namespace_as
97
+
98
+ def add_rpc_operation(receiver, qname, soapaction, name, param_def, opt = {})
99
+ router.add_rpc_operation(receiver, qname, soapaction, name, param_def, opt)
100
+ end
101
+
102
+ def add_document_operation(receiver, soapaction, name, param_def, opt = {})
103
+ router.add_document_operation(receiver, soapaction, name, param_def, opt)
104
+ end
105
+ end
106
+
107
+ extend ClassMethods
108
+
109
+ def initialize(app = nil)
110
+ @app = app
111
+ end
112
+
113
+ def call(env)
114
+ if env['PATH_INFO'].match(self.class.endpoint)
115
+ handle(env)
116
+ else
117
+ # we can act as both a middleware and an app
118
+ @app ?
119
+ @app.call(env) :
120
+ (return 404, {"Content-Type" => "text/plain"}, ["404 - Not Found"])
121
+ end
122
+ end
123
+
124
+ def handle(env)
125
+ # yeah, all soap calls are over POST
126
+ if env['REQUEST_METHOD'] != 'POST'
127
+ return 405, {
128
+ 'Allow' => 'POST',
129
+ 'Content-Type' => 'text/plain'}, ["405 - Method Not Allowed"]
130
+ end
131
+
132
+ conn_data = ::SOAP::StreamHandler::ConnectionData.new
133
+ setup_request(conn_data, env)
134
+ conn_data = self.class.router.route(conn_data)
135
+ status, headers, body = setup_response(conn_data, env)
136
+ [status, headers, body]
137
+ rescue
138
+ raise # TODO -- do we 500 right here, or let the exception bubble up?
139
+ end
140
+
141
+ def setup_request(conn_data, env)
142
+ # TODO: we're reading the whole input here, which kind of stinks if rack is
143
+ # reading from the client on demand. We can't just pass in the rack input
144
+ # object, since REXML needs an IO that responds to :eof? -- we'd need a
145
+ # wrapper IO-like object.
146
+ conn_data.receive_string = env['rack.input'].read
147
+ conn_data.receive_contenttype = env['CONTENT_TYPE']
148
+ conn_data.soapaction = parse_soapaction(env['HTTP_SOAPAction'])
149
+ end
150
+
151
+ def setup_response(conn_data, env)
152
+ status = 200
153
+ headers = {}
154
+ body = []
155
+ headers['content-type'] = conn_data.send_contenttype
156
+ # TODO: cookies?
157
+ if conn_data.is_nocontent
158
+ status = 202 # ACCEPTED
159
+ elsif conn_data.is_fault
160
+ # rather than sending the 500 here, let's bubble up the exception so the
161
+ # parent application can do with it what it will. The only downside is
162
+ # soap4r has already converted the exception into a soap response body at
163
+ # this point, which isn't what we want at all.
164
+ # maybe someday i'll re-parse the response or something. but not today.
165
+ raise conn_data.send_string
166
+ else
167
+ body << conn_data.send_string
168
+ end
169
+ return status, headers, body
170
+ end
171
+
172
+ def parse_soapaction(soapaction)
173
+ if !soapaction.nil? and !soapaction.empty?
174
+ if /\A"(.+)"\z/ =~ soapaction
175
+ return $1
176
+ end
177
+ end
178
+ nil
179
+ end
180
+ end
181
+ end
data/soybean.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{soybean}
8
- s.version = "2.2.2"
8
+ s.version = "2.3.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"]
@@ -46,6 +46,7 @@ Gem::Specification.new do |s|
46
46
  "lib/soybean/interface.rb",
47
47
  "lib/soybean/interface_builder.rb",
48
48
  "lib/soybean/literal_mapping_registry_creator.rb",
49
+ "lib/soybean/middleware.rb",
49
50
  "soybean.gemspec",
50
51
  "spec/soybean_spec.rb",
51
52
  "spec/spec_helper.rb",
@@ -7,7 +7,7 @@
7
7
  # either the dual license version in 2003, or any later version.
8
8
 
9
9
 
10
- require 'soap/baseData'
10
+ require 'soap/base_data'
11
11
  require 'soap/mapping'
12
12
 
13
13
 
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
  require 'xsd/qname'
11
- require 'soap/baseData'
11
+ require 'soap/base_data'
12
12
 
13
13
 
14
14
  module SOAP
@@ -8,7 +8,7 @@
8
8
 
9
9
 
10
10
  require 'soap/soap'
11
- require 'soap/baseData'
11
+ require 'soap/base_data'
12
12
  require 'soap/element'
13
13
 
14
14
 
@@ -9,7 +9,7 @@
9
9
 
10
10
  require 'soap/soap'
11
11
  require 'soap/ns'
12
- require 'soap/baseData'
12
+ require 'soap/base_data'
13
13
  require 'soap/encodingstyle/handler'
14
14
  require 'xsd/codegen/gensupport'
15
15
 
@@ -517,7 +517,7 @@ module Mapping
517
517
  elename = XSD::QName.new(default_ns, varname)
518
518
  end
519
519
  SchemaElementDefinition.new(
520
- varname, mapped_class, elename, minoccurs, maxoccurs, as_any, as_array)
520
+ varname.underscore, mapped_class, elename, minoccurs, maxoccurs, as_any, as_array)
521
521
  end
522
522
  end
523
523
 
@@ -10,7 +10,7 @@
10
10
  require 'xsd/xmlparser'
11
11
  require 'soap/soap'
12
12
  require 'soap/ns'
13
- require 'soap/baseData'
13
+ require 'soap/base_data'
14
14
  require 'soap/encodingstyle/handler'
15
15
 
16
16
 
@@ -12,9 +12,9 @@ require 'soap/soap'
12
12
  require 'soap/element'
13
13
  require 'soap/parser'
14
14
  require 'soap/generator'
15
- require 'soap/encodingstyle/soapHandler'
16
- require 'soap/encodingstyle/literalHandler'
17
- require 'soap/encodingstyle/aspDotNetHandler'
15
+ require 'soap/encodingstyle/soap_handler'
16
+ require 'soap/encodingstyle/literal_handler'
17
+ require 'soap/encodingstyle/asp_dot_net_handler'
18
18
 
19
19
 
20
20
  module SOAP
@@ -15,7 +15,7 @@ require 'soap/rpc/rpc'
15
15
  require 'soap/rpc/element'
16
16
  require 'soap/header/handlerset'
17
17
  require 'soap/filter'
18
- require 'soap/streamHandler'
18
+ require 'soap/stream_handler'
19
19
  require 'soap/mimemessage'
20
20
  require 'soap/header/handlerset'
21
21
 
@@ -106,7 +106,7 @@ class HTTPStreamHandler < StreamHandler
106
106
  RETRYABLE = true
107
107
  rescue LoadError
108
108
  warn("Loading http-access2 failed. Net/http is used.") if $DEBUG
109
- require 'soap/netHttpClient'
109
+ require 'soap/net_http_client'
110
110
  Client = SOAP::NetHttpClient
111
111
  RETRYABLE = false
112
112
  end
@@ -97,7 +97,7 @@ module MappingRegistryCreatorSupport
97
97
  else
98
98
  varname, name, type, occurrence = definition
99
99
  '[' + [
100
- varname.dump,
100
+ varname.dump.underscore,
101
101
  dump_type(name, type),
102
102
  dump_occurrence(occurrence)
103
103
  ].compact.join(', ') + ']'
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.2.2
4
+ version: 2.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -14,7 +14,7 @@ default_executable: soybean
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: thor
17
- requirement: &10262720 !ruby/object:Gem::Requirement
17
+ requirement: &4642340 !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: *10262720
25
+ version_requirements: *4642340
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: activesupport
28
- requirement: &10260220 !ruby/object:Gem::Requirement
28
+ requirement: &4641260 !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: *10260220
36
+ version_requirements: *4641260
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: i18n
39
- requirement: &10258480 !ruby/object:Gem::Requirement
39
+ requirement: &4639600 !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: *10258480
47
+ version_requirements: *4639600
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: rspec
50
- requirement: &10256820 !ruby/object:Gem::Requirement
50
+ requirement: &4638200 !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: *10256820
58
+ version_requirements: *4638200
59
59
  - !ruby/object:Gem::Dependency
60
60
  name: yard
61
- requirement: &10254460 !ruby/object:Gem::Requirement
61
+ requirement: &4637120 !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: *10254460
69
+ version_requirements: *4637120
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: bundler
72
- requirement: &10253320 !ruby/object:Gem::Requirement
72
+ requirement: &4635500 !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: *10253320
80
+ version_requirements: *4635500
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: jeweler
83
- requirement: &10252000 !ruby/object:Gem::Requirement
83
+ requirement: &4634520 !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: *10252000
91
+ version_requirements: *4634520
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: rcov
94
- requirement: &10250280 !ruby/object:Gem::Requirement
94
+ requirement: &4633360 !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: *10250280
102
+ version_requirements: *4633360
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
@@ -137,6 +137,7 @@ files:
137
137
  - lib/soybean/interface.rb
138
138
  - lib/soybean/interface_builder.rb
139
139
  - lib/soybean/literal_mapping_registry_creator.rb
140
+ - lib/soybean/middleware.rb
140
141
  - soybean.gemspec
141
142
  - spec/soybean_spec.rb
142
143
  - spec/spec_helper.rb
@@ -315,7 +316,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
315
316
  version: '0'
316
317
  segments:
317
318
  - 0
318
- hash: -214234621149744458
319
+ hash: -1409596823364250190
319
320
  required_rubygems_version: !ruby/object:Gem::Requirement
320
321
  none: false
321
322
  requirements: