soybean 2.5.2 → 2.5.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 443d55c2929285c3f99445b4dd80835adc2dfd4151228d04e295dd8bcaa6dcce
4
+ data.tar.gz: d9ff1cd5ae6b25206bba2af5dcb55e289c38793458c886441ab741e0cae30134
5
+ SHA512:
6
+ metadata.gz: b3cb4a93084f9d942113a5a0d157a78743df2d68da8fab0112d847ca37fdbf2d5d8d5d61c04ce8c8d9fd01bc707ca757360ac1db1b180517e1f81afba7f65221
7
+ data.tar.gz: e575a4837269d3384279db78f35830a6219bd32e55bf1c29c9f78784f8098993559e6fe55b2074d2db65c310904d895f7d9f77b9fb864fa4a0f73771eb11d6e3
data/Gemfile CHANGED
@@ -14,6 +14,4 @@ gem 'rack-mount'
14
14
  group :development do
15
15
  gem "rspec", "~> 2.3.0"
16
16
  gem "yard", "~> 0.6.0"
17
- gem "bundler", "~> 1.0.0"
18
- gem "jeweler", "~> 1.6.4"
19
17
  end
data/Gemfile.lock CHANGED
@@ -1,21 +1,19 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activesupport (3.1.0)
4
+ activesupport (3.1.3)
5
5
  multi_json (~> 1.0)
6
6
  diff-lcs (1.1.3)
7
- git (1.2.5)
8
7
  i18n (0.6.0)
9
- jeweler (1.6.4)
10
- bundler (~> 1.0)
11
- git (>= 1.2.5)
12
- rake
8
+ mini_portile2 (2.8.0)
13
9
  multi_json (1.0.3)
14
- nokogiri (1.5.0)
15
- rack (1.3.4)
10
+ nokogiri (1.13.8)
11
+ mini_portile2 (~> 2.8.0)
12
+ racc (~> 1.4)
13
+ racc (1.6.0)
14
+ rack (1.3.5)
16
15
  rack-mount (0.8.3)
17
16
  rack (>= 1.0.0)
18
- rake (0.9.2)
19
17
  rspec (2.3.0)
20
18
  rspec-core (~> 2.3.0)
21
19
  rspec-expectations (~> 2.3.0)
@@ -32,12 +30,13 @@ PLATFORMS
32
30
 
33
31
  DEPENDENCIES
34
32
  activesupport (~> 3.1)
35
- bundler (~> 1.0.0)
36
33
  i18n
37
- jeweler (~> 1.6.4)
38
34
  nokogiri
39
35
  rack
40
36
  rack-mount
41
37
  rspec (~> 2.3.0)
42
38
  thor
43
39
  yard (~> 0.6.0)
40
+
41
+ BUNDLED WITH
42
+ 2.2.29
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.5.2
1
+ 2.5.4
data/lib/soybean/cli.rb CHANGED
@@ -27,7 +27,6 @@ class Soybean::CLI < Thor
27
27
  full_path = File.expand_path wsdl, FileUtils.pwd
28
28
  if File.directory? full_path
29
29
  Dir["#{full_path}/*.wsdl"].each do |file|
30
- puts file.inspect
31
30
  generate_service(file, dir, opts)
32
31
  end
33
32
  else
@@ -42,6 +41,7 @@ class Soybean::CLI < Thor
42
41
 
43
42
  no_tasks do
44
43
  def generate_service(wsdl, dir, options)
44
+ Soybean.cache.clear
45
45
  Soybean::Generators::ServiceGenerator.new(dir, wsdl, spec_dir(dir)).generate do |filename, content, generator|
46
46
  opts = options
47
47
  if generator.is_a? Soybean::Generators::ModelGenerator
@@ -30,7 +30,7 @@ module Soybean
30
30
  def init_from_array(arry)
31
31
  check_arguments_number! arry
32
32
  attributes.each_with_index do |key, i|
33
- self.send "#{key}=".to_sym, arry.at(i)
33
+ self.send :"#{key}=", arry.at(i)
34
34
  end
35
35
  end
36
36
 
@@ -139,18 +139,11 @@ module Soybean
139
139
  return s, h, b
140
140
  rescue => e
141
141
  [200, {'Allow' => 'POST',
142
- 'Content-Type' => 'text/plain'}, [e.message,
142
+ 'Content-Type' => 'text/xml'}, [e.message,
143
143
  e.backtrace.join("\n")]]
144
144
  end
145
145
 
146
146
  def with_logging(env, logger)
147
- #Started GET "/" for 127.0.0.1 at 2011-09-28 14:21:28 +0400
148
- # Processing by DashboardController#index as HTML
149
- # User Load (0.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 100 LIMIT 1
150
- # Role Load (0.3ms) SELECT `roles`.* FROM `roles` INNER JOIN `assignments` ON `roles`.`id` = `assignments`.`role_id` WHERE `assignments`.`user_id` = 100
151
- #Redirected to http://localhost:3000/municipal_services
152
- #Completed 302 Found in 89ms
153
-
154
147
  request = Rack::Request.new(env)
155
148
  input_params = request.body.read
156
149
  request.body.rewind
@@ -18,7 +18,9 @@ module Soybean
18
18
  @wsdl.importedschema.map do |uri, schema|
19
19
  "require 'mappings/#{URI.parse(schema.targetnamespace).path[1..-2].underscore}'\n"
20
20
  end.join +
21
- "class #{class_name} < #{interface_name}\nend"
21
+ "class #{class_name} < #{interface_name}" +
22
+ "include #{URI.parse(@wsdl.importedschema.values.last.targetnamespace).path[1..-2].camelize}"
23
+ "end"
22
24
  end
23
25
 
24
26
  def class_name
@@ -1,6 +1,5 @@
1
1
  module Engines
2
2
  class <%= class_name %> < Soybean::Engine
3
3
  self.service = <%= model_class_name %>.new
4
- self.endpoint = %r(^/<%= model_class_name %>)
5
4
  end
