rswag-specs 2.5.1 → 2.6.0
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
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 335cddedc6446301252f26bb28a0874072ebecfb5c8b35e5a2d94559a6606fcc
         | 
| 4 | 
            +
              data.tar.gz: 3a2e60364a2a6e6ee463163eee2caa628ecf28c3ba9975ea239aa1106d4cd179
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 436935923dcf3a446290c2bdf0160b399c5ba270096dc4019b1f47e2308f4e9ca66af8684fa09c6fc63f5b18069cf49b24ae124f19756480f5cff998873c26b5
         | 
| 7 | 
            +
              data.tar.gz: 0c123c3e98481381a606a68c59b9cc5f0b8626a70f81c76c3d825bc3a6a46874e9524155da085baaf66abb2872c23f76a0f0931b390d669feeaccf1ba4da875d
         | 
| @@ -69,13 +69,34 @@ module Rswag | |
| 69 69 | 
             
                  # NOTE: Similar to 'description', 'examples' need to handle the case when
         | 
| 70 70 | 
             
                  # being invoked with no params to avoid overriding 'examples' method of
         | 
| 71 71 | 
             
                  # rspec-core ExampleGroup
         | 
| 72 | 
            -
                  def examples( | 
| 73 | 
            -
                    return super() if  | 
| 72 | 
            +
                  def examples(examples = nil)
         | 
| 73 | 
            +
                    return super() if examples.nil?
         | 
| 74 | 
            +
                    # should we add a deprecation warning?
         | 
| 75 | 
            +
                    examples.each_with_index do |(mime, example_object), index|
         | 
| 76 | 
            +
                      example(mime, "example_#{index}", example_object)
         | 
| 77 | 
            +
                    end
         | 
| 78 | 
            +
                  end
         | 
| 74 79 |  | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
                       | 
| 80 | 
            +
                  def example(mime, name, value, summary=nil, description=nil)
         | 
| 81 | 
            +
                    # Todo - move initialization of metadata somewhere else.
         | 
| 82 | 
            +
                    if metadata[:response][:content].blank?
         | 
| 83 | 
            +
                      metadata[:response][:content] = {}
         | 
| 84 | 
            +
                    end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                    if metadata[:response][:content][mime].blank?
         | 
| 87 | 
            +
                      metadata[:response][:content][mime] = {}
         | 
| 88 | 
            +
                      metadata[:response][:content][mime][:examples] = {}
         | 
| 89 | 
            +
                    end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                    example_object = {
         | 
| 92 | 
            +
                      value: value,
         | 
| 93 | 
            +
                      summary: summary,
         | 
| 94 | 
            +
                      description: description
         | 
| 95 | 
            +
                    }.select { |_, v| v.present? }
         | 
| 96 | 
            +
                    # TODO, issue a warning if example is being overridden with the same key
         | 
| 97 | 
            +
                    metadata[:response][:content][mime][:examples].merge!(
         | 
| 98 | 
            +
                      { name.to_sym => example_object }
         | 
| 99 | 
            +
                    )
         | 
| 79 100 | 
             
                  end
         | 
| 80 101 |  | 
| 81 102 | 
             
                  def run_test!(&block)
         | 
| @@ -85,7 +106,7 @@ module Rswag | |
| 85 106 | 
             
                        submit_request(example.metadata)
         | 
| 86 107 | 
             
                      end
         | 
| 87 108 |  | 
| 88 | 
            -
                      it "returns a #{metadata[:response][:code]} response" do
         | 
| 109 | 
            +
                      it "returns a #{metadata[:response][:code]} response", rswag: true do
         | 
| 89 110 | 
             
                        assert_response_matches_metadata(metadata)
         | 
| 90 111 | 
             
                        block.call(response) if block_given?
         | 
| 91 112 | 
             
                      end
         | 
| @@ -94,7 +115,7 @@ module Rswag | |
| 94 115 | 
             
                        submit_request(example.metadata)
         | 
| 95 116 | 
             
                      end
         | 
| 96 117 |  | 
| 97 | 
            -
                      it "returns a #{metadata[:response][:code]} response" do |example|
         | 
| 118 | 
            +
                      it "returns a #{metadata[:response][:code]} response", rswag: true do |example|
         | 
| 98 119 | 
             
                        assert_response_matches_metadata(example.metadata, &block)
         | 
| 99 120 | 
             
                        example.instance_exec(response, &block) if block_given?
         | 
| 100 121 | 
             
                      end
         | 
| @@ -7,14 +7,11 @@ module Rswag | |
| 7 7 | 
             
                class ExtendedSchema < JSON::Schema::Draft4
         | 
| 8 8 | 
             
                  def initialize
         | 
| 9 9 | 
             
                    super
         | 
| 10 | 
            -
                    @attributes['type'] = ExtendedTypeAttribute
         | 
| 11 10 | 
             
                    @uri = URI.parse('http://tempuri.org/rswag/specs/extended_schema')
         | 
| 12 11 | 
             
                    @names = ['http://tempuri.org/rswag/specs/extended_schema']
         | 
| 13 12 | 
             
                  end
         | 
| 14 | 
            -
                end
         | 
| 15 13 |  | 
| 16 | 
            -
             | 
| 17 | 
            -
                  def self.validate(current_schema, data, fragments, processor, validator, options = {})
         | 
| 14 | 
            +
                  def validate(current_schema, data, *)
         | 
| 18 15 | 
             
                    return if data.nil? && (current_schema.schema['nullable'] == true || current_schema.schema['x-nullable'] == true)
         | 
| 19 16 |  | 
| 20 17 | 
             
                    super
         | 
| @@ -106,18 +106,57 @@ module Rswag | |
| 106 106 |  | 
| 107 107 | 
             
                    request[:path] = template.tap do |path_template|
         | 
| 108 108 | 
             
                      parameters.select { |p| p[:in] == :path }.each do |p|
         | 
| 109 | 
            +
                        unless example.respond_to?(p[:name])
         | 
| 110 | 
            +
                          raise ArgumentError.new("`#{p[:name].to_s}` parameter key present, but not defined within example group"\
         | 
| 111 | 
            +
                            "(i. e `it` or `let` block)")
         | 
| 112 | 
            +
                        end
         | 
| 109 113 | 
             
                        path_template.gsub!("{#{p[:name]}}", example.send(p[:name]).to_s)
         | 
| 110 114 | 
             
                      end
         | 
| 111 115 |  | 
| 112 116 | 
             
                      parameters.select { |p| p[:in] == :query }.each_with_index do |p, i|
         | 
| 113 117 | 
             
                        path_template.concat(i.zero? ? '?' : '&')
         | 
| 114 | 
            -
                        path_template.concat(build_query_string_part(p, example.send(p[:name])))
         | 
| 118 | 
            +
                        path_template.concat(build_query_string_part(p, example.send(p[:name]), swagger_doc))
         | 
| 115 119 | 
             
                      end
         | 
| 116 120 | 
             
                    end
         | 
| 117 121 | 
             
                  end
         | 
| 118 122 |  | 
| 119 | 
            -
                  def build_query_string_part(param, value)
         | 
| 123 | 
            +
                  def build_query_string_part(param, value, swagger_doc)
         | 
| 120 124 | 
             
                    name = param[:name]
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                    # OAS 3: https://swagger.io/docs/specification/serialization/
         | 
| 127 | 
            +
                    if swagger_doc && doc_version(swagger_doc).start_with?('3') && param[:schema]
         | 
| 128 | 
            +
                      style = param[:style]&.to_sym || :form
         | 
| 129 | 
            +
                      explode = param[:explode].nil? ? true : param[:explode]
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                      case param[:schema][:type].to_sym
         | 
| 132 | 
            +
                      when :object
         | 
| 133 | 
            +
                        case style
         | 
| 134 | 
            +
                        when :deepObject
         | 
| 135 | 
            +
                          return { name => value }.to_query
         | 
| 136 | 
            +
                        when :form
         | 
| 137 | 
            +
                          if explode
         | 
| 138 | 
            +
                            return value.to_query
         | 
| 139 | 
            +
                          else
         | 
| 140 | 
            +
                            return "#{CGI.escape(name.to_s)}=" + value.to_a.flatten.map{|v| CGI.escape(v.to_s) }.join(',')
         | 
| 141 | 
            +
                          end
         | 
| 142 | 
            +
                        end
         | 
| 143 | 
            +
                      when :array
         | 
| 144 | 
            +
                        case explode
         | 
| 145 | 
            +
                        when true
         | 
| 146 | 
            +
                          return value.to_a.flatten.map{|v| "#{CGI.escape(name.to_s)}=#{CGI.escape(v.to_s)}"}.join('&')
         | 
| 147 | 
            +
                        else
         | 
| 148 | 
            +
                          separator = case style
         | 
| 149 | 
            +
                                      when :form then ','
         | 
| 150 | 
            +
                                      when :spaceDelimited then '%20'
         | 
| 151 | 
            +
                                      when :pipeDelimited then '|'
         | 
| 152 | 
            +
                                      end
         | 
| 153 | 
            +
                          return "#{CGI.escape(name.to_s)}=" + value.to_a.flatten.map{|v| CGI.escape(v.to_s) }.join(separator) 
         | 
| 154 | 
            +
                        end
         | 
| 155 | 
            +
                      else
         | 
| 156 | 
            +
                        return "#{name}=#{value}"
         | 
| 157 | 
            +
                      end
         | 
| 158 | 
            +
                    end
         | 
| 159 | 
            +
             | 
| 121 160 | 
             
                    type = param[:type] || param.dig(:schema, :type)
         | 
| 122 161 | 
             
                    return "#{name}=#{value}" unless type&.to_sym == :array
         | 
| 123 162 |  | 
| @@ -154,8 +193,8 @@ module Rswag | |
| 154 193 | 
             
                      tuples << ['Content-Type', content_type]
         | 
| 155 194 | 
             
                    end
         | 
| 156 195 |  | 
| 157 | 
            -
                    # Rails test infrastructure requires  | 
| 158 | 
            -
                     | 
| 196 | 
            +
                    # Rails test infrastructure requires rack-formatted headers
         | 
| 197 | 
            +
                    rack_formatted_tuples = tuples.map do |pair|
         | 
| 159 198 | 
             
                      [
         | 
| 160 199 | 
             
                        case pair[0]
         | 
| 161 200 | 
             
                        when 'Accept' then 'HTTP_ACCEPT'
         | 
| @@ -167,7 +206,7 @@ module Rswag | |
| 167 206 | 
             
                      ]
         | 
| 168 207 | 
             
                    end
         | 
| 169 208 |  | 
| 170 | 
            -
                    request[:headers] = Hash[ | 
| 209 | 
            +
                    request[:headers] = Hash[rack_formatted_tuples]
         | 
| 171 210 | 
             
                  end
         | 
| 172 211 |  | 
| 173 212 | 
             
                  def add_payload(request, parameters, example)
         | 
| @@ -53,7 +53,7 @@ module Rswag | |
| 53 53 | 
             
                    return unless errors.any?
         | 
| 54 54 |  | 
| 55 55 | 
             
                    raise UnexpectedResponse,
         | 
| 56 | 
            -
                          "Expected response body to match schema: #{errors | 
| 56 | 
            +
                          "Expected response body to match schema: #{errors.join("\n")}\n" \
         | 
| 57 57 | 
             
                          "Response body: #{JSON.pretty_generate(JSON.parse(body))}"
         | 
| 58 58 | 
             
                  end
         | 
| 59 59 |  | 
| @@ -60,6 +60,7 @@ module Rswag | |
| 60 60 | 
             
                              if value && schema_param && mime_list
         | 
| 61 61 | 
             
                                value[:requestBody] = { content: {} } unless value.dig(:requestBody, :content)
         | 
| 62 62 | 
             
                                value[:requestBody][:required] = true if schema_param[:required]
         | 
| 63 | 
            +
                                value[:requestBody][:description] = schema_param[:description] if schema_param[:description]
         | 
| 63 64 | 
             
                                mime_list.each do |mime|
         | 
| 64 65 | 
             
                                  value[:requestBody][:content][mime] = { schema: schema_param[:schema] }
         | 
| 65 66 | 
             
                                end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rswag-specs
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2. | 
| 4 | 
            +
              version: 2.6.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Richie Morris
         | 
| @@ -10,7 +10,7 @@ authors: | |
| 10 10 | 
             
            autorequire: 
         | 
| 11 11 | 
             
            bindir: bin
         | 
| 12 12 | 
             
            cert_chain: []
         | 
| 13 | 
            -
            date: 2022- | 
| 13 | 
            +
            date: 2022-09-09 00:00:00.000000000 Z
         | 
| 14 14 | 
             
            dependencies:
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 16 16 | 
             
              name: activesupport
         | 
| @@ -67,8 +67,8 @@ dependencies: | |
| 67 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 68 68 | 
             
                    version: '2.2'
         | 
| 69 69 | 
             
            description: 'Simplify API integration testing with a succinct rspec DSL and generate
         | 
| 70 | 
            -
              OpenAPI specification files directly from your  | 
| 71 | 
            -
              here: http://spec.openapis.org/'
         | 
| 70 | 
            +
              OpenAPI specification files directly from your rspec tests. More about the OpenAPI
         | 
| 71 | 
            +
              initiative here: http://spec.openapis.org/'
         | 
| 72 72 | 
             
            email:
         | 
| 73 73 | 
             
            - domaindrivendev@gmail.com
         | 
| 74 74 | 
             
            executables: []
         |