soaspec 0.2.8 → 0.2.9
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.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +0 -17
- data/ChangeLog +6 -0
- data/Gemfile +2 -2
- data/README.md +42 -9
- data/Rakefile +1 -1
- data/exe/soaspec +9 -14
- data/exe/xml_to_yaml_file +3 -3
- data/images/basic_demo.gif +0 -0
- data/lib/soaspec.rb +9 -19
- data/lib/soaspec/core_ext/hash.rb +10 -12
- data/lib/soaspec/cucumber/generic_steps.rb +1 -1
- data/lib/soaspec/exchange.rb +4 -1
- data/lib/soaspec/exchange_handlers/exchange_handler.rb +5 -4
- data/lib/soaspec/exchange_handlers/handler_accessors.rb +7 -3
- data/lib/soaspec/exchange_handlers/response_extractor.rb +55 -0
- data/lib/soaspec/exchange_handlers/rest_exchanger_factory.rb +1 -1
- data/lib/soaspec/exchange_handlers/rest_handler.rb +16 -43
- data/lib/soaspec/exchange_handlers/rest_methods.rb +1 -2
- data/lib/soaspec/exchange_handlers/rest_parameters.rb +6 -2
- data/lib/soaspec/exchange_handlers/rest_parameters_defaults.rb +1 -1
- data/lib/soaspec/exchange_handlers/soap_handler.rb +6 -10
- data/lib/soaspec/exchange_properties.rb +1 -2
- data/lib/soaspec/exe_helpers.rb +7 -9
- data/lib/soaspec/indifferent_hash.rb +1 -1
- data/lib/soaspec/interpreter.rb +1 -3
- data/lib/soaspec/matchers.rb +1 -2
- data/lib/soaspec/o_auth2.rb +2 -1
- data/lib/soaspec/spec_logger.rb +54 -12
- data/lib/soaspec/template_reader.rb +2 -1
- data/lib/soaspec/test_server/get_bank.rb +5 -5
- data/lib/soaspec/test_server/id_manager.rb +1 -3
- data/lib/soaspec/test_server/invoices.rb +0 -1
- data/lib/soaspec/test_server/puppy_service.rb +0 -1
- data/lib/soaspec/test_server/test_attribute.rb +0 -1
- data/lib/soaspec/version.rb +2 -2
- data/lib/soaspec/virtual_server.rb +1 -1
- data/lib/soaspec/wait.rb +1 -1
- data/lib/soaspec/wsdl_generator.rb +11 -3
- data/soaspec.gemspec +7 -2
- data/test_wsdl.rb +4 -7
- metadata +54 -10
| @@ -0,0 +1,55 @@ | |
| 1 | 
            +
            module Soaspec
         | 
| 2 | 
            +
              # Enables extracting a response according to type / path
         | 
| 3 | 
            +
              module ResponseExtractor
         | 
| 4 | 
            +
                # Convert XML or JSON response into a Hash. Doesn't accept empty body
         | 
| 5 | 
            +
                # @param [String] response Response as a String (either in XML or JSON)
         | 
| 6 | 
            +
                # @return [Hash] Extracted Hash from response
         | 
| 7 | 
            +
                def extract_hash(response)
         | 
| 8 | 
            +
                  raise NoElementAtPath, "Empty Body. Can't assert on it" if response.body.empty?
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  case Interpreter.response_type_for response
         | 
| 11 | 
            +
                  when :xml then parse_xml(response.body.to_s)
         | 
| 12 | 
            +
                  when :json
         | 
| 13 | 
            +
                    converted = JSON.parse(response.body)
         | 
| 14 | 
            +
                    return converted.transform_keys_to_symbols if converted.is_a? Hash
         | 
| 15 | 
            +
                    return converted.map!(&:transform_keys_to_symbols) if converted.is_a? Array
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                    raise 'Incorrect Type produced ' + converted.class
         | 
| 18 | 
            +
                  else
         | 
| 19 | 
            +
                    raise "Neither XML nor JSON detected. It is #{type}. Don't know how to parse It is #{response.body}"
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                # @return [Hash] Hash representing response body
         | 