6
5
  end
@@ -2,7 +2,7 @@ module Soybean
2
2
  module Generators
3
3
  class TypesGenerator < WSDL::SOAP::ClassDefCreator
4
4
  class_attribute :classes_cache, :instance_reader => true, :instance_writer => true
5
- self.classes_cache = {}
5
+ self.classes_cache = Soybean.cache[:classes]
6
6
  include BaseGenerator
7
7
 
8
8
  attr_reader :name
@@ -51,7 +51,7 @@ module Soybean
51
51
 
52
52
  def with_cache
53
53
  result = yield
54
- if !classes_cache.key?(result.name) && result
54
+ if result && !classes_cache.key?(result.name)
55
55
  classes_cache[result.name] = true
56
56
  result.dump
57
57
  end
@@ -1,5 +1,8 @@
1
1
  module Soybean
2
2
  class Interface
3
+ include ActiveSupport::Callbacks
4
+ NO_ACTIONS = [:endpoint]
5
+
3
6
  class_attribute :interfaces, :instance_reader => false, :instance_writer => false
4
7
 
5
8
  def self.inherited(subclass)
@@ -8,11 +11,14 @@ module Soybean
8
11
  Soybean.services << subclass if subclass.superclass < Soybean::Interface
9
12
  end
10
13
 
11
- def self.actions
12
- self.instance_methods - Object.instance_methods
14
+ def self.actions(implemented=true)
15
+ if implemented
16
+ self.public_instance_methods(false) - NO_ACTIONS
17
+ else
18
+ self::Methods.map(&:second).map(&:to_sym)
19
+ end
13
20
  end
14
21
 
15
-
16
22
  attr_reader :logger
17
23
 
18
24
  def initialize(logger=Soybean.logger)
@@ -9,24 +9,19 @@ module Soybean
9
9
  private
10
10
 
11
11
  def dump_entry(regname, var)
12
- if @cache.key?(var[:class])
13
- ''
14
- else
15
- @cache[var[:class]] = true
16
- "#{regname}.register(\n " +
17
- [
18
- dump_entry_item(var, :class),
19
- dump_entry_item(var, :soap_class),
20
- dump_entry_item(var, :schema_name, :qname),
21
- dump_entry_item(var, :schema_type, :qname),
22
- dump_entry_item(var, :is_anonymous),
23
- dump_entry_item(var, :schema_basetype, :qname),
24
- dump_entry_item(var, :schema_qualified),
25
- dump_entry_item(var, :schema_element),
26
- dump_entry_item(var, :schema_attribute)
27
- ].compact.join(",\n ") +
28
- "\n)\n"
29
- end
12
+ "#{regname}.register(\n " +
13
+ [
14
+ dump_entry_item(var, :class),
15
+ dump_entry_item(var, :soap_class),
16
+ dump_entry_item(var, :schema_name, :qname),
17
+ dump_entry_item(var, :schema_type, :qname),
18
+ dump_entry_item(var, :is_anonymous),
19
+ dump_entry_item(var, :schema_basetype, :qname),
20
+ dump_entry_item(var, :schema_qualified),
21
+ dump_entry_item(var, :schema_element),
22
+ dump_entry_item(var, :schema_attribute)
23
+ ].compact.join(",\n ") +
24
+ "\n)\n"
30
25
  end
31
26
  end
32
27
  end
@@ -0,0 +1,31 @@
1
+ module Soybean
2
+ class StaticServer < Rack::Static
3
+ attr_accessor :cache
4
+
5
+ def call(env)
6
+ path = env["PATH_INFO"]
7
+
8
+ unless @urls.kind_of? Hash
9
+ can_serve = @urls.any? { |url| path.index(url) == 0 }
10
+ else
11
+ can_serve = @urls.key? path
12
+ end
13
+
14
+ if can_serve
15
+ env["PATH_INFO"] = @urls[path] if @urls.kind_of? Hash
16
+ @file_server.call(env)
17
+ else
18
+ @app.call(env)
19
+ end
20
+ end
21
+
22
+ def rewrite(env)
23
+ doc = Nokogiri.XML File.read(env["PATH_INFO"])
24
+ address = d.search('definitions/service/port/:first').first
25
+ address['location'] = "#{env['SERVER_NAME']}:#{env['SERVER_PORT']}/#{env['soybean.service.endpoint']}"
26
+ @cache[env["PATH_INFO"]] = doc
27
+
28
+ end
29
+
30
+ end
31
+ end
data/lib/soybean.rb CHANGED
@@ -28,4 +28,7 @@ module Soybean
28
28
  mattr_accessor :logger
29
29
  self.logger = Logger.new(STDOUT)
30
30
 
31
+ mattr_accessor :cache
32
+ self.cache = Hash.new { |hash, key| hash[key] = { } }
33
+
31
34
  end
data/soybean.gemspec CHANGED
@@ -5,12 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{soybean}
8
- s.version = "2.5.2"
8
+ s.version = "2.5.5"
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-10-17}
13
- s.default_executable = %q{soybean}
12
+ s.date = %q{2011-11-21}
14
13
  s.description = %q{Generate soap web-services from you wsdl. Generate: all classes from xsd, and other.}
15
14
  s.email = %q{a.sozontov@gmail.com}
16
15
  s.executables = ["soybean"]
@@ -51,6 +50,7 @@ Gem::Specification.new do |s|
51
50
  "lib/soybean/interface_builder.rb",
52
51
  "lib/soybean/literal_mapping_registry_creator.rb",
53
52
  "lib/soybean/soap_attribute.rb",
53
+ "lib/soybean/static_server.rb",
54
54
  "soybean.gemspec",
55
55
  "soybean.log",
56
56
  "spec/soybean_spec.rb",
@@ -221,43 +221,11 @@ Gem::Specification.new do |s|
221
221
  s.rubygems_version = %q{1.6.2}
222
222
  s.summary = %q{Generate soap web-services from you wsdl. see README}
