Module: Soaspec::WsdlGenerator
- Defined in:
- lib/soaspec/wsdl_generator.rb
Instance Method Summary collapse
-
#ask_wsdl ⇒ Object
Prompt user for wsdl.
- #camel_case(underscore_separated) ⇒ Object
-
#complex_type?(element) ⇒ Boolean
True if nokogori element is a complex type, that is, has a complexType element underneath itself.
- #document_type_for(element, depth = 1) ⇒ Object
-
#enter_auth_details ⇒ Object
Prompt user to enter basic auth details.
-
#enumeration?(type) ⇒ Boolean
Whether WSDL type is an enumeration.
-
#fill_in_field_from_type(type) ⇒ Object
Based on WSDL type return a valid value.
-
#name_of_wsdl ⇒ Object
Prompt user for Service name for wsdl.
-
#root_elements_for(op_details) ⇒ Nokogiri::XML::NodeSet
List of the root elements in the SOAP body.
-
#try_enum_for(type) ⇒ Object
Attempt to calculate values of enumeration by looking up type in Schema.
-
#value_after_namespace(string) ⇒ Object
Return value of string after a namespace.
-
#wsdl_to_yaml_for(list) ⇒ Object
Makes a yaml string in a ‘@content’ instance variable.
Instance Method Details
#ask_wsdl ⇒ Object
Prompt user for wsdl
109 110 111 112 113 114 115 116 |
# File 'lib/soaspec/wsdl_generator.rb', line 109 def ask_wsdl prompt = <<-EOF Enter WSDL: EOF print prompt.chop @wsdl = $stdin.gets.strip puts end |
#camel_case(underscore_separated) ⇒ Object
57 58 59 |
# File 'lib/soaspec/wsdl_generator.rb', line 57 def camel_case(underscore_separated) underscore_separated.to_s.split('_').collect(&:capitalize).join end |
#complex_type?(element) ⇒ Boolean
Returns True if nokogori element is a complex type, that is, has a complexType element underneath itself.
52 53 54 |
# File 'lib/soaspec/wsdl_generator.rb', line 52 def complex_type?(element) element.children.any? { |child| child.name == 'complexType' } end |
#document_type_for(element, depth = 1) ⇒ Object
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/soaspec/wsdl_generator.rb', line 80 def document_type_for(element, depth = 1) # raise "Too far deep for #{element}" unless depth < 6 return unless depth < 6 if complex_type? element complex_type = element.children.find { |c| c.name == 'complexType' } sequence = complex_type.children.find { |c| c.name == 'sequence' } sequence.children.select { |node| node.class == Nokogiri::XML::Element }.each do |sub_element| document_type_for sub_element, depth += 1 end else return "No type seen for #{element}, #{element.class}" unless element['type'] name = element['name'] type = value_after_namespace(element['type']) @use_camel_case = true if (/[[:upper:]]/.match(name[0]) != nil) spaces = ' ' * depth @content += "#{spaces}#{name.snakecase}: #{fill_in_field_from_type(type)} # #{type} \n" end end |
#enter_auth_details ⇒ Object
Prompt user to enter basic auth details
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/soaspec/wsdl_generator.rb', line 129 def enter_auth_details prompt = <<-EOF User Name: EOF print prompt.chop @auth_name = $stdin.gets.strip puts prompt = <<-EOF User Password: EOF print prompt.chop @auth_password = $stdin.gets.strip puts end |
#enumeration?(type) ⇒ Boolean
Returns Whether WSDL type is an enumeration.
22 23 24 25 |
# File 'lib/soaspec/wsdl_generator.rb', line 22 def enumeration?(type) return false unless type.first !type.xpath("*/#{type.first.namespace.prefix}:enumeration").empty? end |
#fill_in_field_from_type(type) ⇒ Object
Based on WSDL type return a valid value
35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/soaspec/wsdl_generator.rb', line 35 def fill_in_field_from_type(type) case type when 'string' [:string_default] # 'test string' when 'int' 2 when 'boolean' true when 'double' '1.5' else try_enum_for type end end |
#name_of_wsdl ⇒ Object
Prompt user for Service name for wsdl
119 120 121 122 123 124 125 126 |
# File 'lib/soaspec/wsdl_generator.rb', line 119 def name_of_wsdl prompt = <<-EOF Enter what you would like to name WSDL (CamelCase): EOF print prompt.chop @name = $stdin.gets.strip puts end |
#root_elements_for(op_details) ⇒ Nokogiri::XML::NodeSet
Returns List of the root elements in the SOAP body.
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/soaspec/wsdl_generator.rb', line 63 def root_elements_for(op_details) raise "'@wsdl_schemas' must be defined" if @wsdl_schemas.nil? root_element = @wsdl_schemas.at_xpath("//*[@name='#{op_details[:input]}']") raise 'Operation has no input defined' if root_element.nil? schema_namespace = root_element.namespace.prefix root_type = root_element['type'] if root_type @wsdl_schemas.xpath("//*[@name='#{root_type.split(':').last}']//#{schema_namespace}:element") else return [] unless complex_type? root_element # Empty Array if there are no root elements complex_type = root_element.children.find { |c| c.name == 'complexType' } sequence = complex_type.children.find { |c| c.name == 'sequence' } sequence.xpath("#{schema_namespace}:element") end end |
#try_enum_for(type) ⇒ Object
Attempt to calculate values of enumeration by looking up type in Schema
5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# File 'lib/soaspec/wsdl_generator.rb', line 5 def try_enum_for(type) raise "'@wsdl_schemas' must be defined" if @wsdl_schemas.nil? custom_type = @wsdl_schemas.xpath("//*[@name='#{type}']") if enumeration? custom_type prefix = custom_type.first.namespace.prefix enumerations = custom_type.xpath("//#{prefix}:enumeration") return 'Custom Type' if enumerations.empty? @enums_values = [] enumerations.each { |enum_value| @enums_values << "'#{enum_value['value']}'" } "~randomize [#{@enums_values.join(', ')}]" else 'Custom Type' end end |
#value_after_namespace(string) ⇒ Object
Return value of string after a namespace
29 30 31 |
# File 'lib/soaspec/wsdl_generator.rb', line 29 def value_after_namespace(string) string.split(':').last end |
#wsdl_to_yaml_for(list) ⇒ Object
Makes a yaml string in a ‘@content’ instance variable
101 102 103 104 105 106 |
# File 'lib/soaspec/wsdl_generator.rb', line 101 def wsdl_to_yaml_for(list) raise "'@content' string must be set" if @content.nil? list.each do |element| document_type_for element end end |