| 24 | 
            +
                def to_hash(response)
         | 
| 25 | 
            +
                  case Interpreter.response_type_for(response)
         | 
| 26 | 
            +
                  when :xml then parse_xml(response.body.to_s)
         | 
| 27 | 
            +
                  when :json
         | 
| 28 | 
            +
                    JSON.parse(response.body.to_s)
         | 
| 29 | 
            +
                  else
         | 
| 30 | 
            +
                    raise "Unable to interpret type of #{response.body}"
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                private
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                # @param [String] xml XML to convert
         | 
| 37 | 
            +
                # @return [Hash] Hash representing XML
         | 
| 38 | 
            +
                def parse_xml(xml)
         | 
| 39 | 
            +
                  parser = Nori.new(strip_namespaces: strip_namespaces?, convert_tags_to: ->(tag) { tag.snakecase.to_sym })
         | 
| 40 | 
            +
                  parser.parse(xml)
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                # This enables shortcut xpaths to be used. If no '/' is given, one is appended to the start of the path
         | 
| 44 | 
            +
                # If attribute value is set then this is also adjusted
         | 
| 45 | 
            +
                # @return [String] New Xpath adjusted according to any add ons
         | 
| 46 | 
            +
                def prefix_xpath(xpath, attribute)
         | 
| 47 | 
            +
                  xpath = "//*[@#{attribute}]" unless attribute.nil?
         | 
| 48 | 
            +
                  if xpath[0] != '/'
         | 
| 49 | 
            +
                    xpath = convert_to_pascal_case(xpath) if pascal_keys?
         | 
| 50 | 
            +
                    xpath = '//' + xpath
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                  xpath
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
            end
         | 
| @@ -6,6 +6,7 @@ require_relative '../core_ext/hash' | |
| 6 6 | 
             
            require_relative '../not_found_errors'
         | 
| 7 7 | 
             
            require_relative 'handler_accessors'
         | 
| 8 8 | 
             
            require_relative '../interpreter'
         | 
| 9 | 
            +
            require_relative 'response_extractor'
         | 
| 9 10 | 
             
            require 'json'
         | 
| 10 11 | 
             
            require 'jsonpath'
         | 
| 11 12 | 
             
            require 'nori'
         | 
| @@ -14,6 +15,7 @@ require 'erb' | |
| 14 15 | 
             
            module Soaspec
         | 
| 15 16 | 
             
              # Wraps around Savon client defining default values dependent on the soap request
         | 
| 16 17 | 
             
              class RestHandler < ExchangeHandler
         | 
| 18 | 
            +
                include ResponseExtractor
         | 
| 17 19 | 
             
                extend Soaspec::RestParameters
         | 
| 18 20 | 
             
                include Soaspec::RestParametersDefaults
         | 
| 19 21 | 
             
                extend Soaspec::RestExchangeFactory
         | 
| @@ -25,6 +27,7 @@ module Soaspec | |
| 25 27 | 
             
                # @param [Hash] options Options defining REST request. base_url, default_hash
         | 
| 26 28 | 
             
                def initialize(name = self.class.to_s, options = {})
         | 
| 27 29 | 
             
                  raise "Base URL not set! Please set in class with 'base_url' method" unless base_url_value
         | 
| 30 | 
            +
             | 
| 28 31 | 
             
                  if name.is_a?(Hash) && options == {} # If name is not set, use first parameter as the options hash
         | 
| 29 32 | 
             
                    options = name
         | 
| 30 33 | 
             
                    name = self.class.to_s
         | 
| @@ -87,6 +90,7 @@ module Soaspec | |
| 87 90 | 
             
                def parse_headers
         | 
| 88 91 | 
             
                  Hash[rest_client_headers.map do |header_name, header_value|
         | 
| 89 92 | 
             
                    raise ArgumentError, "Header '#{header_name}' is null. Headers are #{rest_client_headers}" if header_value.nil?
         | 
| 93 | 
            +
             | 
| 90 94 | 
             
                    [header_name, ERB.new(header_value).result(binding)]
         | 
| 91 95 | 
             
                  end]
         | 
| 92 96 | 
             
                end
         | 