223
223
 
224
- if s.respond_to? :specification_version then
225
- s.specification_version = 3
226
-
227
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
228
- s.add_runtime_dependency(%q<thor>, [">= 0"])
229
- s.add_runtime_dependency(%q<activesupport>, ["~> 3.1"])
230
- s.add_runtime_dependency(%q<i18n>, [">= 0"])
231
- s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
232
- s.add_runtime_dependency(%q<rack>, [">= 0"])
233
- s.add_runtime_dependency(%q<rack-mount>, [">= 0"])
234
- s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
235
- s.add_development_dependency(%q<yard>, ["~> 0.6.0"])
236
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
237
- s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
238
- else
239
- s.add_dependency(%q<thor>, [">= 0"])
240
- s.add_dependency(%q<activesupport>, ["~> 3.1"])
241
- s.add_dependency(%q<i18n>, [">= 0"])
242
- s.add_dependency(%q<nokogiri>, [">= 0"])
243
- s.add_dependency(%q<rack>, [">= 0"])
244
- s.add_dependency(%q<rack-mount>, [">= 0"])
245
- s.add_dependency(%q<rspec>, ["~> 2.3.0"])
246
- s.add_dependency(%q<yard>, ["~> 0.6.0"])
247
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
248
- s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
249
- end
250
- else
251
- s.add_dependency(%q<thor>, [">= 0"])
252
- s.add_dependency(%q<activesupport>, ["~> 3.1"])
253
- s.add_dependency(%q<i18n>, [">= 0"])
254
- s.add_dependency(%q<nokogiri>, [">= 0"])
255
- s.add_dependency(%q<rack>, [">= 0"])
256
- s.add_dependency(%q<rack-mount>, [">= 0"])
257
- s.add_dependency(%q<rspec>, ["~> 2.3.0"])
258
- s.add_dependency(%q<yard>, ["~> 0.6.0"])
259
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
260
- s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
261
- end
224
+ s.add_development_dependency "nokogiri"
225
+ s.add_development_dependency "activesupport"
226
+ s.add_development_dependency "i18n"
227
+ s.add_development_dependency "thor"
228
+ s.add_development_dependency "rack"
229
+ s.add_development_dependency "rack-mount"
262
230
  end
263
231
 
@@ -15,353 +15,353 @@ require 'xsd/namedelements'
15
15
 
16
16
 
17
17
  module SOAP
18
- module Mapping
18
+ module Mapping
19
19
 
20
20
 
21
- class LiteralRegistry
22
- include RegistrySupport
21
+ class LiteralRegistry
22
+ include RegistrySupport
23
23
 
24
- attr_accessor :excn_handler_obj2soap
25
- attr_accessor :excn_handler_soap2obj
24
+ attr_accessor :excn_handler_obj2soap
25
+ attr_accessor :excn_handler_soap2obj
26
26
 
27
- def initialize
28
- super()
29
- @excn_handler_obj2soap = nil
30
- @excn_handler_soap2obj = nil
31
- end
32
-
33
- def obj2soap(obj, qname, obj_class = nil)
34
- soap_obj = nil
35
- if obj.is_a?(SOAPElement)
36
- soap_obj = obj
37
- else
38
- soap_obj = any2soap(obj, qname, obj_class)
39
- end
40
- return soap_obj if soap_obj
41
- if @excn_handler_obj2soap
42
- soap_obj = @excn_handler_obj2soap.call(obj) { |yield_obj|
43
- Mapping.obj2soap(yield_obj, nil, nil, MAPPING_OPT)
44
- }
45
- return soap_obj if soap_obj
46
- end
47
- raise MappingError.new("cannot map #{obj.class.name} as #{qname}")
48
- end
49
-
50
- # node should be a SOAPElement
51
- def soap2obj(node, obj_class = nil)
52
- cause = nil
53
- begin
54
- return any2obj(node, obj_class)
55
- rescue MappingError
56
- cause = $!
57
- end
58
- if @excn_handler_soap2obj
59
- begin
60
- return @excn_handler_soap2obj.call(node) { |yield_node|
61
- Mapping.soap2obj(yield_node, nil, nil, MAPPING_OPT)
62
- }
63
- rescue Exception
27
+ def initialize
28
+ super()
29
+ @excn_handler_obj2soap = nil
30
+ @excn_handler_soap2obj = nil
64
31
  end
65
- end
66
- raise MappingError.new("cannot map #{node.elename.name}/#{node.type.name} to Ruby object", cause)
67
- end
68
32
 
69
- private
33
+ def obj2soap(obj, qname, obj_class = nil)
34
+ soap_obj = nil
35
+ if obj.is_a?(SOAPElement)
36
+ soap_obj = obj
37
+ else
38
+ soap_obj = any2soap(obj, qname, obj_class)
39
+ end
40
+ return soap_obj if soap_obj
41
+ if @excn_handler_obj2soap
42
+ soap_obj = @excn_handler_obj2soap.call(obj) { |yield_obj|
43
+ Mapping.obj2soap(yield_obj, nil, nil, MAPPING_OPT)
44
+ }
45
+ return soap_obj if soap_obj
46
+ end
47
+ raise MappingError.new("cannot map #{obj.class.name} as #{qname}")
48
+ end
70
49
 
71
- MAPPING_OPT = { :no_reference => true }
50
+ # node should be a SOAPElement
51
+ def soap2obj(node, obj_class = nil)
52
+ cause = nil
53
+ begin
54
+ return any2obj(node, obj_class)
55
+ rescue MappingError
56
+ cause = $!
57
+ end
58
+ if @excn_handler_soap2obj
59
+ begin
60
+ return @excn_handler_soap2obj.call(node) { |yield_node|
61
+ Mapping.soap2obj(yield_node, nil, nil, MAPPING_OPT)
62
+ }
63
+ rescue Exception
64
+ end
65
+ end
66
+ raise MappingError.new("cannot map #{node.elename.name}/#{node.type.name} to Ruby object", cause)
67
+ end
72
68
 
