Module: Soaspec::WsdlGenerator

Defined in:
lib/soaspec/wsdl_generator.rb

Instance Method Summary collapse

Instance Method Details

#ask_wsdlObject

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

Parameters:

  • underscore_separated (String, Symbol)

    Snakecase value to be converted to camel case



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.

Parameters:

  • (Nokogiri::XML::Element)

Returns:

  • (Boolean)

    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

Parameters:

  • (Nokogiri::XML::Element)


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_detailsObject

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.

Parameters:

  • (Nokogiri::XML::NodeSet)

Returns:

  • (Boolean)

    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

Parameters:

  • type (String)

    Type without the WSDL



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'
    options[:string_default] # 'test string'
  when 'int'
    2
  when 'boolean'
    true
  when 'double'
    '1.5'
  else
    try_enum_for type
  end
end

#name_of_wsdlObject

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.

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



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

Parameters:

  • string (String)

    String to parse for part after 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

Parameters:

  • list (Nokogiri::XML::NodeSet)

    List



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