| @@ -94,6 +98,7 @@ module Soaspec | |
| 94 98 | 
             
                # Convert snakecase to PascalCase
         | 
| 95 99 | 
             
                def convert_to_pascal_case(key)
         | 
| 96 100 | 
             
                  return key if /[[:upper:]]/ =~ key[0] # If first character already capital, don't do conversion
         | 
| 101 | 
            +
             | 
| 97 102 | 
             
                  key.split('_').map(&:capitalize).join
         | 
| 98 103 | 
             
                end
         | 
| 99 104 |  | 
| @@ -104,9 +109,7 @@ module Soaspec | |
| 104 109 | 
             
                  options.merge! basic_auth_params if respond_to? :basic_auth_params
         | 
| 105 110 | 
             
                  options[:headers] ||= {}
         | 
| 106 111 | 
             
                  options[:headers].merge! parse_headers
         | 
| 107 | 
            -
                  if Soaspec.auto_oauth && respond_to?(:access_token)
         | 
| 108 | 
            -
                    options[:headers][:authorization] ||= ERB.new('Bearer <%= access_token %>').result(binding)
         | 
| 109 | 
            -
                  end
         | 
| 112 | 
            +
                  options[:headers][:authorization] ||= ERB.new('Bearer <%= access_token %>').result(binding) if Soaspec.auto_oauth && respond_to?(:access_token)
         | 
| 110 113 | 
             
                  options.merge(@init_options)
         | 
| 111 114 | 
             
                end
         | 
| 112 115 |  | 
| @@ -143,16 +146,14 @@ module Soaspec | |
| 143 146 |  | 
| 144 147 | 
             
                # Returns the value at the provided xpath
         | 
| 145 148 | 
             
                # @param [RestClient::Response] response
         | 
| 146 | 
            -
                # @param [String] xpath
         | 
| 149 | 
            +
                # @param [String] xpath Path to find elements from
         | 
| 150 | 
            +
                # @param [String] attribute Attribute to find path for
         | 
| 147 151 | 
             
                # @return [Enumerable] Value inside element found through Xpath
         | 
| 148 152 | 
             
                def xpath_elements_for(response: nil, xpath: nil, attribute: nil)
         | 
| 149 153 | 
             
                  raise ArgumentError unless response && xpath
         | 
| 150 154 | 
             
                  raise "Can't perform XPATH if response is not XML" unless Interpreter.response_type_for(response) == :xml
         | 
| 151 | 
            -
             | 
| 152 | 
            -
                   | 
| 153 | 
            -
                    xpath = convert_to_pascal_case(xpath) if pascal_keys?
         | 
| 154 | 
            -
                    xpath = '//' + xpath
         | 
| 155 | 
            -
                  end
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                  xpath = prefix_xpath(xpath, attribute)
         | 
| 156 157 | 
             
                  temp_doc = Nokogiri.parse(response.body).dup
         | 
| 157 158 | 
             
                  if strip_namespaces? && !xpath.include?(':')
         | 
| 158 159 | 
             
                    temp_doc.remove_namespaces!
         | 
| @@ -165,6 +166,7 @@ module Soaspec | |
| 165 166 | 
             
                # @return [Enumerable] List of values matching JSON path
         | 
| 166 167 | 
             
                def json_path_values_for(response, path, attribute: nil)
         | 
| 167 168 | 
             
                  raise 'JSON does not support attributes' if attribute
         | 
| 169 | 
            +
             | 
| 168 170 | 
             
                  if path[0] != '$'
         | 
| 169 171 | 
             
                    path = convert_to_pascal_case(path) if pascal_keys?
         | 
| 170 172 | 
             
                    path = '$..' + path
         | 
| @@ -183,8 +185,9 @@ module Soaspec | |
| 183 185 | 
             
                  case Interpreter.response_type_for(response)
         | 
| 184 186 | 
             
                  when :xml
         | 
| 185 187 | 
             
                    result = xpath_elements_for(response: response, xpath: path, attribute: attribute).first
         | 
| 186 | 
            -
                    raise NoElementAtPath, "No value at Xpath '#{path}'" unless result
         | 
