deepsecurity 0.0.19 → 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +15 -0
- data/Gemfile +5 -0
- data/bin/dsc +4 -61
- data/deepsecurity.gemspec +7 -2
- data/dsc.md +20 -18
- data/lib/deepsecurity.rb +11 -12
- data/lib/deepsecurity/manager.rb +55 -122
- data/lib/deepsecurity/soap_interface.rb +57 -0
- data/lib/deepsecurity/transport_object.rb +5 -1
- data/lib/deepsecurity/transport_objects/anti_malware_event.rb +26 -17
- data/lib/deepsecurity/transport_objects/host.rb +45 -36
- data/lib/deepsecurity/transport_objects/host_detail.rb +17 -45
- data/lib/deepsecurity/transport_objects/host_filter.rb +4 -4
- data/lib/deepsecurity/transport_objects/host_group.rb +38 -29
- data/lib/deepsecurity/transport_objects/id_filter.rb +3 -3
- data/lib/deepsecurity/transport_objects/system_event.rb +1 -1
- data/lib/deepsecurity/transport_objects/time_filter.rb +2 -2
- data/lib/deepsecurity/version.rb +1 -1
- data/lib/dsc/anti_malware_event_command.rb +54 -11
- data/lib/dsc/command.rb +388 -72
- data/lib/dsc/host_detail_command.rb +56 -6
- data/lib/savon_helper.rb +30 -1
- data/lib/savon_helper/caching_object.rb +50 -13
- data/lib/savon_helper/dsl.rb +286 -0
- data/lib/savon_helper/mapping_object.rb +89 -339
- data/lib/savon_helper/soap_interface.rb +77 -0
- data/lib/savon_helper/type_mappings.rb +270 -143
- metadata +8 -6
- data/lib/deepsecurity/ds_object.rb +0 -37
| @@ -0,0 +1,77 @@ | |
| 1 | 
            +
            # @author Udo Schneider <Udo.Schneider@homeaddress.de>
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module SavonHelper
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              class SOAPInterface
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                def initialize(wsdl_url, logger = Logger.new(STDOUT), log_level = nil, options = {})
         | 
| 8 | 
            +
                  @client = Savon.client(options.merge({:wsdl => wsdl_url,
         | 
| 9 | 
            +
                                                        :logger => logger,
         | 
| 10 | 
            +
                                                        :log_level => log_level,
         | 
| 11 | 
            +
                                                        :log => (!log_level.nil?),
         | 
| 12 | 
            +
                                                        :ssl_verify_mode => :none}))
         | 
| 13 | 
            +
                  @logger = logger
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def logger
         | 
| 17 | 
            +
                  @logger
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                # @!group Request Helper
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                # Send a Request to the SOAP API for method with arguments and unwrap the response
         | 
| 23 | 
            +
                # @param method [Symbol] The SOAP method to call.
         | 
| 24 | 
            +
                # @param arguments [Hash] The method arguments
         | 
| 25 | 
            +
                # @return [Hash] The result hash.
         | 
| 26 | 
            +
                def send_soap(method, arguments = {})
         | 
| 27 | 
            +
                  logger.debug { "#{self.class}\##{__method__}(#{method.inspect}, #{arguments.inspect})" }
         | 
| 28 | 
            +
                  retryable(:tries => 5, :on => Errno::ECONNRESET) do
         | 
| 29 | 
            +
                    response = @client.call method, :message => arguments
         | 
| 30 | 
            +
                    return response.to_hash[(method.to_s+"_response").to_sym][(method.to_s+"_return").to_sym]
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                # Helper Method deserializing the SOAP response into an object
         | 
| 35 | 
            +
                # @param method_name [Symbol] The SOAP method to call.
         | 
| 36 | 
            +
                # @param object_class [MappingObject] The class to typecast the result to.
         | 
| 37 | 
            +
                # @param arguments [Hash] The method arguments
         | 
| 38 | 
            +
                # @return [object_class] The object filled from the response.
         | 
| 39 | 
            +
                def request_object(method_name, object_class, arguments={})
         | 
| 40 | 
            +
                  data = send_soap(method_name, arguments)
         | 
| 41 | 
            +
                  # ObjectMapping.to_native(object_class, data, self)
         | 
| 42 | 
            +
                  object_class.from_savon(data, self)
         | 
| 43 | 
            +
                  # raise "Halt"
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                # Helper Method deserializing the SOAP response into an array of objects.
         | 
| 47 | 
            +
                # @param method_name [Symbol] The SOAP method to call.
         | 
| 48 | 
            +
                # @param object_class [MappingObject] The element class to typecast the result elements to.
         | 
| 49 | 
            +
                # @param collection_name [Symbol] The name of the reply parameter.
         | 