73
- def definedobj2soap(obj, definition)
74
- obj2soap(obj, definition.elename, definition.mapped_class)
75
- end
69
+ private
76
70
 
77
- def any2soap(obj, qname, obj_class)
78
- ele = nil
79
- if obj.is_a?(SOAP::Mapping::Object)
80
- return mappingobj2soap(obj, qname)
81
- end
82
- class_definition = schema_definition_from_class(obj.class)
83
- if class_definition.nil? and obj_class
84
- class_definition = schema_definition_from_class(obj_class)
85
- end
86
- elename_definition = schema_definition_from_elename(qname)
87
- if !class_definition and !elename_definition
88
- # no definition found
89
- return anyobj2soap(obj, qname)
90
- end
91
- if !class_definition or !elename_definition
92
- # use found one
93
- return stubobj2soap(obj, qname, class_definition || elename_definition)
94
- end
95
- # found both:
96
- if class_definition.class_for == elename_definition.class_for
97
- # if two definitions are for the same class, give qname a priority.
98
- return stubobj2soap(obj, qname, elename_definition)
99
- end
100
- # it should be a derived class
101
- return stubobj2soap(obj, qname, class_definition)
102
- end
71
+ MAPPING_OPT = { :no_reference => true }
103
72
 
104
- def anyobj2soap(obj, qname)
105
- ele = nil
106
- case obj
107
- when Hash
108
- ele = SOAPElement.from_obj(obj, nil)
109
- ele.elename = qname
110
- when Array
111
- # treat as a list of simpletype
112
- ele = SOAPElement.new(qname, obj.join(" "))
113
- when XSD::QName
114
- ele = SOAPElement.new(qname)
115
- ele.text = obj
116
- else
117
- # expected to be a basetype or an anyType.
118
- # SOAPStruct, etc. is used instead of SOAPElement.
119
- begin
120
- ele = Mapping.obj2soap(obj, nil, nil, MAPPING_OPT)
121
- ele.elename = qname
122
- rescue MappingError
123
- ele = SOAPElement.new(qname, obj.to_s)
73
+ def definedobj2soap(obj, definition)
74
+ obj2soap(obj, definition.elename, definition.mapped_class)
124
75
  end
125
- end
126
- add_attributes2soap(obj, ele)
127
- ele
128
- end
129
76
 
130
- def stubobj2soap(obj, qname, definition)
131
- if obj.nil?
132
- ele = SOAPNil.new
133
- ele.elename = qname
134
- elsif obj.is_a?(::String)
135
- ele = SOAPElement.new(qname, obj)
136
- else
137
- ele = SOAPElement.new(qname)
138
- end
139
- ele.qualified = definition.qualified
140
- if definition.type
141
- ele.type = definition.type
142
- if definition.basetype or Mapping.root_type_hint
143
- Mapping.reset_root_type_hint
144
- ele.force_typed = true
77
+ def any2soap(obj, qname, obj_class)
78
+ ele = nil
79
+ if obj.is_a?(SOAP::Mapping::Object)
80
+ return mappingobj2soap(obj, qname)
81
+ end
82
+ class_definition = schema_definition_from_class(obj.class)
83
+ if class_definition.nil? and obj_class
84
+ class_definition = schema_definition_from_class(obj_class)
85
+ end
86
+ elename_definition = schema_definition_from_elename(qname)
87
+ if !class_definition and !elename_definition
88
+ # no definition found
89
+ return anyobj2soap(obj, qname)
90
+ end
91
+ if !class_definition or !elename_definition
92
+ # use found one
93
+ return stubobj2soap(obj, qname, class_definition || elename_definition)
94
+ end
95
+ # found both:
96
+ if class_definition.class_for == elename_definition.class_for
97
+ # if two definitions are for the same class, give qname a priority.
98
+ return stubobj2soap(obj, qname, elename_definition)
99
+ end
100
+ # it should be a derived class
101
+ return stubobj2soap(obj, qname, class_definition)
145
102
  end
146
- end
147
- if qname.nil? and definition.elename
148
- ele.elename = definition.elename
149
- end
150
- return ele if obj.nil?
151
- stubobj2soap_elements(obj, ele, definition.elements)
152
- add_definedattributes2soap(obj, ele, definition)
153
- ele
154
- end
155
103
 
156
- def stubobj2soap_elements(obj, ele, definition, is_choice = false)
157
- added = false
158
- case definition
159
- when SchemaSequenceDefinition, SchemaEmptyDefinition
160
- definition.each do |eledef|
161
- ele_added = stubobj2soap_elements(obj, ele, eledef, is_choice)
162
- added = true if ele_added
163
- end
164
- when SchemaChoiceDefinition
165
- definition.each do |eledef|
166
- added = stubobj2soap_elements(obj, ele, eledef, true)
167
- break if added
104
+ def anyobj2soap(obj, qname)
105
+ ele = nil
106
+ case obj
107
+ when Hash
108
+ ele = SOAPElement.from_obj(obj, nil)
109
+ ele.elename = qname
110
+ when Array
111
+ # treat as a list of simpletype
112
+ ele = SOAPElement.new(qname, obj.join(" "))
113
+ when XSD::QName
114
+ ele = SOAPElement.new(qname)
115
+ ele.text = obj
116
+ else
117
+ # expected to be a basetype or an anyType.
118
+ # SOAPStruct, etc. is used instead of SOAPElement.
119
+ begin
120
+ ele = Mapping.obj2soap(obj, nil, nil, MAPPING_OPT)
121
+ ele.elename = qname
122
+ rescue MappingError
123
+ ele = SOAPElement.new(qname, obj.to_s)
124
+ end
125
+ end
126
+ add_attributes2soap(obj, ele)
127
+ ele
168
128
  end