| 188 | 
            +
                    raise NoElementAtPath, "No value at Xpath '#{prefix_xpath(path, attribute)}'" unless result
         | 
| 187 189 | 
             
                    return result.inner_text if attribute.nil?
         | 
| 190 | 
            +
             | 
| 188 191 | 
             
                    return result.attributes[attribute].inner_text
         | 
| 189 192 | 
             
                  when :json
         | 
| 190 193 | 
             
                    paths_to_check = path.split(',')
         | 
| @@ -192,11 +195,13 @@ module Soaspec | |
| 192 195 | 
             
                      json_path_values_for(response, path_to_check, attribute: attribute)
         | 
| 193 196 | 
             
                    end.reject(&:empty?)
         | 
| 194 197 | 
             
                    raise NoElementAtPath, "Path '#{path}' not found in '#{response.body}'" if matching_values.empty?
         | 
| 198 | 
            +
             | 
| 195 199 | 
             
                    matching_values.first.first
         | 
| 196 200 | 
             
                  when :hash
         | 
| 197 201 | 
             
                    response.dig(path.split('.')) # Use path as Hash dig expression separating params via '.' TODO: Unit test
         | 
| 198 202 | 
             
                  else
         | 
| 199 203 | 
             
                    raise NoElementAtPath, 'Response is empty' if response.to_s.empty?
         | 
| 204 | 
            +
             | 
| 200 205 | 
             
                    response.to_s[/path/] # Perform regular expression using path if not XML nor JSON TODO: Unit test
         | 
| 201 206 | 
             
                  end
         | 
| 202 207 | 
             
                end
         | 
| @@ -214,42 +219,10 @@ module Soaspec | |
| 214 219 | 
             
                  end
         | 
| 215 220 | 
             
                end
         | 
| 216 221 |  | 
| 217 | 
            -
                # TODO: This and 'to_hash' method should be merged
         | 
| 218 | 
            -
                # Convert XML or JSON response into a Hash
         | 
| 219 | 
            -
                # @param [String] response Response as a String (either in XML or JSON)
         | 
| 220 | 
            -
                # @return [Hash]
         | 
| 221 | 
            -
                def extract_hash(response)
         | 
| 222 | 
            -
                  raise NoElementAtPath, "Empty Body. Can't assert on it" if response.body.empty?
         | 
| 223 | 
            -
                  case Interpreter.response_type_for response
         | 
| 224 | 
            -
                  when :json
         | 
| 225 | 
            -
                    converted = JSON.parse(response.body)
         | 
| 226 | 
            -
                    return converted.transform_keys_to_symbols if converted.is_a? Hash
         | 
| 227 | 
            -
                    return converted.map!(&:transform_keys_to_symbols) if converted.is_a? Array
         | 
| 228 | 
            -
                    raise 'Incorrect Type produced ' + converted.class
         | 
| 229 | 
            -
                  when :xml
         | 
| 230 | 
            -
                    parser = Nori.new(convert_tags_to: lambda { |tag| tag.snakecase.to_sym })
         | 
| 231 | 
            -
                    parser.parse(response.body)
         | 
| 232 | 
            -
                  else
         | 
| 233 | 
            -
                    raise "Neither XML nor JSON detected. It is #{type}. Don't know how to parse It is #{response.body}"
         | 
| 234 | 
            -
                  end
         | 
| 235 | 
            -
                end
         | 
| 236 | 
            -
             | 
| 237 | 
            -
                # @return [Hash] Hash representing response body
         | 
| 238 | 
            -
                def to_hash(response)
         | 
| 239 | 
            -
                  case Interpreter.response_type_for(response)
         | 
| 240 | 
            -
                  when :xml
         | 
| 241 | 
            -
                    parser = Nori.new(strip_namespaces: strip_namespaces?, convert_tags_to: ->(tag) { tag.snakecase.to_sym })
         | 
| 242 | 
            -
                    parser.parse(response.body.to_s)
         | 
| 243 | 
            -
                  when :json
         | 
| 244 | 
            -
                    JSON.parse(response.body.to_s)
         | 
| 245 | 
            -
                  else
         | 
| 246 | 
            -
                    raise "Unable to interpret type of #{response.body}"
         | 