| 50 | 
            +
                # @param arguments [Hash] The method arguments
         | 
| 51 | 
            +
                # @return [Array<object_class>] The object filled from the response.
         | 
| 52 | 
            +
                def request_array(method_name, object_class, collection_name = nil, arguments={})
         | 
| 53 | 
            +
                  data = send_soap(method_name, arguments)
         | 
| 54 | 
            +
                  data = data[collection_name] unless collection_name.blank?
         | 
| 55 | 
            +
                  ArrayMapping.to_native(ObjectMapping.new(object_class), data, self)
         | 
| 56 | 
            +
                  # SavonHelper::ArrayMapping.new(SavonHelper::ObjectMapping.new(object_class)).from_savon_data(data)
         | 
| 57 | 
            +
                end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                # @!endgroup
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                def retryable(options = {}, &block)
         | 
| 62 | 
            +
                  opts = {:tries => 1, :on => Exception}.merge(options)
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  retry_exception, retries = opts[:on], opts[:tries]
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  begin
         | 
| 67 | 
            +
                    return yield
         | 
| 68 | 
            +
                  rescue retry_exception
         | 
| 69 | 
            +
                    retry if (retries -= 1) > 0
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  yield
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
            end
         | 
| @@ -2,11 +2,11 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module SavonHelper
         | 
| 4 4 |  | 
| 5 | 
            -
              # A  | 
| 5 | 
            +
              # A TypeMapping class is responsible for converting between Savon primitive types and Ruby Types
         | 
| 6 6 | 
             
              class TypeMapping
         | 
| 7 7 |  | 
| 8 8 | 
             
                # A new instance of TypeMapping with description
         | 
| 9 | 
            -
                # @param [String]  | 
| 9 | 
            +
                # @param description [String] A String describing the mapping.
         | 
| 10 10 | 
             
                # @return [TypeMapping]
         | 
| 11 11 | 
             
                def initialize(description='')
         | 
| 12 12 | 
             
                  @description = description
         | 
| @@ -14,18 +14,18 @@ module SavonHelper | |
| 14 14 |  | 
| 15 15 | 
             
                # @!group Converting
         | 
| 16 16 |  | 
| 17 | 
            -
                # Convert from Savon data to Ruby value
         | 
| 18 | 
            -
                # @param [Hash]  | 
| 17 | 
            +
                # @abstract Convert from Savon data to Ruby value
         | 
| 18 | 
            +
                # @param data [Hash, Object] Source Savon data
         | 
| 19 19 | 
             
                # @return [Object]
         | 
| 20 | 
            -
                def  | 
| 21 | 
            -
                   | 
| 20 | 
            +
                def to_native(data)
         | 
| 21 | 
            +
                  raise "#{self.class}##{__method__}(#{data.inspect}) not implemented!"
         | 
| 22 22 | 
             
                end
         | 
| 23 23 |  | 
| 24 | 
            -
                # Convert from Ruby value type to Savon data
         | 
| 25 | 
            -
                # @param [Object]  | 
| 24 | 
            +
                # @abstract Convert from Ruby value type to Savon data
         | 
| 25 | 
            +
                # @param value [Object] Source Ruby value
         | 
| 26 26 | 
             
                # @return [Object]
         | 
| 27 | 
            -
                def  | 
| 28 | 
            -
                   | 
| 27 | 
            +
                def to_savon(value)
         | 
| 28 | 
            +
                  raise "#{self.class}##{__method__}(#{value.inspect}) not implemented!"
         | 
| 29 29 | 
             
                end
         | 
| 30 30 |  | 
| 31 31 | 
             
                # @!endgroup
         | 
| @@ -36,278 +36,405 @@ module SavonHelper | |
| 36 36 | 
             
                  @description
         | 
| 37 37 | 
             
                end
         | 
| 38 38 |  | 
| 39 | 
            -
                # Return the class represented by the mapping.
         | 
| 39 | 
            +
                # @abstract Return the class represented by the mapping.
         | 
| 40 40 | 
             
                # @return [Class]
         | 
| 41 41 | 
             
                def object_klass
         | 
| 42 | 
            -
                   | 
| 42 | 
            +
                  raise "#{self.class}##{__method__}() not implemented!"
         | 
| 43 43 | 
             
                end
         | 
| 44 44 |  | 
| 45 | 
            -
                # Return the class description represented by the mapping.
         | 
| 45 | 
            +
                # @abstract Return the class description represented by the mapping.
         | 
| 46 46 | 
             
                # @return [String]
         | 
| 47 47 | 
             
                def type_string
         | 
| 48 | 
            -
                   | 
| 49 | 
            -
                end
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                # The current logger
         | 
| 52 | 
            -
                # @return [Logger]
         | 
| 53 | 
            -
                def logger
         | 