169
- else
170
- added = true
171
- if definition.as_any?
172
- any = Mapping.get_attributes_for_any(obj)
173
- SOAPElement.from_objs(any).each do |child|
174
- ele.add(child)
175
- end
176
- elsif obj.respond_to?(:each) and definition.as_array?
177
- obj.each do |item|
178
- ele.add(definedobj2soap(item, definition))
179
- end
180
- else
181
- child = Mapping.get_attribute(obj, definition.varname)
182
- if child.nil? and (is_choice or definition.minoccurs == 0)
183
- added = false
129
+
130
+ def stubobj2soap(obj, qname, definition)
131
+ if obj.nil?
132
+ ele = SOAPNil.new
133
+ ele.elename = qname
134
+ elsif obj.is_a?(::String)
135
+ ele = SOAPElement.new(qname, obj)
184
136
  else
185
- if child.respond_to?(:each) and definition.as_array?
186
- if child.empty?
187
- added = false
188
- else
189
- child.each do |item|
137
+ ele = SOAPElement.new(qname)
138
+ end
139
+ ele.qualified = definition.qualified
140
+ if definition.type
141
+ ele.type = definition.type
142
+ if definition.basetype or Mapping.root_type_hint
143
+ Mapping.reset_root_type_hint
144
+ ele.force_typed = true
145
+ end
146
+ end
147
+ if qname.nil? and definition.elename
148
+ ele.elename = definition.elename
149
+ end
150
+ return ele if obj.nil?
151
+ stubobj2soap_elements(obj, ele, definition.elements)
152
+ add_definedattributes2soap(obj, ele, definition)
153
+ ele
154
+ end
155
+
156
+ def stubobj2soap_elements(obj, ele, definition, is_choice = false)
157
+ added = false
158
+ case definition
159
+ when SchemaSequenceDefinition, SchemaEmptyDefinition
160
+ definition.each do |eledef|
161
+ ele_added = stubobj2soap_elements(obj, ele, eledef, is_choice)
162
+ added = true if ele_added
163
+ end
164
+ when SchemaChoiceDefinition
165
+ definition.each do |eledef|
166
+ added = stubobj2soap_elements(obj, ele, eledef, true)
167
+ break if added
168
+ end
169
+ else
170
+ added = true
171
+ if definition.as_any?
172
+ any = Mapping.get_attributes_for_any(obj)
173
+ SOAPElement.from_objs(any).each do |child|
174
+ ele.add(child)
175
+ end
176
+ elsif obj.respond_to?(:each) and definition.as_array?
177
+ obj.each do |item|
190
178
  ele.add(definedobj2soap(item, definition))
191
179
  end
180
+ else
181
+ child = Mapping.get_attribute(obj, definition.varname)
182
+ if child.nil? and (is_choice or definition.minoccurs == 0)
183
+ added = false
184
+ else
185
+ if child.respond_to?(:each) and definition.as_array?
186
+ if child.empty?
187
+ added = false
188
+ else
189
+ child.each do |item|
190
+ ele.add(definedobj2soap(item, definition))
191
+ end
192
+ end
193
+ else
194
+ ele.add(definedobj2soap(child, definition))
195
+ end
196
+ end
197
+ end
198
+ end
199
+ added
200
+ end
201
+
202
+ def mappingobj2soap(obj, qname)
203
+ ele = SOAPElement.new(qname)
204
+ obj.__xmlele.each do |key, value|
205
+ if value.is_a?(::Array)
206
+ value.each do |item|
207
+ ele.add(obj2soap(item, key))
192
208
  end
193
209
  else
194
- ele.add(definedobj2soap(child, definition))
210
+ ele.add(obj2soap(value, key))
195
211
  end
196
212
  end
213
+ obj.__xmlattr.each do |key, value|
214
+ ele.extraattr[key] = value
215
+ end
216
+ ele
197
217
  end
198
- end
199
- added
200
- end
201
218
 
202
- def mappingobj2soap(obj, qname)
203
- ele = SOAPElement.new(qname)
204
- obj.__xmlele.each do |key, value|
205
- if value.is_a?(::Array)
206
- value.each do |item|
207
- ele.add(obj2soap(item, key))
219
+ def any2obj(node, obj_class = nil)
220
+ is_compound = node.is_a?(::SOAP::SOAPCompoundtype)
221
+ # trust xsi:type first
222
+ if is_compound and node.type
223
+ definition = schema_definition_from_type(node.type)
224
+ end
225
+ # element name next
226
+ definition ||= schema_definition_from_elename(node.elename)
227
+ # class defined in parent type last
228
+ if obj_class
229
+ definition ||= schema_definition_from_class(obj_class)
230
+ end
231
+ if definition
232
+ obj_class = definition.class_for
233
+ end
234
+ if is_compound
235
+ if definition
236
+ return elesoap2stubobj(node, obj_class, definition)
237
+ elsif node.is_a?(::SOAP::SOAPNameAccessible)
238
+ return elesoap2plainobj(node)
239
+ end
208
240
  end
209
- else
210
- ele.add(obj2soap(value, key))
241
+ obj = Mapping.soap2obj(node, nil, obj_class, MAPPING_OPT)
242
+ add_attributes2obj(node, obj)
243
+ obj
211
244
  end
212
- end
213
- obj.__xmlattr.each do |key, value|
214
- ele.extraattr[key] = value
215
- end
216
- ele
217
- end
218
245
 
219
- def any2obj(node, obj_class = nil)
220
- is_compound = node.is_a?(::SOAP::SOAPCompoundtype)
221
- # trust xsi:type first
222
- if is_compound and node.type
223
- definition = schema_definition_from_type(node.type)
224
- end
225
- # element name next
226
- definition ||= schema_definition_from_elename(node.elename)
227
- # class defined in parent type last
228
- if obj_class
229
- definition ||= schema_definition_from_class(obj_class)
230
- end
231
- if definition
232
- obj_class = definition.class_for
233
- end
234
- if is_compound
235
- if definition
236
- return elesoap2stubobj(node, obj_class, definition)
237
- elsif node.is_a?(::SOAP::SOAPNameAccessible)
238
- return elesoap2plainobj(node)
246
+ def elesoap2stubobj(node, obj_class, definition)
247
+ obj = nil
248
+ if obj_class == ::String
249
+ obj = node.text
250
+ elsif obj_class < ::String and node.respond_to?(:text)
251
+ obj = obj_class.new(node.text)
252
+ else
253
+ obj = Mapping.create_empty_object(obj_class)
254
+ add_elesoap2stubobj(node, obj, definition)
255
+ end
256
+ add_attributes2stubobj(node, obj, definition)
257
+ obj
239
258
  end