| 247 | 
            -
                  end
         | 
| 248 | 
            -
                end
         | 
| 249 | 
            -
             | 
| 250 222 | 
             
                # @response [RestClient::Request] Request of API call. Either intended request or actual request
         | 
| 251 223 | 
             
                def request(response)
         | 
| 252 224 | 
             
                  return 'Request not yet sent' if response.nil?
         | 
| 225 | 
            +
             | 
| 253 226 | 
             
                  response.request
         | 
| 254 227 | 
             
                end
         | 
| 255 228 |  | 
| @@ -1,11 +1,11 @@ | |
| 1 1 | 
             
            module Soaspec
         | 
| 2 2 | 
             
              # Methods to define parameters specific to REST handler
         | 
| 3 3 | 
             
              module RestParameters
         | 
| 4 | 
            -
             | 
| 5 4 | 
             
                # Defines method 'base_url_value' containing base URL used in REST requests
         | 
| 6 5 | 
             
                # @param [String] url Base Url to use in REST requests. Suburl is appended to this
         | 
| 7 6 | 
             
                def base_url(url)
         | 
| 8 7 | 
             
                  raise ArgumentError, "Base Url passed must be a String for #{self} but was #{url.class}" unless url.is_a?(String)
         | 
| 8 | 
            +
             | 
| 9 9 | 
             
                  define_method('base_url_value') { ERB.new(url).result(binding) }
         | 
| 10 10 | 
             
                end
         | 
| 11 11 |  | 
| @@ -37,6 +37,7 @@ module Soaspec | |
| 37 37 | 
             
                # @return [String] Client id obtained from credentials file
         | 
| 38 38 | 
             
                def client_id
         | 
| 39 39 | 
             
                  raise '@client_id is not set. Set by specifying credentials file with "oauth2_file FILENAME" before this is called' unless @client_id
         | 
| 40 | 
            +
             | 
| 40 41 | 
             
                  @client_id
         | 
| 41 42 | 
             
                end
         | 
| 42 43 |  | 
| @@ -45,6 +46,7 @@ module Soaspec | |
| 45 46 | 
             
                # @param [String] password Password to use
         | 
| 46 47 | 
             
                def basic_auth(user: nil, password: nil)
         | 
| 47 48 | 
             
                  raise ArgumentError, "Must pass both 'user' and 'password' for #{self}" unless user && password
         | 
| 49 | 
            +
             | 
| 48 50 | 
             
                  define_method('basic_auth_params') do
         | 
| 49 51 | 
             
                    { user: user, password: password }
         | 
| 50 52 | 
             
                  end
         | 
| @@ -72,11 +74,13 @@ module Soaspec | |
| 72 74 | 
             
                # @return [Hash] Hash with credentials in it
         | 
| 73 75 | 
             
                def load_credentials_hash(filename)
         | 
| 74 76 | 
             
                  raise ArgumentError, "Filename passed must be a String for #{self} but was #{filename.class}" unless filename.is_a?(String)
         | 
| 77 | 
            +
             | 
| 75 78 | 
             
                  full_path = Soaspec.credentials_folder ? File.join(Soaspec.credentials_folder, filename) : filename
         | 
| 76 79 | 
             
                  full_path += '.yml' unless full_path.end_with?('.yml') # Automatically add 'yml' extension
         | 
| 77 80 | 
             
                  file_hash = YAML.load_file(full_path)
         | 
| 78 81 | 
             
                  raise "File at #{full_path} is not a hash" unless file_hash.is_a? Hash
         | 
| 82 | 
            +
             | 
| 79 83 | 
             
                  file_hash.transform_keys_to_symbols
         | 
| 80 84 | 
             
                end
         | 
| 81 85 | 
             
              end
         | 
| 82 | 
            -
            end
         | 
| 86 | 
            +
            end
         | 
| @@ -1,4 +1,3 @@ | |
| 1 | 
            -
             | 
| 2 1 | 
             
            require_relative 'exchange_handler'
         | 
| 3 2 | 
             
            require_relative '../core_ext/hash'
         | 
| 4 3 | 
             
            require_relative '../not_found_errors'
         | 