| 54 | 
            -
                  DeepSecurity::logger
         | 
| 48 | 
            +
                  raise "#{self.class}##{__method__}() not implemented!"
         | 
| 55 49 | 
             
                end
         | 
| 56 50 |  | 
| 57 51 | 
             
              end
         | 
| 58 52 |  | 
| 59 | 
            -
              #  | 
| 60 | 
            -
              class  | 
| 61 | 
            -
             | 
| 53 | 
            +
              # BooleanMapping maps Savon data to Ruby Booleans.
         | 
| 54 | 
            +
              class BooleanMapping < TypeMapping
         | 
| 62 55 |  | 
| 63 | 
            -
                #  | 
| 64 | 
            -
                # @param [TypeMapping] element_mapping TypeMapping for elements
         | 
| 65 | 
            -
                # @param [Hash,Array] data Savon Data
         | 
| 66 | 
            -
                # @return [Array<Object>]
         | 
| 67 | 
            -
                def self.from_savon_data(element_mapping, data)
         | 
| 68 | 
            -
                  return [] if data.blank?
         | 
| 69 | 
            -
                  result = []
         | 
| 70 | 
            -
                  if data.is_a?(Array)
         | 
| 71 | 
            -
                    data.each do |element|
         | 
| 72 | 
            -
                      result << element_mapping.from_savon_data(element)
         | 
| 73 | 
            -
                    end
         | 
| 74 | 
            -
                  elsif data.is_a?(Hash)
         | 
| 75 | 
            -
                    item = data[:item]
         | 
| 76 | 
            -
                    if item.nil?
         | 
| 77 | 
            -
                      result << element_mapping.from_savon_data(data)
         | 
| 78 | 
            -
                    else
         | 
| 79 | 
            -
                      result = from_savon_data(element_mapping, item)
         | 
| 80 | 
            -
                    end
         | 
| 81 | 
            -
                  else
         | 
| 82 | 
            -
                    raise "Unknown Array mapping"
         | 
| 83 | 
            -
                  end
         | 
| 84 | 
            -
                  result
         | 
| 85 | 
            -
                end
         | 
| 56 | 
            +
                # @!group Converting
         | 
| 86 57 |  | 
| 87 | 
            -
                #  | 
| 88 | 
            -
                # @param [ | 
| 89 | 
            -
                # @ | 
| 90 | 
            -
                 | 
| 91 | 
            -
             | 
| 92 | 
            -
                  super(description)
         | 
| 93 | 
            -
                  @element_mapping = element_mapping
         | 
| 58 | 
            +
                # Convert from Savon data to Ruby Boolean
         | 
| 59 | 
            +
                # @param data [Hash, Boolean, String] Source Savon data
         | 
| 60 | 
            +
                # @return [Boolean]
         | 
| 61 | 
            +
                def to_native(data, interface)
         | 
| 62 | 
            +
                  data.to_s == "true"
         | 
| 94 63 | 
             
                end
         | 
| 95 64 |  | 
| 96 | 
            -
                #  | 
| 97 | 
            -
             | 
| 98 | 
            -
                #  | 
| 99 | 
            -
                 | 
| 100 | 
            -
             | 
| 101 | 
            -
                def from_savon_data(data)
         | 
| 102 | 
            -
                  self.class.from_savon_data(@element_mapping, data)
         | 
| 65 | 
            +
                # Convert from Ruby Boolean type to Savon data
         | 
| 66 | 
            +
                # @param value [Boolean] Source Ruby data
         | 
| 67 | 
            +
                # @return [String]
         | 
| 68 | 
            +
                def to_savon(value)
         | 
| 69 | 
            +
                  value.to_s
         | 
| 103 70 | 
             
                end
         | 
| 104 71 |  | 
| 105 72 | 
             
                # @!endgroup
         | 
| 106 73 |  | 
| 74 | 
            +
             | 
| 107 75 | 
             
                # Return the class represented by the mapping.
         | 
| 108 | 
            -
                # @return [ | 
| 76 | 
            +
                # @return [TrueClass] Return TrueClass as Ruby as no common Boolan class
         | 
| 109 77 | 
             
                def object_klass
         | 
| 110 | 
            -
                   | 
| 78 | 
            +
                  TrueClass
         | 
| 111 79 | 
             
                end
         | 
| 112 80 |  | 
| 113 81 | 
             
                # Return the class description represented by the mapping.
         | 
| 114 82 | 
             
                # @return [String]
         | 
| 115 83 | 
             
                def type_string
         | 
| 116 | 
            -
                  " | 
| 84 | 
            +
                  "bool"
         | 
| 117 85 | 
             
                end
         | 
| 118 86 |  | 
| 119 87 | 
             
              end
         | 
| 120 88 |  | 
| 121 | 
            -
             | 