240
- end
241
- obj = Mapping.soap2obj(node, nil, obj_class, MAPPING_OPT)
242
- add_attributes2obj(node, obj)
243
- obj
244
- end
245
-
246
- def elesoap2stubobj(node, obj_class, definition)
247
- obj = nil
248
- if obj_class == ::String
249
- obj = node.text
250
- elsif obj_class < ::String and node.respond_to?(:text)
251
- obj = obj_class.new(node.text)
252
- else
253
- obj = Mapping.create_empty_object(obj_class)
254
- add_elesoap2stubobj(node, obj, definition)
255
- end
256
- add_attributes2stubobj(node, obj, definition)
257
- obj
258
- end
259
-
260
- def elesoap2plainobj(node)
261
- obj = nil
262
- if !node.have_member
263
- obj = base2obj(node, ::SOAP::SOAPString)
264
- else
265
- obj = anytype2obj(node)
266
- add_elesoap2plainobj(node, obj)
267
- end
268
- add_attributes2obj(node, obj)
269
- obj
270
- end
271
259
 
272
- def anytype2obj(node)
273
- if node.is_a?(::SOAP::SOAPBasetype)
274
- return node.data
275
- end
276
- ::SOAP::Mapping::Object.new
277
- end
278
-
279
- def add_elesoap2stubobj(node, obj, definition)
280
- vars = {}
281
- node.each do |name, value|
282
- item = definition.elements.find_element(value.elename)
283
- if item
284
- child = elesoapchild2obj(value, item)
285
- else
286
- # unknown element is treated as anyType.
287
- child = any2obj(value)
260
+ def elesoap2plainobj(node)
261
+ obj = nil
262
+ if !node.have_member
263
+ obj = base2obj(node, ::SOAP::SOAPString)
264
+ else
265
+ obj = anytype2obj(node)
266
+ add_elesoap2plainobj(node, obj)
267
+ end
268
+ add_attributes2obj(node, obj)
269
+ obj
288
270
  end
289
- if item and item.as_array?
290
- (vars[name] ||= []) << child
291
- elsif vars.key?(name)
292
- vars[name] = [vars[name], child].flatten
293
- else
294
- vars[name] = child
271
+
272
+ def anytype2obj(node)
273
+ if node.is_a?(::SOAP::SOAPBasetype)
274
+ return node.data
275
+ end
276
+ ::SOAP::Mapping::Object.new
295
277
  end
296
- end
297
- if obj.is_a?(::Array) and is_stubobj_elements_for_array(vars)
298
- Array.instance_method(:replace).bind(obj).call(vars.values[0])
299
- else
300
- Mapping.set_attributes(obj, vars)
301
- end
302
- end
303
278
 
304
- def elesoapchild2obj(value, eledef)
305
- if eledef.mapped_class
306
- if eledef.mapped_class.include?(::SOAP::SOAPBasetype)
307
- base2obj(value, eledef.mapped_class)
308
- else
309
- any2obj(value, eledef.mapped_class)
279
+ def add_elesoap2stubobj(node, obj, definition)
280
+ vars = { }
281
+ node.each do |name, value|
282
+ item = definition.elements.find_element(value.elename)
283
+ if item
284
+ child = elesoapchild2obj(value, item)
285
+ else
286
+ # unknown element is treated as anyType.
287
+ child = any2obj(value)
288
+ end
289
+ if item and item.as_array?
290
+ (vars[name] ||= []) << child
291
+ elsif vars.key?(name)
292
+ vars[name] = [vars[name], child].flatten
293
+ else
294
+ vars[name] = child
295
+ end
296
+ end
297
+ if obj.is_a?(::Array) and is_stubobj_elements_for_array(vars)
298
+ Array.instance_method(:replace).bind(obj).call(vars.values[0])
299
+ else
300
+ Mapping.set_attributes(obj, vars)
301
+ end
310
302
  end
311
- else
312
- child_definition = schema_definition_from_elename(eledef.elename)
313
- if child_definition
314
- any2obj(value, child_definition.class_for)
315
- else
316
- # untyped element is treated as anyType.
317
- any2obj(value)
303
+
304
+ def elesoapchild2obj(value, eledef)
305
+ if eledef.mapped_class
306
+ if eledef.mapped_class.include?(::SOAP::SOAPBasetype)
307
+ base2obj(value, eledef.mapped_class)
308
+ else
309
+ any2obj(value, eledef.mapped_class)
310
+ end
311
+ else
312
+ child_definition = schema_definition_from_elename(eledef.elename)
313
+ if child_definition
314
+ any2obj(value, child_definition.class_for)
315
+ else
316
+ # untyped element is treated as anyType.
317
+ any2obj(value)
318
+ end
319
+ end
318
320
  end
319
- end
320
- end
321
321
 