| @@ -7,7 +6,6 @@ require_relative '../interpreter' | |
| 7 6 | 
             
            require 'forwardable'
         | 
| 8 7 |  | 
| 9 8 | 
             
            module Soaspec
         | 
| 10 | 
            -
             | 
| 11 9 | 
             
              # Accessors specific to SOAP handler
         | 
| 12 10 | 
             
              module SoapAccessors
         | 
| 13 11 | 
             
                # Define attributes set on root SOAP element
         | 
| @@ -78,10 +76,8 @@ module Soaspec | |
| 78 76 | 
             
                    name = self.class.to_s
         | 
| 79 77 | 
             
                  end
         | 
| 80 78 | 
             
                  super
         | 
| 81 | 
            -
                   | 
| 82 | 
            -
                   | 
| 83 | 
            -
                  set_remove_key(options, :template_name)
         | 
| 84 | 
            -
                  merged_options = Soaspec.log_api_traffic? ? default_options.merge(logging_options) : default_options
         | 
| 79 | 
            +
                  set_remove_keys(options, %i[operation default_hash template_name])
         | 
| 80 | 
            +
                  merged_options = Soaspec::SpecLogger.log_api_traffic? ? default_options.merge(logging_options) : default_options
         | 
| 85 81 | 
             
                  merged_options.merge! savon_options
         | 
| 86 82 | 
             
                  merged_options.merge!(options)
         | 
| 87 83 | 
             
                  self.client = Savon.client(merged_options)
         | 
| @@ -152,7 +148,7 @@ module Soaspec | |
| 152 148 | 
             
                # @param [Nokogiri::XML::Document]
         | 
| 153 149 | 
             
                def convert_to_lower_case(xml_doc)
         | 
| 154 150 | 
             
                  xml_doc.traverse do |node|
         | 
| 155 | 
            -
                    node.name = node.name.downcase if node. | 
| 151 | 
            +
                    node.name = node.name.downcase if node.is_a?(Nokogiri::XML::Element)
         | 
| 156 152 | 
             
                  end
         | 
| 157 153 | 
             
                end
         | 
| 158 154 |  | 
| @@ -162,6 +158,7 @@ module Soaspec | |
| 162 158 | 
             
                # @return [Enumerable] Elements found through Xpath
         | 
| 163 159 | 
             
                def xpath_elements_for(response: nil, xpath: nil, attribute: nil)
         | 
| 164 160 | 
             
                  raise ArgumentError('response and xpath must be passed to method') unless response && xpath
         | 
| 161 | 
            +
             | 
| 165 162 | 
             
                  xpath = "//*[@#{attribute}]" unless attribute.nil?
         | 
| 166 163 | 
             
                  xpath = '//' + xpath if xpath[0] != '/'
         | 
| 167 164 | 
             
                  temp_doc = response.doc.dup
         | 
| @@ -184,6 +181,7 @@ module Soaspec | |
| 184 181 | 
             
                  results = xpath_elements_for(response: response, xpath: path, attribute: attribute)
         | 
| 185 182 | 
             
                  raise NoElementAtPath, "No value at Xpath '#{path}' in XML #{response.doc}" if results.empty?
         | 
| 186 183 | 
             
                  return results.first.inner_text if attribute.nil?
         | 
| 184 | 
            +
             | 
| 187 185 | 
             
                  results.first.attributes[attribute].inner_text
         | 
| 188 186 | 
             
                end
         | 
| 189 187 |  | 
| @@ -206,7 +204,6 @@ module Soaspec | |
| 206 204 |  | 
| 207 205 | 
             
                # Convenience methods for once off usage of a SOAP request
         | 
| 208 206 | 
             
                class << self
         | 
| 209 | 
            -
             | 
| 210 207 | 
             
                  # Implement undefined setter with []= for FactoryBot to use without needing to define params to set
         | 
| 211 208 | 
             
                  # @param [Object] method_name Name of method not defined
         | 
| 212 209 | 
             
                  # @param [Object] args Arguments passed to method
         | 
| @@ -231,6 +228,5 @@ module Soaspec | |
| 231 228 | 
             
                    operations.include?(method_name) || super
         | 