| 122 | 
            -
              class  | 
| 89 | 
            +
              # IntegerMapping maps Savon data to Ruby integers.
         | 
| 90 | 
            +
              class IntegerMapping < TypeMapping
         | 
| 123 91 |  | 
| 124 92 | 
             
                # @!group Converting
         | 
| 125 93 |  | 
| 126 | 
            -
                # Convert from Savon data to Ruby  | 
| 127 | 
            -
                # @param [Hash]  | 
| 128 | 
            -
                # @return [ | 
| 129 | 
            -
                def  | 
| 130 | 
            -
                  data.to_s | 
| 94 | 
            +
                # Convert from Savon data to Ruby integers
         | 
| 95 | 
            +
                # @param data [Hash, String] Source Savon data
         | 
| 96 | 
            +
                # @return [Integer]
         | 
| 97 | 
            +
                def to_native(data, interface)
         | 
| 98 | 
            +
                  Integer(data.to_s)
         | 
| 131 99 | 
             
                end
         | 
| 132 100 |  | 
| 133 | 
            -
                # Convert from Ruby  | 
| 134 | 
            -
                # @param [ | 
| 135 | 
            -
                # @return [ | 
| 136 | 
            -
                def  | 
| 101 | 
            +
                # Convert from Ruby float type to Savon data
         | 
| 102 | 
            +
                # @param value [Integer] Source Ruby data
         | 
| 103 | 
            +
                # @return [String]
         | 
| 104 | 
            +
                def to_savon(value)
         | 
| 137 105 | 
             
                  value.to_s
         | 
| 138 106 | 
             
                end
         | 
| 139 107 |  | 
| 140 108 | 
             
                # @!endgroup
         | 
| 141 109 |  | 
| 110 | 
            +
                # Return the class represented by the mapping.
         | 
| 111 | 
            +
                # @return [Integer]
         | 
| 112 | 
            +
                def object_klass
         | 
| 113 | 
            +
                  Integer
         | 
| 114 | 
            +
                end
         | 
| 115 | 
            +
             | 
| 142 116 | 
             
                # Return the class description represented by the mapping.
         | 
| 143 117 | 
             
                # @return [String]
         | 
| 144 118 | 
             
                def type_string
         | 
| 145 | 
            -
                  " | 
| 119 | 
            +
                  "int"
         | 
| 146 120 | 
             
                end
         | 
| 147 | 
            -
             | 
| 148 121 | 
             
              end
         | 
| 149 122 |  | 
| 150 | 
            -
               | 
| 123 | 
            +
              # FloatMapping maps Savon data to Ruby floats.
         | 
| 124 | 
            +
              class FloatMapping < TypeMapping
         | 
| 151 125 |  | 
| 152 | 
            -
                 | 
| 153 | 
            -
             | 
| 126 | 
            +
                # @!group Converting
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                # Convert from Savon data to Ruby floats
         | 
| 129 | 
            +
                # @param data [Hash, String] Source Savon data
         | 
| 130 | 
            +
                # @return [Float]
         | 
| 131 | 
            +
                def to_native(data)
         | 
| 132 | 
            +
                  data.to_f
         | 
| 154 133 | 
             
                end
         | 
| 155 134 |  | 
| 156 | 
            -
                 | 
| 157 | 
            -
             | 
| 135 | 
            +
                # Convert from Ruby float type to Savon data
         | 
| 136 | 
            +
                # @param value [Float] Source Ruby data
         | 
| 137 | 
            +
                # @return [String]
         | 
| 138 | 
            +
                def to_savon(value)
         | 
| 139 | 
            +
                  value.to_s
         | 
| 140 | 
            +
                end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                # @!endgroup
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                # Return the class represented by the mapping.
         | 
| 145 | 
            +
                # @return [Float]
         | 
| 146 | 
            +
                def object_klass
         | 
| 147 | 
            +
                  Float
         | 
| 158 148 | 
             
                end
         | 
| 159 149 |  | 
| 150 | 
            +
                # Return the class description represented by the mapping.
         | 
| 151 | 
            +
                # @return [String]
         | 
| 160 152 | 
             
                def type_string
         | 
| 161 | 
            -
                  " | 
| 153 | 
            +
                  "float"
         | 
| 162 154 | 
             
                end
         | 
| 163 155 |  | 
| 164 156 | 
             
              end
         | 
| 165 157 |  | 
| 166 | 
            -
               | 
| 158 | 
            +
              # StringMapping maps Savon data to Ruby strings.
         | 
| 159 | 
            +
              class StringMapping < TypeMapping
         | 
| 167 160 |  | 
| 168 | 
            -
                 | 
| 169 | 
            -
             | 
| 170 | 
            -
             | 
| 161 | 
            +
                # @!group Converting
         | 