322
- def add_attributes2stubobj(node, obj, definition)
323
- return if obj.nil? or node.extraattr.empty?
324
- if attributes = definition.attributes
325
- define_xmlattr(obj)
326
- attributes.each do |qname, class_name|
327
- child = node.extraattr[qname]
328
- next if child.nil?
329
- if class_name
330
- klass = Mapping.class_from_name(class_name)
331
- if klass.include?(::SOAP::SOAPBasetype)
332
- child = klass.to_data(child)
322
+ def add_attributes2stubobj(node, obj, definition)
323
+ return if obj.nil? or node.extraattr.empty?
324
+ if attributes = definition.attributes
325
+ define_xmlattr(obj)
326
+ attributes.each do |qname, class_name|
327
+ child = node.extraattr[qname]
328
+ next if child.nil?
329
+ if class_name
330
+ klass = Mapping.class_from_name(class_name)
331
+ if klass.include?(::SOAP::SOAPBasetype)
332
+ child = klass.to_data(child)
333
+ end
334
+ end
335
+ obj.__xmlattr[qname] = child
336
+ define_xmlattr_accessor(obj, qname)
333
337
  end
334
338
  end
335
- obj.__xmlattr[qname] = child
336
- define_xmlattr_accessor(obj, qname)
337
339
  end
338
- end
339
- end
340
340
 
341
- def add_elesoap2plainobj(node, obj)
342
- node.each do |name, value|
343
- obj.__add_xmlele_value(value.elename, any2obj(value))
344
- end
345
- end
341
+ def add_elesoap2plainobj(node, obj)
342
+ node.each do |name, value|
343
+ obj.__add_xmlele_value(value.elename, any2obj(value))
344
+ end
345
+ end
346
346
 
347
- def add_attributes2obj(node, obj)
348
- return if obj.nil? or node.extraattr.empty?
349
- define_xmlattr(obj)
350
- node.extraattr.each do |qname, value|
351
- obj.__xmlattr[qname] = value
352
- define_xmlattr_accessor(obj, qname)
353
- end
354
- end
347
+ def add_attributes2obj(node, obj)
348
+ return if obj.nil? or node.extraattr.empty?
349
+ define_xmlattr(obj)
350
+ node.extraattr.each do |qname, value|
351
+ obj.__xmlattr[qname] = value
352
+ define_xmlattr_accessor(obj, qname)
353
+ end
354
+ end
355
355
 
356
- # Mapping.define_attr_accessor calls define_method with proc and it exhausts
357
- # much memory for each singleton Object. just instance_eval instead of it.
358
- def define_xmlattr_accessor(obj, qname)
359
- # untaint depends GenSupport.safemethodname
360
- name = Mapping.safemethodname('xmlattr_' + qname.name).untaint
361
- unless obj.respond_to?(name)
362
- # untaint depends QName#dump
363
- qnamedump = qname.dump.untaint
364
- obj.instance_eval <<-EOS
356
+ # Mapping.define_attr_accessor calls define_method with proc and it exhausts
357
+ # much memory for each singleton Object. just instance_eval instead of it.
358
+ def define_xmlattr_accessor(obj, qname)
359
+ # untaint depends GenSupport.safemethodname
360
+ name = Mapping.safemethodname('xmlattr_' + qname.name).untaint
361
+ unless obj.respond_to?(name)
362
+ # untaint depends QName#dump
363
+ qnamedump = qname.dump.untaint
364
+ obj.instance_eval <<-EOS
365
365
  def #{name}
