Sha256: 1765edc861c09aadc2ac6234e71e76b0f46b5962a94dc0595553806e877cf8c2

Contents?: true

Size: 1.09 KB

Versions: 8

Compression:

Stored size: 1.09 KB

Contents

require "swagger/base"

module Swagger
  module RackHelpers
    def request_spec(env: nil)
      path = env['REQUEST_PATH']
      verb = env['REQUEST_METHOD'].downcase
      matching_paths = (@spec['paths'] || {}).map { |spec_path, spec|
        next unless spec[verb]
        matches = match_string(spec_path, path)
        next if matches.nil?
        {
          path: spec_path,
          captures: matches,
          spec: spec[verb]
        }
      }.compact

      case matching_paths.size
      when 0
        return nil
      when 1
        return matching_paths.first
      else
        spec_paths = matching_paths.map { |p| p[:path] }
        raise "Your API documentation is non-deterministic for the path: #{path} (#{spec_paths.join(', ')})"
      end
    end

    private

    def match_string(bracketed_string, match_string)
      re = bracketed_string.gsub(/\{([^}]+)\}/, "(?<\\1>.+?)")
      matches = Regexp.new("^#{re}$").match(match_string)
      return nil if matches.nil?
      captures = matches.captures
      Hash[matches.names.zip(captures)]
    end
  end

  Base.include(RackHelpers)
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
sinatra-swagger-0.4.1 lib/swagger/rack.rb
sinatra-swagger-0.4.0 lib/swagger/rack.rb
sinatra-swagger-0.3.1 lib/swagger/rack.rb
sinatra-swagger-0.2.2 lib/swagger/rack.rb
sinatra-swagger-0.2.1 lib/swagger/rack.rb
sinatra-swagger-0.2.0 lib/swagger/rack.rb
sinatra-swagger-0.1.1 lib/swagger/rack.rb
sinatra-swagger-0.0.0 lib/swagger/rack.rb