| 162 | 
            +
             | 
| 163 | 
            +
                # Convert from Savon data to Ruby strings
         | 
| 164 | 
            +
                # @param data [Hash, String] Source Savon data
         | 
| 165 | 
            +
                # @return [String]
         | 
| 166 | 
            +
                def to_native(data, interface)
         | 
| 167 | 
            +
                  data.to_s
         | 
| 171 168 | 
             
                end
         | 
| 172 169 |  | 
| 173 | 
            -
                 | 
| 174 | 
            -
             | 
| 170 | 
            +
                # Convert from Ruby string type to Savon data
         | 
| 171 | 
            +
                # @param value [String] Source Ruby data
         | 
| 172 | 
            +
                # @return [String]
         | 
| 173 | 
            +
                def to_savon(value)
         | 
| 174 | 
            +
                  value.to_s
         | 
| 175 175 | 
             
                end
         | 
| 176 176 |  | 
| 177 | 
            -
                 | 
| 178 | 
            -
             | 
| 177 | 
            +
                # @!endgroup
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                # @abstract Return the class represented by the mapping.
         | 
| 180 | 
            +
                # @todo Is this really neccessary?
         | 
| 181 | 
            +
                # @return [Class]
         | 
| 182 | 
            +
                def object_klass
         | 
| 183 | 
            +
                  String
         | 
| 179 184 | 
             
                end
         | 
| 180 185 |  | 
| 186 | 
            +
                # Return the class description represented by the mapping.
         | 
| 187 | 
            +
                # @return [String]
         | 
| 181 188 | 
             
                def type_string
         | 
| 182 | 
            -
                  " | 
| 189 | 
            +
                  "String"
         | 
| 183 190 | 
             
                end
         | 
| 184 191 |  | 
| 185 192 | 
             
              end
         | 
| 186 193 |  | 
| 187 | 
            -
               | 
| 188 | 
            -
             | 
| 189 | 
            -
             | 
| 190 | 
            -
                  data.to_f
         | 
| 191 | 
            -
                end
         | 
| 192 | 
            -
             | 
| 193 | 
            -
                def to_savon_data(value)
         | 
| 194 | 
            -
                  value.to_s
         | 
| 195 | 
            -
                end
         | 
| 194 | 
            +
              # IPAddressMapping maps Savon data to Ruby IP Address String.
         | 
| 195 | 
            +
              # @note Currently IPAddressMapping only does a from/to String mapping. The IP Address is not parsed in any way!
         | 
| 196 | 
            +
              class IPAddressMapping < StringMapping
         | 
| 196 197 |  | 
| 198 | 
            +
                # Return the class description represented by the mapping.
         | 
| 199 | 
            +
                # @return [String]
         | 
| 197 200 | 
             
                def type_string
         | 
| 198 | 
            -
                  " | 
| 201 | 
            +
                  "IPAddress"
         | 
| 199 202 | 
             
                end
         | 
| 200 203 |  | 
| 201 204 | 
             
              end
         | 
| 202 205 |  | 
| 203 | 
            -
               | 
| 206 | 
            +
              # DatetimeMapping maps Savon data to Ruby DateTimes.
         | 
| 207 | 
            +
              class DatetimeMapping < TypeMapping
         | 
| 204 208 |  | 
| 205 | 
            -
                 | 
| 206 | 
            -
             | 
| 209 | 
            +
                # @!group Converting
         | 
| 210 | 
            +
             | 
| 211 | 
            +
                # Convert from Savon data to Ruby datetime
         | 
| 212 | 
            +
                # @param data [Hash, String] Source Savon data
         | 
| 213 | 
            +
                # @return [DateTime]
         | 
| 214 | 
            +
                def to_native(data, interface)
         | 
| 215 | 
            +
                  DateTime.parse(data.to_s)
         | 
| 207 216 | 
             
                end
         | 
| 208 217 |  | 
| 209 | 
            -
                 | 
| 210 | 
            -
             | 
| 218 | 
            +
                # Convert from Ruby DateTime type to Savon data
         | 
| 219 | 
            +
                # @param value [DateTime] Source Ruby data
         | 
| 220 | 
            +
                # @return [String]
         | 
| 221 | 
            +
                def to_savon(value)
         | 
| 222 | 
            +
                  value.to_datetime.to_s
         | 
| 211 223 | 
             
                end
         | 
| 212 224 |  | 
| 225 | 
            +
                # @!endgroup
         | 
| 226 | 
            +
             | 
| 227 | 
            +
                # Return the class represented by the mapping.
         | 
| 228 | 
            +
                # @return [DateTime]
         | 
| 229 | 
            +
                def object_klass
         | 
| 230 | 
            +
                  DateTime
         | 
| 231 | 
            +
                end
         | 
| 232 | 
            +
             | 
