soap_enumerator 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +24 -0
- data/LICENSE.txt +21 -0
- data/README.md +98 -0
- data/Rakefile +2 -0
- data/lib/soap_enumerator/bindings/binding.rb +49 -0
- data/lib/soap_enumerator/bindings/operation.rb +39 -0
- data/lib/soap_enumerator/bindings.rb +44 -0
- data/lib/soap_enumerator/definitions.rb +46 -0
- data/lib/soap_enumerator/error.rb +4 -0
- data/lib/soap_enumerator/helpers/generic_helpers.rb +58 -0
- data/lib/soap_enumerator/messages/message.rb +35 -0
- data/lib/soap_enumerator/messages/part.rb +16 -0
- data/lib/soap_enumerator/messages.rb +36 -0
- data/lib/soap_enumerator/port_types/operation.rb +40 -0
- data/lib/soap_enumerator/port_types/port_type.rb +36 -0
- data/lib/soap_enumerator/port_types.rb +39 -0
- data/lib/soap_enumerator/services/address.rb +18 -0
- data/lib/soap_enumerator/services/port.rb +35 -0
- data/lib/soap_enumerator/services/service.rb +34 -0
- data/lib/soap_enumerator/services.rb +19 -0
- data/lib/soap_enumerator/types/complex_type.rb +38 -0
- data/lib/soap_enumerator/types/schema.rb +62 -0
- data/lib/soap_enumerator/types/simple_type.rb +38 -0
- data/lib/soap_enumerator/types/type.rb +17 -0
- data/lib/soap_enumerator/types.rb +42 -0
- data/lib/soap_enumerator/version.rb +3 -0
- data/lib/soap_enumerator.rb +44 -0
- data/soap_enumerator.gemspec +25 -0
- metadata +123 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 87bcf7a47e7b7d93a983d5a3f4b23f72baee8157d202ec35fc6af717141778d8
|
4
|
+
data.tar.gz: bb5c0b94c5730a1cae3de98854b6776701cc3e75083fe3ae8def5170b865ad63
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: '08db9a9b13ac4163e02d467ead6fa2a5bf501c2ea61f0cd363a7c14c8dc7f1dee405ff6eb86739c08b9d86e19d9d3d95ab032145ffbc602ff88fe3c36f7f28a0'
|
7
|
+
data.tar.gz: f7e16fcfccbe9ca300596430dcaf75d16a588833131ad58d2e38d4bb5a9dfd3e5252d6b5516fa32f50f465e672d0d0422165a384653e74de098c8e8e1150d97d
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
soap_enumerator (0.1.0)
|
5
|
+
nokogiri (~> 1.8, >= 1.8.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
mini_portile2 (2.3.0)
|
11
|
+
nokogiri (1.8.5)
|
12
|
+
mini_portile2 (~> 2.3.0)
|
13
|
+
rake (10.5.0)
|
14
|
+
|
15
|
+
PLATFORMS
|
16
|
+
ruby
|
17
|
+
|
18
|
+
DEPENDENCIES
|
19
|
+
bundler (~> 1.17)
|
20
|
+
rake (~> 10.0)
|
21
|
+
soap_enumerator!
|
22
|
+
|
23
|
+
BUNDLED WITH
|
24
|
+
1.17.1
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2018 KING SABRI
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
# SoapEnumerator (Under heavy development)
|
2
|
+
|
3
|
+
Soap Enumerator is a Ruby gem for parsing and enumerating WSDL XML documents inspired by SoapUI. It converts the whole document into objects of itself. Using Soap Enumerator is intuitive, you can call its objects the same way you read the document.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
```
|
8
|
+
$ gem install soap_enumerator
|
9
|
+
```
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
wsdl_doc = open('http://192.168.100.10:8383/dvws/vulnerabilities/wsdlenum/service.php?wsdl')
|
15
|
+
|
16
|
+
require 'soap-enumerator'
|
17
|
+
|
18
|
+
soap_enum = SoapEnumerator::Parse.wsdl(wsdl_doc)
|
19
|
+
|
20
|
+
# Definition Elements
|
21
|
+
definitions = soap_enum.definitions
|
22
|
+
definitions.attributes
|
23
|
+
definitions.types
|
24
|
+
definitions.messages
|
25
|
+
definitions.port_types
|
26
|
+
definitions.bindings
|
27
|
+
definitions.services
|
28
|
+
|
29
|
+
# Types Elements
|
30
|
+
types = soap_enum.types
|
31
|
+
schemas = types.schemas
|
32
|
+
schema = schemas[0]
|
33
|
+
schema.attributes
|
34
|
+
schema.target_namespace
|
35
|
+
complex_types = schema.complex_types
|
36
|
+
complex_type = complex_types[0]
|
37
|
+
ctype = complex_type.all[0]
|
38
|
+
ctype.attributes
|
39
|
+
simple_types = schema.simple_types
|
40
|
+
simple_types = simple_types
|
41
|
+
simple_type = simple_types[0]
|
42
|
+
stype = simple_type.all[0]
|
43
|
+
stype.attributes
|
44
|
+
|
45
|
+
# Message Elements
|
46
|
+
soap_enum.messages
|
47
|
+
messages = soap_enum.messages.list
|
48
|
+
message = messages[0]
|
49
|
+
message.attributes
|
50
|
+
part = message.parts[0]
|
51
|
+
part.name
|
52
|
+
|
53
|
+
# portType Elements
|
54
|
+
soap_enum.port_types
|
55
|
+
port_types = soap_enum.port_types.list
|
56
|
+
port_type = port_types[0]
|
57
|
+
port_type.attributes
|
58
|
+
port_type.name
|
59
|
+
port_type.operations
|
60
|
+
operation = port_type.operations[0]
|
61
|
+
operation.name
|
62
|
+
operation.attributes
|
63
|
+
operation.input
|
64
|
+
operation.output
|
65
|
+
|
66
|
+
# Binding Elements
|
67
|
+
soap_enum.bindings
|
68
|
+
bindings = soap_enum.bindings.list
|
69
|
+
binding = bindings[0]
|
70
|
+
binding.attributes
|
71
|
+
binding.soap_binding
|
72
|
+
operation = binding.operations[0]
|
73
|
+
operation.attributes
|
74
|
+
operation.name
|
75
|
+
operation.input
|
76
|
+
operation.output
|
77
|
+
|
78
|
+
# Services Elements
|
79
|
+
soap_enum.services.list
|
80
|
+
service = soap_enum.services.list[0]
|
81
|
+
service.name
|
82
|
+
ports = service.ports
|
83
|
+
port = ports[0]
|
84
|
+
port.attributes
|
85
|
+
port.address
|
86
|
+
```
|
87
|
+
|
88
|
+
|
89
|
+
## Contributing
|
90
|
+
1. Fork it ( https://github.com/KINGSABRI/soap_enumerator/fork )
|
91
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
92
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
93
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
94
|
+
5. Create a new Pull Request
|
95
|
+
|
96
|
+
## License
|
97
|
+
|
98
|
+
The gem is available as open source under the terms of the [LGPL-3.0 License](https://opensource.org/licenses/LGPL-3.0).
|
data/Rakefile
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require_relative 'operation'
|
2
|
+
|
3
|
+
module SoapEnumerator
|
4
|
+
class Bindings
|
5
|
+
# Binding class is a class for wsdl:binding elements
|
6
|
+
#
|
7
|
+
# @example:
|
8
|
+
# bindings = soap_enum.bindings.list
|
9
|
+
# binding = bindings[0]
|
10
|
+
# binding.attributes
|
11
|
+
# binding.soap_binding
|
12
|
+
# operation = binding.operations[0]
|
13
|
+
# operation.attributes
|
14
|
+
# operation.name
|
15
|
+
# operation.input
|
16
|
+
# operation.output
|
17
|
+
#
|
18
|
+
class Binding
|
19
|
+
include GenericHelpers
|
20
|
+
|
21
|
+
# @!attribute #attributes
|
22
|
+
attr_reader :attributes
|
23
|
+
# @!attribute #soap_binding
|
24
|
+
attr_reader :soap_binding
|
25
|
+
# @!attribute #operations
|
26
|
+
attr_reader :operations
|
27
|
+
|
28
|
+
def initialize(binding_doc)
|
29
|
+
@attributes = attributes_2_methods(binding_doc)
|
30
|
+
@soap_binding = get_soap_binding(binding_doc)
|
31
|
+
@operations = get_operations(binding_doc)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def get_soap_binding(binding_doc)
|
37
|
+
binding_doc.search('//soap:binding').map do |sb|
|
38
|
+
attributes_2_hashes(sb.attributes)
|
39
|
+
end.flatten
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_operations(binding_doc)
|
43
|
+
binding_doc.search('//wsdl:binding/wsdl:operation').map do |ops|
|
44
|
+
Bindings::Binding::Operation.new(ops)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module SoapEnumerator
|
2
|
+
class Bindings
|
3
|
+
class Binding
|
4
|
+
# Operation class is struct class for wsdl:operation
|
5
|
+
# elements (each element is an Operation object)
|
6
|
+
class Operation
|
7
|
+
include GenericHelpers
|
8
|
+
|
9
|
+
# @!attribute #attributes
|
10
|
+
attr_reader :attributes
|
11
|
+
# @!attribute #documentation
|
12
|
+
attr_reader :documentation
|
13
|
+
# @!attribute #input
|
14
|
+
attr_reader :input
|
15
|
+
# @!attribute #output
|
16
|
+
attr_reader :output
|
17
|
+
|
18
|
+
def initialize(ops_doc)
|
19
|
+
@attributes = attributes_2_methods(ops_doc)
|
20
|
+
@input = get_operation(ops_doc, 'input')
|
21
|
+
@output = get_operation(ops_doc, 'output')
|
22
|
+
@documentation = get_documentation(ops_doc)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def get_documentation(doc)
|
27
|
+
doc.search('documentation').text
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_operation(doc, operation)
|
31
|
+
doc.elements
|
32
|
+
.select {|ops| ops.name.include?(operation)}[0]
|
33
|
+
.elements.map {|e| attributes_2_hashes(e.attributes) }.flatten
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative 'bindings/binding'
|
2
|
+
# require_relative 'bindings/operation'
|
3
|
+
|
4
|
+
module SoapEnumerator
|
5
|
+
|
6
|
+
# Bindings class contains all bindings and its operations
|
7
|
+
#
|
8
|
+
# @example:
|
9
|
+
# doc = Nokogiri::XML(open(https://url/service.php?wsdl))
|
10
|
+
# bindings = SoapEnumerator::Bindings.new(doc)
|
11
|
+
# binding = bindings.bindings.list[0]
|
12
|
+
# pp binding
|
13
|
+
# pp binding.operations[0]
|
14
|
+
# pp binding.operations[0].name
|
15
|
+
# pp binding.operations[0].input
|
16
|
+
# pp binding.operations[0].output
|
17
|
+
#
|
18
|
+
class Bindings
|
19
|
+
|
20
|
+
attr_reader :list
|
21
|
+
|
22
|
+
def initialize(doc)
|
23
|
+
@list = get_bindings(doc.search('//wsdl:binding'))
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
# get_bindings method extracts a binding's name
|
29
|
+
#
|
30
|
+
# @param [Nokogiri::XML::Element] doc
|
31
|
+
# Elements of wsdl:binding in the wsdl document
|
32
|
+
#
|
33
|
+
# @return [Array<Binding>]
|
34
|
+
# returns array of Binding objects
|
35
|
+
#
|
36
|
+
# @note: safe navigation is used.
|
37
|
+
# If doc is nil, method returns nil
|
38
|
+
def get_bindings(doc)
|
39
|
+
doc&.map do |binding_doc|
|
40
|
+
Bindings::Binding.new(binding_doc)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative 'types'
|
2
|
+
require_relative 'messages'
|
3
|
+
require_relative 'port_types'
|
4
|
+
require_relative 'bindings'
|
5
|
+
require_relative 'services'
|
6
|
+
|
7
|
+
module SoapEnumerator
|
8
|
+
|
9
|
+
# Types class contains all wsdl:definitions elements as objects.
|
10
|
+
#
|
11
|
+
# @example:
|
12
|
+
# doc = Nokogiri::XML(open(https://url/service.php?wsdl))
|
13
|
+
# definitions = SoapEnumerator::Definitions.new(doc)
|
14
|
+
# definitions.attributes
|
15
|
+
# definitions.types
|
16
|
+
# definitions.messages
|
17
|
+
# definitions.port_types
|
18
|
+
# definitions.bindings
|
19
|
+
# definitions.services
|
20
|
+
#
|
21
|
+
class Definitions
|
22
|
+
include GenericHelpers
|
23
|
+
|
24
|
+
# @!attribute #attributes
|
25
|
+
attr_reader :attributes
|
26
|
+
# @!attribute #types for wsdl schemas elements, it calls [Types] class
|
27
|
+
attr_reader :types
|
28
|
+
# @!attribute #messages for wsdl Message elements, it calls [Messages] class
|
29
|
+
attr_reader :messages
|
30
|
+
# @!attribute #port_types for wsdl PortType elements, it calls [PortTypes] class
|
31
|
+
attr_reader :port_types
|
32
|
+
# @!attribute #bindings for wsdl Binding elements, it calls [Bindings] class
|
33
|
+
attr_reader :bindings
|
34
|
+
# @!attribute #services for wsdl Service elements, it calls [Services] class
|
35
|
+
attr_reader :services
|
36
|
+
|
37
|
+
def initialize(doc)
|
38
|
+
@attributes = attributes_2_methods(doc.search('//wsdl:definitions')[0])
|
39
|
+
@types = Types.new(doc)
|
40
|
+
@messages = Messages.new(doc)
|
41
|
+
@port_types = PortTypes.new(doc)
|
42
|
+
@bindings = Bindings.new(doc)
|
43
|
+
@services = Services.new(doc)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module SoapEnumerator
|
2
|
+
module GenericHelpers
|
3
|
+
|
4
|
+
def to_snake_case(string)
|
5
|
+
string.gsub(/::/, '/')
|
6
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
7
|
+
.gsub(/([a-z\d])([A-Z])/,'\1_\2')
|
8
|
+
.tr("-", "_")
|
9
|
+
.downcase
|
10
|
+
end
|
11
|
+
|
12
|
+
# get each attribute,
|
13
|
+
# convert it to a singleton method.
|
14
|
+
# the new method's name comes from the attribute's name. (convert attr' name to snake_case)
|
15
|
+
# then get the method's value from the attribute's value
|
16
|
+
#
|
17
|
+
# @param [Nokogiri::XML::NodeSet] element
|
18
|
+
#
|
19
|
+
# @return [Array<Symbol>]
|
20
|
+
# Array of symbols which actually now are singleton methods with values
|
21
|
+
def attributes_2_methods(element)
|
22
|
+
element.attributes.map do |_k, attr_v|
|
23
|
+
define_singleton_method(to_snake_case(attr_v.name).to_sym) { attr_v.value }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def attributes_2_hashes(attributes)
|
28
|
+
attributes.values.map {|attr| {attr.name => attr.value}}.flatten
|
29
|
+
end
|
30
|
+
|
31
|
+
# safe_search method
|
32
|
+
# Safely search multiple terms in a document or raise exception.
|
33
|
+
# @param [Array<String>] search_terms
|
34
|
+
# Array of possible search terms to look for.
|
35
|
+
#
|
36
|
+
# @param [Nokogiri::XML::Document] doc
|
37
|
+
# The document to search in using Nokogiri::XML::NodeSet#search method
|
38
|
+
#
|
39
|
+
# @return [Array<Nokogiri::XML::NodeSet>]
|
40
|
+
# return the search's result as an array of [Nokogiri::XML::NodeSet] objects
|
41
|
+
def safe_search(search_terms, doc)
|
42
|
+
search_terms.map do |term|
|
43
|
+
begin
|
44
|
+
result = doc.search(term)
|
45
|
+
if result.empty? or result.nil?
|
46
|
+
next
|
47
|
+
else
|
48
|
+
return result
|
49
|
+
end
|
50
|
+
rescue Nokogiri::XML::XPath::SyntaxError
|
51
|
+
next
|
52
|
+
rescue Exception => e
|
53
|
+
puts e.full_message
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative 'part'
|
2
|
+
|
3
|
+
module SoapEnumerator
|
4
|
+
class Messages
|
5
|
+
|
6
|
+
# Message class is struct class for wsd:message
|
7
|
+
class Message
|
8
|
+
include GenericHelpers
|
9
|
+
|
10
|
+
attr_accessor :attributes
|
11
|
+
attr_accessor :parts
|
12
|
+
|
13
|
+
def initialize(message_doc)
|
14
|
+
@attributes = attributes_2_methods(message_doc)
|
15
|
+
@parts = get_parts(message_doc)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
# get_parts method create an Array of a message's parts
|
21
|
+
#
|
22
|
+
# @param [Nokogiri::XML::Element] message_doc
|
23
|
+
# Elements of wsdl:message in the wsdl document
|
24
|
+
#
|
25
|
+
# @return [Array<Messages::Message::Part>]
|
26
|
+
# returns an array of [Message::Part] objects(@see Message::Part)
|
27
|
+
# which contain each element's name and type
|
28
|
+
def get_parts(message_doc)
|
29
|
+
message_doc.elements&.map do |part_doc|
|
30
|
+
Messages::Message::Part.new(part_doc)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module SoapEnumerator
|
2
|
+
class Messages
|
3
|
+
class Message
|
4
|
+
# Part class is struct class for wsd:part elements (each element is a Part object).
|
5
|
+
class Part
|
6
|
+
include GenericHelpers
|
7
|
+
|
8
|
+
attr_reader :attributes
|
9
|
+
|
10
|
+
def initialize(part_doc)
|
11
|
+
@attributes = attributes_2_methods(part_doc)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative 'messages/message'
|
2
|
+
|
3
|
+
module SoapEnumerator
|
4
|
+
|
5
|
+
# Messages class contains all message elements as objects
|
6
|
+
#
|
7
|
+
# @example:
|
8
|
+
# doc = Nokogiri::XML(open(https://url/service.php?wsdl))
|
9
|
+
# messages = SoapEnumerator::Messages.new(doc)
|
10
|
+
# message = messages.list[0]
|
11
|
+
# message.name
|
12
|
+
# part = message.parts[0]
|
13
|
+
# part.name
|
14
|
+
#
|
15
|
+
class Messages
|
16
|
+
|
17
|
+
attr_reader :list
|
18
|
+
|
19
|
+
def initialize(doc)
|
20
|
+
@list = get_messages(doc.search('//wsdl:message'))
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
# get_messages method generate a list of wsdl:message messages
|
26
|
+
#
|
27
|
+
# @param [Nokogiri::XML::Document] doc
|
28
|
+
#
|
29
|
+
# @return <Array[Message]>
|
30
|
+
def get_messages(doc)
|
31
|
+
doc&.map do |message_doc|
|
32
|
+
Message.new(message_doc)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module SoapEnumerator
|
2
|
+
class PortTypes
|
3
|
+
class PortType
|
4
|
+
# Operation class is a class for wsdl:operation
|
5
|
+
class Operation
|
6
|
+
include GenericHelpers
|
7
|
+
|
8
|
+
# @!attribute #attributes
|
9
|
+
attr_reader :attributes
|
10
|
+
# @!attribute #documentation
|
11
|
+
attr_reader :documentation
|
12
|
+
# @!attribute #input
|
13
|
+
attr_reader :input
|
14
|
+
# @!attribute #output
|
15
|
+
attr_reader :output
|
16
|
+
|
17
|
+
def initialize(ops_doc)
|
18
|
+
@attributes = attributes_2_methods(ops_doc)
|
19
|
+
@documentation = get_documentation(ops_doc)
|
20
|
+
@input = get_operation(ops_doc, 'input')
|
21
|
+
@output = get_operation(ops_doc, 'output')
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def get_documentation(doc)
|
27
|
+
doc.search('documentation').text
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_operation(doc, operation)
|
31
|
+
attributes_2_hashes(
|
32
|
+
doc.elements
|
33
|
+
.select {|ops| ops.name.include?(operation)}[0]
|
34
|
+
.attributes
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative 'operation'
|
2
|
+
|
3
|
+
module SoapEnumerator
|
4
|
+
|
5
|
+
class PortTypes
|
6
|
+
# PortType class is struct class for wsdl:portType
|
7
|
+
class PortType
|
8
|
+
include GenericHelpers
|
9
|
+
|
10
|
+
# @!attribute #attributes
|
11
|
+
attr_reader :attributes
|
12
|
+
# @!attribute #operations
|
13
|
+
attr_reader :operations
|
14
|
+
|
15
|
+
def initialize(port_type_doc)
|
16
|
+
@attributes = attributes_2_methods(port_type_doc)
|
17
|
+
@operations = get_operations(port_type_doc)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
# get_operations method
|
23
|
+
#
|
24
|
+
# @param [Nokogiri::XML::Document] port_type_doc
|
25
|
+
#
|
26
|
+
# @return [Array<Operation>]
|
27
|
+
# return object of [Operation] contains the name of the Operation
|
28
|
+
# and array of all existing operations. (@see #Operation)
|
29
|
+
def get_operations(port_type_doc)
|
30
|
+
port_type_doc.search('//wsdl:operation')&.map do |operation|
|
31
|
+
PortTypes::PortType::Operation.new(operation)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative 'port_types/port_type'
|
2
|
+
|
3
|
+
module SoapEnumerator
|
4
|
+
|
5
|
+
# PortTypes class contains all portType's operation elements as objects
|
6
|
+
#
|
7
|
+
# @example:
|
8
|
+
# doc = Nokogiri::XML(open(https://url/service.php?wsdl))
|
9
|
+
# port_types = SoapEnumerator::PortTypes.new(doc)
|
10
|
+
# port_type = port_types.list[0]
|
11
|
+
# port_type.attributes
|
12
|
+
# port_type.name
|
13
|
+
# port_type.operations
|
14
|
+
# operation = port_type.operations[0]
|
15
|
+
# operation.name
|
16
|
+
# operation.attributes
|
17
|
+
# operation.input
|
18
|
+
# operation.output
|
19
|
+
#
|
20
|
+
class PortTypes
|
21
|
+
|
22
|
+
# @!attribute #list
|
23
|
+
attr_reader :list
|
24
|
+
|
25
|
+
def initialize(doc)
|
26
|
+
begin
|
27
|
+
@list = get_port_types(doc.search('//wsdl:portType'))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def get_port_types(doc)
|
34
|
+
doc&.map do |port_type|
|
35
|
+
PortTypes::PortType.new(port_type)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SoapEnumerator
|
2
|
+
class Services
|
3
|
+
class Service
|
4
|
+
class Port
|
5
|
+
class Address
|
6
|
+
include GenericHelpers
|
7
|
+
|
8
|
+
# @!attribute #attributes
|
9
|
+
attr_reader :attributes
|
10
|
+
|
11
|
+
def initialize(addr_doc)
|
12
|
+
@attributes = attributes_2_methods(addr_doc)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative 'address'
|
2
|
+
|
3
|
+
module SoapEnumerator
|
4
|
+
class Services
|
5
|
+
class Service
|
6
|
+
class Port
|
7
|
+
include GenericHelpers
|
8
|
+
|
9
|
+
# @!attribute #attributes
|
10
|
+
attr_reader :attributes
|
11
|
+
# @!attribute #address
|
12
|
+
attr_reader :address
|
13
|
+
# @!attribute #documentation
|
14
|
+
attr_reader :documentation
|
15
|
+
|
16
|
+
def initialize(port_doc)
|
17
|
+
@attributes = attributes_2_methods(port_doc)
|
18
|
+
@address = get_address(port_doc)
|
19
|
+
@documentation = get_documentation(port_doc)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def get_documentation(doc)
|
25
|
+
doc.search('documentation').text
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_address(port_doc)
|
29
|
+
Services::Service::Port::Address.new(port_doc.elements[0])
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative 'port'
|
2
|
+
|
3
|
+
module SoapEnumerator
|
4
|
+
class Services
|
5
|
+
class Service
|
6
|
+
include GenericHelpers
|
7
|
+
|
8
|
+
# @!attribute #attributes
|
9
|
+
attr_reader :attributes
|
10
|
+
# @!attribute #ports
|
11
|
+
attr_reader :ports
|
12
|
+
|
13
|
+
attr_reader :documentation
|
14
|
+
|
15
|
+
def initialize(service_doc)
|
16
|
+
@attributes = attributes_2_methods(service_doc)
|
17
|
+
@ports = get_ports(service_doc)
|
18
|
+
@documentation = get_documentation(service_doc)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def get_documentation(doc)
|
24
|
+
doc.search('documentation').text
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_ports(service_doc)
|
28
|
+
service_doc.search('//wsdl:port').map do |port|
|
29
|
+
Services::Service::Port.new(port)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative 'services/service'
|
2
|
+
|
3
|
+
module SoapEnumerator
|
4
|
+
class Services
|
5
|
+
|
6
|
+
attr_reader :list
|
7
|
+
|
8
|
+
def initialize(doc)
|
9
|
+
@list = get_services(doc.search('//wsdl:service'))
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def get_services(doc)
|
14
|
+
doc&.map do |service_doc|
|
15
|
+
Services::Service.new(service_doc)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative 'type'
|
2
|
+
|
3
|
+
module SoapEnumerator
|
4
|
+
class Types
|
5
|
+
class Schema
|
6
|
+
# ComplexType class is a class for complexType elements
|
7
|
+
class ComplexType
|
8
|
+
include GenericHelpers
|
9
|
+
|
10
|
+
# @!attribute #attributes
|
11
|
+
attr_reader :attributes
|
12
|
+
# @!attribute #all
|
13
|
+
attr_reader :all
|
14
|
+
|
15
|
+
def initialize(comp_type_doc)
|
16
|
+
@attributes = attributes_2_methods(comp_type_doc)
|
17
|
+
@all = get_type_doc(comp_type_doc)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
# get_type_doc method
|
23
|
+
#
|
24
|
+
# @param [Nokogiri::XML::Document] comp_type_doc
|
25
|
+
#
|
26
|
+
# @return [Array<Type>]
|
27
|
+
# return object of [Type] contains the name of the Type
|
28
|
+
# and array of all existing types. (@see #Type)
|
29
|
+
def get_type_doc(comp_type_doc)
|
30
|
+
search_terms = ['./*/xsd:element', './*/s:element']
|
31
|
+
safe_search(search_terms, comp_type_doc)&.map do |element|
|
32
|
+
Types::Schema::Type.new(element) unless element.nil?
|
33
|
+
end.compact
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require_relative 'complex_type'
|
2
|
+
require_relative 'simple_type'
|
3
|
+
|
4
|
+
module SoapEnumerator
|
5
|
+
class Types
|
6
|
+
# Schema class contains all schema elements as objects.
|
7
|
+
# It dynamically detects schema attributes then generates
|
8
|
+
# attributes for these attributes.
|
9
|
+
# Also, it contains the complexType and simpleType objects
|
10
|
+
#
|
11
|
+
# @example:
|
12
|
+
# @see #Types
|
13
|
+
#
|
14
|
+
class Schema
|
15
|
+
|
16
|
+
include GenericHelpers
|
17
|
+
|
18
|
+
# @!attribute #attributes
|
19
|
+
attr_reader :attributes
|
20
|
+
# @!attribute #complex_types
|
21
|
+
attr_reader :complex_types
|
22
|
+
# @!attribute #simple_types
|
23
|
+
attr_reader :simple_types
|
24
|
+
|
25
|
+
def initialize(schema_doc)
|
26
|
+
@attributes = attributes_2_methods(schema_doc)
|
27
|
+
@complex_types = get_complex_types(schema_doc)
|
28
|
+
@simple_types = get_simple_types(schema_doc)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
# get_complex_types method
|
34
|
+
#
|
35
|
+
# @param [Nokogiri::XML::Document] schema_doc
|
36
|
+
#
|
37
|
+
# @return [Array<ComplexType>]
|
38
|
+
# return object of [ComplexType] contains the name of the complexType
|
39
|
+
# and array of all existing types. (@see #Schema::ComplexType)
|
40
|
+
def get_complex_types(schema_doc)
|
41
|
+
search_terms = ['//./xsd:complexType', '//./s:complexType', '//./complexType']
|
42
|
+
safe_search(search_terms, schema_doc)&.map do |comp_types_doc|
|
43
|
+
Types::Schema::ComplexType.new(comp_types_doc) unless comp_types_doc.nil?
|
44
|
+
end.compact
|
45
|
+
end
|
46
|
+
|
47
|
+
# get_simple_types method
|
48
|
+
#
|
49
|
+
# @param [Nokogiri::XML::Document] schema_doc
|
50
|
+
#
|
51
|
+
# @return [Array<SimpleType>]
|
52
|
+
# return object of [SimpleType] contains the name of the simpleType
|
53
|
+
# and array of all existing types. (@see #Schema::SimpleType)
|
54
|
+
def get_simple_types(schema_doc)
|
55
|
+
search_terms = ['//./xsd:simpleType', '//./s:simpleType', '//./simpleType']
|
56
|
+
safe_search(search_terms, schema_doc)&.map do |comp_types_doc|
|
57
|
+
Types::Schema::SimpleType.new(comp_types_doc) unless comp_types_doc.nil?
|
58
|
+
end.compact
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative 'type'
|
2
|
+
|
3
|
+
module SoapEnumerator
|
4
|
+
class Types
|
5
|
+
class Schema
|
6
|
+
# SimpleType class is a class for simpleType elements
|
7
|
+
class SimpleType
|
8
|
+
include GenericHelpers
|
9
|
+
|
10
|
+
# @!attribute #attributes
|
11
|
+
attr_reader :attributes
|
12
|
+
# @!attribute #all
|
13
|
+
attr_reader :all
|
14
|
+
|
15
|
+
def initialize(comp_type_doc)
|
16
|
+
@attributes = attributes_2_methods(comp_type_doc)
|
17
|
+
@all = get_type_doc(comp_type_doc)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
# get_type_doc method
|
23
|
+
#
|
24
|
+
# @param [Nokogiri::XML::Document] comp_type_doc
|
25
|
+
#
|
26
|
+
# @return [Array<Type>]
|
27
|
+
# return object of [Type] contains the name of the Type
|
28
|
+
# and array of all existing types. (@see #Type)
|
29
|
+
def get_type_doc(comp_type_doc)
|
30
|
+
search_terms = ['./*/xsd:element', './*/s:element', './s:restriction']
|
31
|
+
safe_search(search_terms, comp_type_doc)&.map do |element|
|
32
|
+
Types::Schema::Type.new(element) unless element.nil?
|
33
|
+
end.compact
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module SoapEnumerator
|
2
|
+
class Types
|
3
|
+
class Schema
|
4
|
+
# Type class is struct class for xsd:all elements (each element is a Type object).
|
5
|
+
class Type
|
6
|
+
include GenericHelpers
|
7
|
+
|
8
|
+
# @!attribute #attributes
|
9
|
+
attr_reader :attributes
|
10
|
+
|
11
|
+
def initialize(type_doc)
|
12
|
+
@attributes = attributes_2_methods(type_doc)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative 'types/schema'
|
2
|
+
|
3
|
+
module SoapEnumerator
|
4
|
+
# Types class contains all Types elements as objects
|
5
|
+
#
|
6
|
+
# @example:
|
7
|
+
# doc = Nokogiri::XML(open(https://url/service.php?wsdl))
|
8
|
+
# types = SoapEnumerator::Types.new(doc)
|
9
|
+
# schemas = types.schemas
|
10
|
+
# schema = schemas[0]
|
11
|
+
# schema.attributes
|
12
|
+
# schema.target_namespace
|
13
|
+
# complex_types = schema.complex_types
|
14
|
+
# complex_type = complex_types[-1]
|
15
|
+
# ctype = complex_type.all[0]
|
16
|
+
# ctype.attributes
|
17
|
+
# simple_types = schema.simple_types
|
18
|
+
# simple_types = simple_types
|
19
|
+
# simple_type = simple_types[0]
|
20
|
+
# stype = simple_type.all[0]
|
21
|
+
# stype.attributes
|
22
|
+
#
|
23
|
+
class Types
|
24
|
+
include GenericHelpers
|
25
|
+
|
26
|
+
# @!attribute #schemas
|
27
|
+
attr_reader :schemas
|
28
|
+
|
29
|
+
# @param [Nokogiri::XML::Document] doc
|
30
|
+
def initialize(doc)
|
31
|
+
@schemas = get_schemas(doc.search('//wsdl:types'))
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def get_schemas(types_doc)
|
37
|
+
search_terms = ['//./xsd:schema', '//./s:schema', '//schema']
|
38
|
+
schemas = safe_search(search_terms, types_doc)
|
39
|
+
schemas.map { |schema| Types::Schema.new(schema) unless schema.nil? }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
lib = File.expand_path('..', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
|
4
|
+
require 'nokogiri'
|
5
|
+
require 'soap_enumerator/version'
|
6
|
+
require 'soap_enumerator/helpers/generic_helpers'
|
7
|
+
require 'soap_enumerator/definitions'
|
8
|
+
require 'soap_enumerator/types'
|
9
|
+
require 'soap_enumerator/port_types'
|
10
|
+
require 'soap_enumerator/messages'
|
11
|
+
require 'soap_enumerator/bindings'
|
12
|
+
require 'soap_enumerator/services'
|
13
|
+
require 'soap_enumerator/error'
|
14
|
+
|
15
|
+
module SoapEnumerator
|
16
|
+
|
17
|
+
class Parse
|
18
|
+
singleton_class.send(:alias_method, :wsdl, :new) # an alias for class method #new
|
19
|
+
|
20
|
+
# @!attribute #definitions for wsdl schemas elements, it calls [Definitions] class
|
21
|
+
attr_reader :definitions
|
22
|
+
# @!attribute #types for wsdl schemas elements, it calls [Types] class
|
23
|
+
attr_reader :types
|
24
|
+
# @!attribute #messages for wsdl Message elements, it calls [Messages] class
|
25
|
+
attr_reader :messages
|
26
|
+
# @!attribute #port_types for wsdl PortType elements, it calls [PortTypes] class
|
27
|
+
attr_reader :port_types
|
28
|
+
# @!attribute #bindings for wsdl Binding elements, it calls [Bindings] class
|
29
|
+
attr_reader :bindings
|
30
|
+
# @!attribute #services for wsdl Service elements, it calls [Services] class
|
31
|
+
attr_reader :services
|
32
|
+
|
33
|
+
def initialize(wsdl_doc)
|
34
|
+
doc = Nokogiri::XML(wsdl_doc)
|
35
|
+
|
36
|
+
@definitions = Definitions.new(doc)
|
37
|
+
@types = Types.new(doc)
|
38
|
+
@messages = Messages.new(doc)
|
39
|
+
@port_types = PortTypes.new(doc)
|
40
|
+
@bindings = Bindings.new(doc)
|
41
|
+
@services = Services.new(doc)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "soap_enumerator/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "soap_enumerator"
|
8
|
+
s.version = SoapEnumerator::VERSION
|
9
|
+
s.authors = ["KING SABRI"]
|
10
|
+
s.email = ["king.sabri@gmail.com"]
|
11
|
+
|
12
|
+
s.summary = %q{A gem for SOAP/WSDL enumeration inspired by SoapUI.}
|
13
|
+
s.description = %q{A gem for SOAP/WSDL enumeration inspired by SoapUI. It converts all SOAP's document to ruby objects.}
|
14
|
+
s.homepage = "https://github.com/KINGSABRI/soap_enumerator"
|
15
|
+
s.license = "LGPL-3.0"
|
16
|
+
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.files = `git ls-files -z`.split("\x0").reject do |f|
|
19
|
+
f.match(%r{^(test|spec|features)/})
|
20
|
+
end
|
21
|
+
|
22
|
+
s.add_runtime_dependency 'nokogiri', '~> 1.8', '>= 1.8.0'
|
23
|
+
s.add_development_dependency "bundler", "~> 1.17"
|
24
|
+
s.add_development_dependency "rake", "~> 10.0"
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: soap_enumerator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- KING SABRI
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-12-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nokogiri
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.8'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.8.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.8'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.8.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: bundler
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.17'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.17'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '10.0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '10.0'
|
61
|
+
description: A gem for SOAP/WSDL enumeration inspired by SoapUI. It converts all SOAP's
|
62
|
+
document to ruby objects.
|
63
|
+
email:
|
64
|
+
- king.sabri@gmail.com
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- ".gitignore"
|
70
|
+
- Gemfile
|
71
|
+
- Gemfile.lock
|
72
|
+
- LICENSE.txt
|
73
|
+
- README.md
|
74
|
+
- Rakefile
|
75
|
+
- lib/soap_enumerator.rb
|
76
|
+
- lib/soap_enumerator/bindings.rb
|
77
|
+
- lib/soap_enumerator/bindings/binding.rb
|
78
|
+
- lib/soap_enumerator/bindings/operation.rb
|
79
|
+
- lib/soap_enumerator/definitions.rb
|
80
|
+
- lib/soap_enumerator/error.rb
|
81
|
+
- lib/soap_enumerator/helpers/generic_helpers.rb
|
82
|
+
- lib/soap_enumerator/messages.rb
|
83
|
+
- lib/soap_enumerator/messages/message.rb
|
84
|
+
- lib/soap_enumerator/messages/part.rb
|
85
|
+
- lib/soap_enumerator/port_types.rb
|
86
|
+
- lib/soap_enumerator/port_types/operation.rb
|
87
|
+
- lib/soap_enumerator/port_types/port_type.rb
|
88
|
+
- lib/soap_enumerator/services.rb
|
89
|
+
- lib/soap_enumerator/services/address.rb
|
90
|
+
- lib/soap_enumerator/services/port.rb
|
91
|
+
- lib/soap_enumerator/services/service.rb
|
92
|
+
- lib/soap_enumerator/types.rb
|
93
|
+
- lib/soap_enumerator/types/complex_type.rb
|
94
|
+
- lib/soap_enumerator/types/schema.rb
|
95
|
+
- lib/soap_enumerator/types/simple_type.rb
|
96
|
+
- lib/soap_enumerator/types/type.rb
|
97
|
+
- lib/soap_enumerator/version.rb
|
98
|
+
- soap_enumerator.gemspec
|
99
|
+
homepage: https://github.com/KINGSABRI/soap_enumerator
|
100
|
+
licenses:
|
101
|
+
- LGPL-3.0
|
102
|
+
metadata: {}
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options: []
|
105
|
+
require_paths:
|
106
|
+
- lib
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
requirements: []
|
118
|
+
rubyforge_project:
|
119
|
+
rubygems_version: 2.7.6
|
120
|
+
signing_key:
|
121
|
+
specification_version: 4
|
122
|
+
summary: A gem for SOAP/WSDL enumeration inspired by SoapUI.
|
123
|
+
test_files: []
|