| 232 229 | 
             
                  end
         | 
| 233 230 | 
             
                end
         | 
| 234 | 
            -
             | 
| 235 231 | 
             
              end
         | 
| 236 | 
            -
            end
         | 
| 232 | 
            +
            end
         | 
| @@ -1,7 +1,6 @@ | |
| 1 1 | 
             
            # Convenience methods to set Exchange specific properties
         | 
| 2 2 | 
             
            # Will be used when creating a subclass of Exchange
         | 
| 3 3 | 
             
            module ExchangeProperties
         | 
| 4 | 
            -
             | 
| 5 4 | 
             
              # Set default exchange handler for this exchange
         | 
| 6 5 | 
             
              # This is helpful for when you need a new exchange handler created for each exchange
         | 
| 7 6 | 
             
              # @param [Class] handler_class Class of ExchangeHandler to set Exchange to use
         | 
| @@ -25,4 +24,4 @@ module ExchangeProperties | |
| 25 24 | 
             
                  true
         | 
| 26 25 | 
             
                end
         | 
| 27 26 | 
             
              end
         | 
| 28 | 
            -
            end
         | 
| 27 | 
            +
            end
         | 
    
        data/lib/soaspec/exe_helpers.rb
    CHANGED
    
    | @@ -1,9 +1,7 @@ | |
| 1 | 
            -
             | 
| 2 1 | 
             
            require 'fileutils'
         | 
| 3 2 | 
             
            module Soaspec
         | 
| 4 3 | 
             
              # Help with tasks common to soaspec executables
         | 
| 5 4 | 
             
              module ExeHelpers
         | 
| 6 | 
            -
             | 
| 7 5 | 
             
                # Create files in project depending on type of project
         | 
| 8 6 | 
             
                # @param [String] type Type of project to create, e.g., 'soap', 'rest'
         | 
| 9 7 | 
             
                def create_files_for(type)
         | 
| @@ -19,9 +17,10 @@ module Soaspec | |
| 19 17 | 
             
                end
         | 
| 20 18 |  | 
| 21 19 | 
             
                # @param [Array] filenames List of files to create
         | 
| 22 | 
            -
                def create_files(filenames)
         | 
| 20 | 
            +
                def create_files(filenames, ignore_if_present: false)
         | 
| 23 21 | 
             
                  raise ArgumentError, 'Expected filenames to be an Array' unless filenames.is_a? Array
         | 
| 24 | 
            -
             | 
| 22 | 
            +
             | 
| 23 | 
            +
                  filenames.each { |name| create_file filename: name, ignore_if_present: ignore_if_present }
         | 
| 25 24 | 
             
                end
         | 
| 26 25 |  | 
| 27 26 | 
             
                # Spec task string depending upon whether virtual is used
         | 
| @@ -45,15 +44,15 @@ module Soaspec | |
| 45 44 |  | 
| 46 45 | 
             
                # @param [String] filename Name of the file to create
         | 
| 47 46 | 
             
                # @param [String] content Content to place inside file
         | 
| 47 | 
            +
                # @param [Boolean] ignore_if_present Don't complain if file is present
         | 
| 48 48 | 
             
                def create_file(filename: nil, content: nil, ignore_if_present: false, erb: true)
         | 
| 49 49 | 
             
                  raise 'Need to pass filename' unless filename
         | 
| 50 | 
            +
             | 
| 50 51 | 
             
                  content ||= retrieve_contents(filename, erb)
         | 
| 51 52 | 
             
                  create_folder File.split(filename).first
         | 
| 52 53 | 
             
                  if File.exist? filename
         | 
| 53 54 | 
             
                    old_content = File.read(filename)
         | 
| 54 | 
            -
                    if old_content != content && !ignore_if_present
         | 
| 55 | 
            -
                      warn "!! #{filename} already exists and differs from template"
         | 
| 56 | 
            -
                    end
         | 
| 55 | 
            +
                    warn "!! #{filename} already exists and differs from template" if old_content != content && !ignore_if_present
         | 
| 57 56 | 
             
                  else
         | 