| 233 | 
            +
                # Return the class description represented by the mapping.
         | 
| 234 | 
            +
                # @return [String]
         | 
| 213 235 | 
             
                def type_string
         | 
| 214 | 
            -
                  " | 
| 236 | 
            +
                  "datetime"
         | 
| 215 237 | 
             
                end
         | 
| 238 | 
            +
             | 
| 216 239 | 
             
              end
         | 
| 217 240 |  | 
| 218 | 
            -
               | 
| 241 | 
            +
              # EnumMapping maps Savon integers to Ruby symbols.
         | 
| 242 | 
            +
              class EnumMapping < TypeMapping
         | 
| 219 243 |  | 
| 220 | 
            -
                 | 
| 221 | 
            -
             | 
| 244 | 
            +
                # A new instance of EnumMapping with description and enum hash enum.
         | 
| 245 | 
            +
                # @param enum [Hash{String => Symbol}] Mapping between Savon Strings and Ruby Symbols.
         | 
| 246 | 
            +
                # @param description [String]
         | 
| 247 | 
            +
                # @return [ArrayMapping]
         | 
| 248 | 
            +
                def initialize(enum, description='')
         | 
| 249 | 
            +
                  super(description)
         | 
| 250 | 
            +
                  @enum = enum
         | 
| 222 251 | 
             
                end
         | 
| 223 252 |  | 
| 224 | 
            -
                 | 
| 225 | 
            -
             | 
| 253 | 
            +
                # @!group Converting
         | 
| 254 | 
            +
             | 
| 255 | 
            +
                # Convert from Savon enum-String to Ruby Symbol
         | 
| 256 | 
            +
                # @param data [String] Source Savon data
         | 
| 257 | 
            +
                # @return [Symbol, nil]
         | 
| 258 | 
            +
                def to_native(data, interface)
         | 
| 259 | 
            +
                  @enum[data]
         | 
| 226 260 | 
             
                end
         | 
| 227 261 |  | 
| 262 | 
            +
                # Convert from Ruby DateTime Symbol to  Savon enum-String
         | 
| 263 | 
            +
                # @param value [Symbol] Source Ruby data
         | 
| 264 | 
            +
                # @return [String]
         | 
| 265 | 
            +
                def to_savon(value)
         | 
| 266 | 
            +
                  @enum.key(value)
         | 
| 267 | 
            +
                end
         | 
| 268 | 
            +
             | 
| 269 | 
            +
                # @!endgroup
         | 
| 270 | 
            +
             | 
| 271 | 
            +
                # Return the class description represented by the mapping.
         | 
| 272 | 
            +
                # @return [String]
         | 
| 228 273 | 
             
                def type_string
         | 
| 229 | 
            -
                  " | 
| 274 | 
            +
                  "enum<#{@enum.values.join(', ')}>"
         | 
| 230 275 | 
             
                end
         | 
| 231 276 |  | 
| 232 277 | 
             
              end
         | 
| 233 278 |  | 
| 234 | 
            -
               | 
| 279 | 
            +
              # HintMapping maps Savon data to Ruby objects of type klass (r/o).
         | 
| 280 | 
            +
              class HintMapping < TypeMapping
         | 
| 235 281 |  | 
| 282 | 
            +
                # A new instance of ObjectMapping with description for class klass.
         | 
| 283 | 
            +
                # @param klass [Class] A class returned by the hint accessor
         | 
| 284 | 
            +
                # @param description [String]
         | 
| 285 | 
            +
                # @return [HintMapping]
         | 
| 236 286 | 
             
                def initialize(klass, description='')
         | 
| 237 287 | 
             
                  super(description)
         | 
| 238 288 | 
             
                  @klass = klass
         | 
| 239 289 | 
             
                end
         | 
| 240 290 |  | 
| 241 | 
            -
                 | 
| 242 | 
            -
                  @klass.from_savon_data(data)
         | 
| 243 | 
            -
                end
         | 
| 291 | 
            +
                # @!endgroup
         | 
| 244 292 |  | 
| 293 | 
            +
                # @abstract Return the class represented by the mapping.
         | 
| 294 | 
            +
                # @return [Class]
         | 
| 245 295 | 
             
                def object_klass
         | 
| 246 296 | 
             
                  @klass
         | 
| 247 297 | 
             
                end
         | 
| 248 298 |  | 
| 299 | 
            +
                # Return the class description represented by the mapping.
         | 
| 300 | 
            +
                # @return [String]
         | 
| 249 301 | 
             
                def type_string
         | 
| 250 | 
            -
                  " | 
| 302 | 
            +
                  "HINT<#{@klass.name_without_namespace}>"
         | 
| 251 303 | 
             
                end
         | 
| 252 304 |  | 
| 253 305 | 
             
              end
         | 
