読者です 読者をやめる 読者になる 読者になる

PerlerのRuby日記

Rubyとか

Sinatraでrake routesその2

いま流行りっぽいYARDのSinatra用gem yard-sinatra | RubyGems.org | your community gem host を使うと

簡単にルーティングを出力できるみたい。

↓の"Other use cases"を見た。

rkh/yard-sinatra ? GitHub

Gemfile
source 'http://rubygems.org'

gem 'rake'
gem 'sinatra'

group :development do
  gem 'yard'
  gem 'yard-sinatra'
end
Rakefile
task "routes" do
  require "yard/sinatra"
  YARD::Registry.load ["./app.rb"], true
  YARD::Sinatra.routes.each do |route|
    puts route.http_verb, route.http_path, route.file, route.docstring
  end
end

YARD::Registry.loadは1回読み込むとキャッシュが使われて2回め以降動かなくなるので

trueをつけて毎回parseするようにした。

app.rb

サンプルシナトラ

require "sinatra"

get "/" do
  "foooooooooo!"
end

get "/bar" do
  "baaaaaaaaaaaar!"
end

post "/bar" do
  "POST baaaaaaaaaaaar!"
end

put "/bar" do
  "PUT baaaaaaaaaaaar!"
end

get "/baz/:id" do
  "baz: #{params[:id]}"
end
rake routes
$ bundle exec rake routes
GET
/
app.rb

GET
/bar
app.rb

POST
/bar
app.rb

PUT
/bar
app.rb

GET
/baz/:id
app.rb

もっとRailsっぽく

Rakefileをこうしてみる。

task "routes" do
  require "yard/sinatra"
  YARD::Registry.load ["./app.rb"], true
  routes = []
  YARD::Sinatra.routes.each do |route|
    routes << [route.http_verb, route.http_path, route.file]
  end
  max_verb_len = routes.map{|r|r[0].length}.max
  max_path_len = routes.map{|r|r[1].length}.max
  routes.each do |r|
    puts "%-#{max_verb_len}s %-#{max_path_len}s %s" % r
  end
end
$ bundle exec rake routes
GET  /        app.rb
GET  /bar     app.rb
POST /bar     app.rb
PUT  /bar     app.rb
GET  /baz/:id app.rb

いいね!