Module: Soaspec::WsdlGenerator

Defined in:
lib/soaspec/wsdl_generator.rb

Overview

Produce test content from a WSDL

Instance Method Summary collapse

Instance Method Details

#ask_wsdlObject

Prompt user for wsdl



118
119
120
121
122
123
124
125
# File 'lib/soaspec/wsdl_generator.rb', line 118

def ask_wsdl
  prompt = <<-WSDL_LOC
  Enter WSDL:
  WSDL_LOC
  print prompt.chop
  @wsdl = $stdin.gets.strip
  puts
end

#camel_case(underscore_separated) ⇒ String

Returns CamelCased value.

Parameters:

  • underscore_separated (String, Symbol)

    Snakecase value to be converted to camel case

Returns:

  • (String)

    CamelCased value



60
61
62
# File 'lib/soaspec/wsdl_generator.rb', line 60

def camel_case(underscore_separated)
  underscore_separated.to_s.split('_').collect(&:capitalize).join
end

#complex_type?(element) ⇒ Boolean

Returns True if Nokogiri element is a complex type, that is, has a complexType element underneath itself.

Parameters:

  • (Nokogiri::XML::Element)

Returns:

  • (Boolean)

    True if Nokogiri element is a complex type, that is, has a complexType element underneath itself



54
55
56
# File 'lib/soaspec/wsdl_generator.rb', line 54

def complex_type?(element)
  element.children.any? { |child| child.name == 'complexType' }
end

#document_type_for(element, depth = 1) ⇒ Object

Adds documentation content for all children of XML element

Parameters:

  • element (Nokogiri::XML::Element)

    Type to document for

  • depth (Integer) (defaults to: 1)

    How many times to iterate depth for



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/soaspec/wsdl_generator.rb', line 88

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 unless /[[:upper:]]/.match(name[0]).nil?
    spaces = '  ' * depth
    @content += "#{spaces}#{name.snakecase}: #{fill_in_field_from_type(type)} # #{type} \n"
  end
end

#enter_auth_detailsObject

Prompt user to enter basic auth details



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/soaspec/wsdl_generator.rb', line 138

def enter_auth_details
  prompt = <<-AUTH_PROMPT
  User Name:
  AUTH_PROMPT
  print prompt.chop
  @auth_name = $stdin.gets.strip
  puts

  prompt = <<-PASSWORD
  User Password:
  PASSWORD
  print prompt.chop
  @auth_password = $stdin.gets.strip
  puts
end

#enumeration?(type) ⇒ Boolean

Returns Whether WSDL type is an enumeration.

Parameters:

  • (Nokogiri::XML::NodeSet)

Returns:

  • (Boolean)

    Whether WSDL type is an enumeration



25
26
27
28
29
# File 'lib/soaspec/wsdl_generator.rb', line 25

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

Parameters:

  • type (String)

    Type without the WSDL

Returns:

  • (Object)

    Value representing type to fill in



41
42
43
44
45
46
47
48
49
50
# File 'lib/soaspec/wsdl_generator.rb', line 41

def fill_in_field_from_type(type)
  case type
  when 'string' then options[:string_default] # 'test string'
  when 'int' then 2
  when 'boolean' then true
  when 'double' then '1.5'
  else
    try_enum_for type
  end
end

#name_of_wsdlObject

Prompt user for Service name for wsdl



128
129
130
131
132
133
134
135
# File 'lib/soaspec/wsdl_generator.rb', line 128

def name_of_wsdl
  prompt = <<-WSDL_NAME
  Enter what you would like to name WSDL (CamelCase):
  WSDL_NAME
  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.

Parameters:

  • op_details (Hash)

    Hash with details from WSDL for an operation

Returns:

  • (Nokogiri::XML::NodeSet)

    List of the root elements in the SOAP body



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/soaspec/wsdl_generator.rb', line 66

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

Parameters:

  • type (String)

    Try out filling enumeration for type. Return Custom Type if can’t be done



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/soaspec/wsdl_generator.rb', line 6

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) ⇒ String

Return value of string after a namespace

Parameters:

  • string (String)

    String to parse for part after namespace

Returns:

  • (String)

    Part after the namespace, demonstrated by ‘:’



34
35
36
# File 'lib/soaspec/wsdl_generator.rb', line 34

def value_after_namespace(string)
  string.split(':').last
end

#wsdl_to_yaml_for(list) ⇒ Object

Makes a yaml string in a ‘@content’ instance variable

Parameters:

  • list (Nokogiri::XML::NodeSet)

    List to convert to YAML



111
112
113
114
115
# File 'lib/soaspec/wsdl_generator.rb', line 111

def wsdl_to_yaml_for(list)
  raise "'@content' string must be set" if @content.nil?

  list.each { |element| document_type_for element }
end