366
366
  @__xmlattr[#{qnamedump}]
367
367
  end
@@ -369,24 +369,24 @@ private
369
369
  def #{name}=(value)
370
370
  @__xmlattr[#{qnamedump}] = value
371
371
  end
372
- EOS
373
- end
374
- end
372
+ EOS
373
+ end
374
+ end
375
375
 
376
- # Mapping.define_attr_accessor calls define_method with proc and it exhausts
377
- # much memory for each singleton Object. just instance_eval instead of it.
378
- def define_xmlattr(obj)
379
- obj.instance_variable_set('@__xmlattr', {})
380
- unless obj.respond_to?(:__xmlattr)
381
- obj.instance_eval <<-EOS
376
+ # Mapping.define_attr_accessor calls define_method with proc and it exhausts
377
+ # much memory for each singleton Object. just instance_eval instead of it.
378
+ def define_xmlattr(obj)
379
+ obj.instance_variable_set('@__xmlattr', { })
380
+ unless obj.respond_to?(:__xmlattr)
381
+ obj.instance_eval <<-EOS
382
382
  def __xmlattr
383
383
  @__xmlattr
384
384
  end
385
- EOS
385
+ EOS
386
+ end
387
+ end
386
388
  end
387
- end
388
- end
389
389
 
390
390
 
391
- end
391
+ end
392
392
  end
@@ -43,7 +43,7 @@ class SimpleRestriction < Info
43
43
  @fixed = {}
44
44
  @attributes = XSD::NamedElements.new
45
45
  end
46
-
46
+
47
47
  def valid?(value)
48
48
  return false unless check_restriction(value)
49
49
  return false unless check_length(value)
metadata CHANGED
@@ -1,128 +1,100 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: soybean
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.2
5
- prerelease:
4
+ version: 2.5.5
6
5
  platform: ruby
7
6
  authors:
8
7
  - Anton Sozontov
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2011-10-17 00:00:00.000000000 +04:00
13
- default_executable: soybean
11
+ date: 2011-11-21 00:00:00.000000000 Z
14
12
  dependencies:
15
13
  - !ruby/object:Gem::Dependency
16
- name: thor
17
- requirement: &9657940 !ruby/object:Gem::Requirement
18
- none: false
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
19
16
  requirements:
20
- - - ! '>='
17
+ - - ">="
21
18
  - !ruby/object:Gem::Version
22
19
  version: '0'
23
- type: :runtime
20
+ type: :development
24
21
  prerelease: false
25
- version_requirements: *9657940
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
26
27
  - !ruby/object:Gem::Dependency
27
28
  name: activesupport
28
- requirement: &9655280 !ruby/object:Gem::Requirement
29
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '3.1'
34
- type: :runtime
33
+ version: '0'
34
+ type: :development
35
35
  prerelease: false
36
- version_requirements: *9655280
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
37
41
  - !ruby/object:Gem::Dependency
38
42
  name: i18n
39
- requirement: &9652420 !ruby/object:Gem::Requirement
40
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
41
44
  requirements:
42
- - - ! '>='
45
+ - - ">="
43
46
  - !ruby/object:Gem::Version
44
47
  version: '0'
45
- type: :runtime
48
+ type: :development
46
49
  prerelease: false
47
- version_requirements: *9652420
48
- - !ruby/object:Gem::Dependency
49
- name: nokogiri
50
- requirement: &9634920 !ruby/object:Gem::Requirement
51
- none: false
50
+ version_requirements: !ruby/object:Gem::Requirement
52
51
  requirements:
53
- - - ! '>='
52
+ - - ">="
54
53
  - !ruby/object:Gem::Version
55
54
  version: '0'
56
- type: :runtime
57
- prerelease: false
58
- version_requirements: *9634920
59
55
  - !ruby/object:Gem::Dependency
60
- name: rack
61
- requirement: &9633360 !ruby/object:Gem::Requirement
62
- none: false
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
63
58
  requirements:
64
- - - ! '>='
59
+ - - ">="
65
60
  - !ruby/object:Gem::Version
66
61
  version: '0'
67
- type: :runtime
62
+ type: :development
68
63
  prerelease: false
69
- version_requirements: *9633360
70
- - !ruby/object:Gem::Dependency
71
- name: rack-mount
72
- requirement: &9632240 !ruby/object:Gem::Requirement
73
- none: false
64
+ version_requirements: !ruby/object:Gem::Requirement
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
- type: :runtime
79
- prerelease: false
80
- version_requirements: *9632240
81
69
  - !ruby/object:Gem::Dependency
82
- name: rspec
83
- requirement: &9629620 !ruby/object:Gem::Requirement
84
- none: false
70
+ name: rack
71
+ requirement: !ruby/object:Gem::Requirement
85
72
  requirements:
86
- - - ~>
73
+ - - ">="
87
74
  - !ruby/object:Gem::Version
88
- version: 2.3.0
75
+ version: '0'
89
76
  type: :development
90
77
  prerelease: false
91
- version_requirements: *9629620
92
- - !ruby/object:Gem::Dependency
93
- name: yard
94
- requirement: &9628060 !ruby/object:Gem::Requirement
95
- none: false
78
+ version_requirements: !ruby/object:Gem::Requirement
96
79
  requirements:
97
- - - ~>
80
+ - - ">="
98
81
  - !ruby/object:Gem::Version
99
- version: 0.6.0
100
- type: :development
101
- prerelease: false
102
- version_requirements: *9628060
82
+ version: '0'
103
83
  - !ruby/object:Gem::Dependency
104
- name: bundler
105
- requirement: &9626520 !ruby/object:Gem::Requirement
106
- none: false
84
+ name: rack-mount
85
+ requirement: !ruby/object:Gem::Requirement
107
86
  requirements:
108
- - - ~>
87
+ - - ">="
109
88
  - !ruby/object:Gem::Version
110
- version: 1.0.0
89
+ version: '0'
111
90
  type: :development
112
91
  prerelease: false
113
- version_requirements: *9626520
114
- - !ruby/object:Gem::Dependency
115
- name: jeweler
116
- requirement: &9625080 !ruby/object:Gem::Requirement
117
- none: false
92
+ version_requirements: !ruby/object:Gem::Requirement
118
93
  requirements:
119
- - - ~>
94
+ - - ">="
120
95
  - !ruby/object:Gem::Version
121
- version: 1.6.4
122
- type: :development
123
- prerelease: false
124
- version_requirements: *9625080
125
- description: ! 'Generate soap web-services from you wsdl. Generate: all classes from
96
+ version: '0'
97
+ description: 'Generate soap web-services from you wsdl. Generate: all classes from
126
98
  xsd, and other.'
127
99
  email: a.sozontov@gmail.com
128
100
  executables:
@@ -132,8 +104,8 @@ extra_rdoc_files:
132
104
  - LICENSE.txt
133
105
  - README.rdoc
134
106
  files:
135
- - .document
136
- - .rspec
107
+ - ".document"
108
+ - ".rspec"
137
109
  - Gemfile
138
110
  - Gemfile.lock
139
111
  - LICENSE.txt
@@ -164,6 +136,7 @@ files:
164
136
  - lib/soybean/interface_builder.rb
165
137
  - lib/soybean/literal_mapping_registry_creator.rb
166
138
  - lib/soybean/soap_attribute.rb
139
+ - lib/soybean/static_server.rb
167
140
  - soybean.gemspec
168
141
  - soybean.log
169
142
  - spec/soybean_spec.rb
@@ -327,33 +300,27 @@ files:
327
300
  - vendor/soap4r/xsd/xmlparser/rexmlparser.rb
328
301
  - vendor/soap4r/xsd/xmlparser/xmlparser.rb
329
302
  - vendor/soap4r/xsd/xmlparser/xmlscanner.rb
330
- has_rdoc: true
331
303
  homepage: http://github.com/webgago/soybean
332
304
  licenses:
333
305
  - MIT
306
+ metadata: {}
334
307
  post_install_message:
335
308
  rdoc_options: []
336
309
  require_paths:
337
310
  - lib
338
311
  required_ruby_version: !ruby/object:Gem::Requirement
339
- none: false
340
312
  requirements:
341
- - - ! '>='
313
+ - - ">="
342
314
  - !ruby/object:Gem::Version
343
315
  version: '0'
344
- segments:
345
- - 0
346
- hash: 3905213212974955204
347
316
  required_rubygems_version: !ruby/object:Gem::Requirement
348
- none: false
349
317
  requirements:
350
- - - ! '>='
318
+ - - ">="
351
319
  - !ruby/object:Gem::Version
352
320
  version: '0'
353
321
  requirements: []
354
- rubyforge_project:
355
- rubygems_version: 1.6.2
322
+ rubygems_version: 3.1.6
356
323
  signing_key:
357
- specification_version: 3
324
+ specification_version: 4
358
325
  summary: Generate soap web-services from you wsdl. see README
359
326
  test_files: []