Sha256: 7165e43c560baf62cb0d691498d0abc9a0ffdca7dbbba7e76640a30493f89d50

Contents?: true

Size: 1.96 KB

Versions: 5

Compression:

Stored size: 1.96 KB

Contents

# frozen_string_literal: true

module OpenApi
  module Router
    module_function

    def routes
      @routes ||=
          if (file = Config.rails_routes_file)
            File.read(file)
          else
            # :nocov:
            # ref https://github.com/rails/rails/blob/master/railties/lib/rails/tasks/routes.rake
            require './config/routes'
            all_routes = Rails.application.routes.routes
            require 'action_dispatch/routing/inspector'
            inspector = ActionDispatch::Routing::RoutesInspector.new(all_routes)
            if Rails::VERSION::MAJOR < 6
              inspector.format(ActionDispatch::Routing::ConsoleFormatter.new, nil)
            else
              inspector.format(ActionDispatch::Routing::ConsoleFormatter::Sheet.new)
            end
            # :nocov:
          end
    end

    def routes_list
      @routes_list ||= routes.split("\n").drop(1).map do |line|
        next unless line['#']
        infos = line.match(/[A-Z|].*/).to_s.split(' ') # => [GET, /api/v1/examples/:id, api/v1/examples#index]

        {
            http_verb: infos[0].downcase, # => "get" / "get|post"
            path: infos[1][0..-11].split('/').map do |item|
                    item[':'] ? "{#{item[1..-1]}}" : item
                  end.join('/'),          # => "/api/v1/examples/{id}"
            action_path: infos[2]         # => "api/v1/examples#index"
        } rescue next
      end.compact.group_by { |api| api[:action_path].split('#').first } # => { "api/v1/examples" => [..] }, group by paths
    end

    def get_actions_by_route_base(route_base)
      routes_list[route_base]&.map { |action_info| action_info[:action_path].split('#').last }
    end

    def find_path_httpverb_by(route_base, action)
      routes_list[route_base]&.map do |action_info|
        if action_info[:action_path].split('#').last == action.to_s
          return [ action_info[:path], action_info[:http_verb].split('|').first ]
        end
      end ; nil
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
zero-rails_openapi-2.2.0 lib/open_api/router.rb
zero-rails_openapi-2.1.5 lib/open_api/router.rb
zero-rails_openapi-2.1.4 lib/open_api/router.rb
zero-rails_openapi-2.1.3 lib/open_api/router.rb
zero-rails_openapi-2.1.2 lib/open_api/router.rb