CubicLouve

Spring_MTの技術ブログ

sinatraで設定したパス一覧を取得する

メモ

こんな感じでスクリプトを書いた。

require 'rack'
require 'sinatra'

class Sinatra::Base
  private
  class << self
    attr_reader :original_routes
    # なぜかsuperが呼べない...
    def route(verb, path, options = {}, &block)
      @original_routes ||= {}
      (@original_routes[verb] ||= []) << path
      host_name(options.delete(:host)) if options.key?(:host)
      enable :empty_path_info if path == "" and empty_path_info.nil?
      signature = compile!(verb, path, block, options)
      (@routes[verb] ||= []) << signature
      invoke_hook(:route_added, verb, path, block)
      signature
    end
  end
end

def run(*args)
  args.first.instance_variable_get(:@mapping).each do |mapping|
    # 二番目の要素がmappingのbase path
    base_path = mapping[1]
    # 三番目の要素がcontroller class
    mapping[3].original_routes.each do |method, paths|
      paths.each { |path| puts "#{method}\t#{base_path}#{path}" }
    end
  end
end

Sinatra::Base.set :running_server, true
load './config.ru'