| 58 57 | 
             
                    File.open(filename, 'w') { |f| f.puts content }
         | 
| 59 58 | 
             
                    puts 'Created: ' + filename
         | 
| @@ -82,6 +81,5 @@ module Soaspec | |
| 82 81 | 
             
                def generated_soap_spec_for(operation)
         | 
| 83 82 | 
             
                  ERB.new(File.read(File.join(File.dirname(__FILE__), 'generator', 'spec/dynamic_soap_spec.rb.erb'))).result(binding)
         | 
| 84 83 | 
             
                end
         | 
| 85 | 
            -
             | 
| 86 84 | 
             
              end
         | 
| 87 | 
            -
            end
         | 
| 85 | 
            +
            end
         | 
    
        data/lib/soaspec/interpreter.rb
    CHANGED
    
    | @@ -1,7 +1,5 @@ | |
| 1 | 
            -
             | 
| 2 1 | 
             
            # Help interpret the general type of a particular object
         | 
| 3 2 | 
             
            class Interpreter
         | 
| 4 | 
            -
             | 
| 5 3 | 
             
              class << self
         | 
| 6 4 | 
             
                # @param [Object] response API response
         | 
| 7 5 | 
             
                # @return [Symbol] Type of provided response
         | 
| @@ -38,4 +36,4 @@ class Interpreter | |
| 38 36 | 
             
                  false
         | 
| 39 37 | 
             
                end
         | 
| 40 38 | 
             
              end
         | 
| 41 | 
            -
            end
         | 
| 39 | 
            +
            end
         | 
    
        data/lib/soaspec/matchers.rb
    CHANGED
    
    | @@ -1,4 +1,3 @@ | |
| 1 | 
            -
             | 
| 2 1 | 
             
            require_relative 'core_ext/hash'
         | 
| 3 2 | 
             
            require_relative 'not_found_errors'
         | 
| 4 3 |  | 
| @@ -61,7 +60,6 @@ end | |
| 61 60 | 
             
            RSpec::Matchers.alias_matcher :have_jsonpath_value, :have_xpath_value
         | 
| 62 61 |  | 
| 63 62 | 
             
            RSpec::Matchers.define :be_found do
         | 
| 64 | 
            -
             | 
| 65 63 | 
             
              match do |exchange|
         | 
| 66 64 | 
             
                expect(exchange.exchange_handler.found?(exchange.response)).to be true
         | 
| 67 65 | 
             
              end
         | 
| @@ -91,6 +89,7 @@ RSpec::Matchers.define :be_successful do | |
| 91 89 | 
             
                  failure_list << "Expected value at json '#{path}' to be '#{value}' but was '#{exchange[path]}'" unless exchange[path] == value
         | 
| 92 90 | 
             
                end
         | 
| 93 91 | 
             
                raise failure_list.to_s unless failure_list.empty?
         | 
| 92 | 
            +
             | 
| 94 93 | 
             
                true
         | 
| 95 94 | 
             
              end
         | 
| 96 95 | 
             
            end
         | 
    
        data/lib/soaspec/o_auth2.rb
    CHANGED
    
    | @@ -38,6 +38,7 @@ module Soaspec | |
| 38 38 | 
             
                  params[:token_url] ||= Soaspec::OAuth2.token_url
         | 
| 39 39 | 
             
                  raise ArgumentError, 'client_id and client_secret not set' unless params[:client_id] && params[:client_secret]
         | 
| 40 40 | 
             
                  raise ArgumentError, 'token_url mandatory' unless params[:token_url]
         | 
| 41 | 
            +
             | 
| 41 42 | 
             
                  self.params = params
         | 
| 42 43 | 
             
                  params[:username] = api_username || ERB.new(params[:username]).result(binding) if params[:username]
         | 
| 43 44 | 
             
                  params[:security_token] = ERB.new(params[:security_token]).result(binding) if params[:security_token]
         | 
| @@ -99,4 +100,4 @@ module Soaspec | |
| 99 100 | 
             
                                end)
         | 
| 100 101 | 
             
                end
         | 
| 101 102 | 
             
              end
         | 
| 102 | 
            -
            end
         | 
| 103 | 
            +
            end
         |