| 254 306 |  | 
| 255 | 
            -
               | 
| 307 | 
            +
              # ObjectMapping maps Savon data to Ruby Objects.
         | 
| 308 | 
            +
              class ObjectMapping < HintMapping
         | 
| 256 309 |  | 
| 257 | 
            -
                 | 
| 258 | 
            -
             | 
| 310 | 
            +
                # Convert from Savon data to Ruby Object.
         | 
| 311 | 
            +
                # @param data [Hash, String] Source Savon data
         | 
| 312 | 
            +
                # @param klass [Class, #to_native] A class which can create instances from Savon data and provide Savon data for export.
         | 
| 313 | 
            +
                # @return [SavonHelper::MappingObject, #to_native]
         | 
| 314 | 
            +
                def self.to_native(klass, data, interface)
         | 
| 315 | 
            +
                  klass.from_savon(data, interface)
         | 
| 259 316 | 
             
                end
         | 
| 260 317 |  | 
| 261 | 
            -
                 | 
| 262 | 
            -
             | 
| 318 | 
            +
                # A new instance of ObjectMapping with description for class klass.
         | 
| 319 | 
            +
                # @param klass [Class, #to_native] A class which can create instances from Savon data and provide Savon data for export.
         | 
| 320 | 
            +
                # @param description [String]
         | 
| 321 | 
            +
                # @return [ObjectMapping]
         | 
| 322 | 
            +
                def initialize(klass, description='')
         | 
| 323 | 
            +
                  super(klass, description)
         | 
| 263 324 | 
             
                end
         | 
| 264 325 |  | 
| 265 | 
            -
                 | 
| 266 | 
            -
                  String
         | 
| 267 | 
            -
                end
         | 
| 326 | 
            +
                # @!group Converting
         | 
| 268 327 |  | 
| 269 | 
            -
                 | 
| 270 | 
            -
             | 
| 328 | 
            +
                # Convert from Savon data to Ruby Object.
         | 
| 329 | 
            +
                # @param data [Hash, String] Source Savon data
         | 
| 330 | 
            +
                # @return [SavonHelper::MappingObject, #to_native]
         | 
| 331 | 
            +
                def to_native(data, interface)
         | 
| 332 | 
            +
                  self.class.to_native(@klass, data, interface)
         | 
| 271 333 | 
             
                end
         | 
| 272 334 |  | 
| 335 | 
            +
                # @!endgroup
         | 
| 336 | 
            +
             | 
| 273 337 | 
             
              end
         | 
| 274 338 |  | 
| 275 | 
            -
               | 
| 339 | 
            +
              # ArrayMapping maps Savon data to Ruby Arrays
         | 
| 340 | 
            +
              class ArrayMapping < TypeMapping
         | 
| 276 341 |  | 
| 277 | 
            -
                 | 
| 278 | 
            -
             | 
| 342 | 
            +
                # Convert the given Savon data to an Array consisting of elements described by element_mapping
         | 
| 343 | 
            +
                # @param element_mapping [TypeMapping] TypeMapping for elements
         | 
| 344 | 
            +
                # @param data [Hash,Array] Source Savon Data
         | 
| 345 | 
            +
                # @return [Array<element_mapping>]
         | 
| 346 | 
            +
                def self.to_native(element_mapping, data, interface)
         | 
| 347 | 
            +
                  return [] if data.blank?
         | 
| 348 | 
            +
                  result = []
         | 
| 349 | 
            +
                  if data.is_a?(Array)
         | 
| 350 | 
            +
                    data.each do |element|
         | 
| 351 | 
            +
                      result << element_mapping.to_native(element, interface)
         | 
| 352 | 
            +
                    end
         | 
| 353 | 
            +
                  elsif data.is_a?(Hash)
         | 
| 354 | 
            +
                    item = data[:item]
         | 
| 355 | 
            +
                    if item.nil?
         | 
| 356 | 
            +
                      result << element_mapping.to_native(data, interface)
         | 
| 357 | 
            +
                    else
         | 
| 358 | 
            +
                      result = to_native(element_mapping, item, interface)
         | 
| 359 | 
            +
                    end
         | 
| 360 | 
            +
                  else
         | 
| 361 | 
            +
                    raise "Unknown Array mapping"
         | 
| 362 | 
            +
                  end
         | 
| 363 | 
            +
                  result
         | 
| 279 364 | 
             
                end
         | 
| 280 365 |  | 
| 281 | 
            -
                 | 
| 282 | 
            -
             | 
| 366 | 
            +
                # A new instance of TypeMapping with description
         | 
| 367 | 
            +
                # @param element_mapping [TypeMapping]  A TypeMapping for elements
         | 
| 368 | 
            +
                # @param description [String]
         | 
| 369 | 
            +
                # @return [ArrayMapping]
         | 
| 370 | 
            +
                def initialize(element_mapping, description='')
         | 
| 371 | 
            +
                  super(description)
         | 
| 372 | 
            +
                  @element_mapping = element_mapping
         | 
| 373 | 
            +
                end
         | 
| 374 | 
            +
             | 
| 375 | 
            +
                # @!group Converting
         | 
| 376 | 
            +
             | 
| 377 | 
            +
                # Convert from Savon data to Ruby value
         | 
| 378 | 
            +
                # @param data [Hash, Hash] Source Savon data
         | 
| 379 | 
            +
                # @return [Array<@element_mapping>]
         | 
| 380 | 
            +
                def to_native(data, interface)
         | 
| 381 | 
            +
                  self.class.to_native(@element_mapping, data, interface)
         | 
| 283 382 | 
             
                end
         | 
| 284 383 |  | 
| 384 | 
            +
                # @!endgroup
         | 
| 385 | 
            +
             | 
| 386 | 
            +
                # Return the class represented by the mapping.
         | 
| 387 | 
            +
                # @return [Class]
         | 
| 388 | 
            +
                def object_klass
         | 
| 389 | 
            +
                  @element_mapping.object_klass
         | 
| 390 | 
            +
                end
         | 
| 391 | 
            +
             | 
| 392 | 
            +
                # Return the class description represented by the mapping.
         | 
| 393 | 
            +
                # @return [String]
         | 
| 285 394 | 
             
                def type_string
         | 
| 286 | 
            -
                  " | 
| 395 | 
            +
                  "Array<#{@element_mapping.type_string}>"
         | 
| 287 396 | 
             
                end
         | 
| 288 397 |  | 
| 289 398 | 
             
              end
         | 
| 290 399 |  | 
| 291 | 
            -
               | 
| 400 | 
            +
              # MissingMapping maps Savon data to itself (no conversion).
         | 
| 401 | 
            +
              class MissingMapping < TypeMapping
         | 
| 292 402 |  | 
| 293 | 
            -
                 | 
| 294 | 
            -
             | 
| 295 | 
            -
             | 
| 403 | 
            +
                # @!group Converting
         | 
| 404 | 
            +
             | 
| 405 | 
            +
                # Convert from Savon data to itself.
         | 
| 406 | 
            +
                # @param data [Object] Source Savon data
         | 
| 407 | 
            +
                # @return [Object]
         | 
| 408 | 
            +
                def to_native(data, interface)
         | 
| 409 | 
            +
                  data
         | 
| 296 410 | 
             
                end
         | 
| 297 411 |  | 
| 298 | 
            -
                 | 
| 299 | 
            -
             | 
| 412 | 
            +
                # Convert from itself (no conversion) to Savon data.
         | 
| 413 | 
            +
                # @param value [Object] Source Ruby data
         | 
| 414 | 
            +
                # @return [Object]
         | 
| 415 | 
            +
                def to_savon(value)
         | 
| 416 | 
            +
                  value
         | 
| 300 417 | 
             
                end
         | 
| 301 418 |  | 
| 419 | 
            +
                # @!endgroup
         | 
| 420 | 
            +
             | 
| 421 | 
            +
                # Return the class description represented by the mapping.
         | 
| 422 | 
            +
                # @return [String]
         | 
| 302 423 | 
             
                def type_string
         | 
| 303 | 
            -
                  " | 
| 424 | 
            +
                  "UNDEFINED"
         | 
| 304 425 | 
             
                end
         | 
| 305 426 |  | 
| 306 427 | 
             
              end
         | 
| 307 428 |  | 
| 308 | 
            -
               | 
| 429 | 
            +
              # Define a MissingMapping for the given options
         | 
| 430 | 
            +
              # @todo Check if mappings can be derived from klass
         | 
| 431 | 
            +
              # @param klass [Class] The class to define the mapping for.
         | 
| 432 | 
            +
              # @param ivar_name [Symbol] The name of the ivar/accessor to hold/access the value
         | 
| 433 | 
            +
              # @param value [Object] The value to set the ivar to.
         | 
| 434 | 
            +
              # @param mappings [Hash{Symbol=>TypeMapping}] The mappings hash to add the HintMapping to.
         | 
| 435 | 
            +
              def self.define_missing_type_mapping(klass, ivar_name, value, mappings, interface)
         | 
| 309 436 | 
             
                message = "No type mapping for #{klass}@#{ivar_name} = #{value}!"
         | 
| 310 | 
            -
                 | 
| 437 | 
            +
                interface.logger.warn(message)
         | 
| 311 438 | 
             
                mappings[ivar_name] = MissingMapping.new(message)
         | 
| 312 439 | 
             
              end
         | 
| 313 440 |  |