Analyzer::Ruby::Padrino
Inherits Analyzer::Ruby::RubyEngine < Analyzer < FileHelper < Reference < Object
Padrino layers two things on top of Sinatra's route table:
- Named, block-scoped routes declared through the controller DSL —
AppName.controllers :posts do get :index, map: '/blog' do ... end end— where the effective URL is derived from the controller name, the route name, and the optionalmap:/with:/parent:options rather than a literal path string. - Base-path mounting of each sub-app from
config/apps.rb—Padrino.mount('blog', app_class: 'BlogApp').to('/blog')— which every route inside that sub-app inherits as a prefix.
ruby_padrino supersedes ruby_sinatra (see the catalog entry), so this
analyzer also re-implements Sinatra's own literal-path route matching
(get "/path" do, namespace "/x" do) via the shared RubyEngine
helpers — when both techs are detected, the Sinatra analyzer does not
run at all, and nothing may be lost by dropping it.
Constants
class BlogApp < Padrino::Application — opens an (empty-prefix)
controller scope so a bare get :index do written directly in the
app class body (no enclosing controllers block) still resolves.
<Receiver>.controllers :name do / controllers :name do (no
receiver, called inside the app class body) / controllers "/admin" do (explicit string prefix) / bare controller do (grouping only,
no prefix). Group 1 is the argument list between the keyword and the
block opener.
map:/:map =>, with:/:with =>, parent:/:parent => — Padrino
apps span enough Ruby-version history that both hash syntaxes show up
in real projects.
Padrino.mount('blog', app_class: 'BlogApp').to('/blog') — matched
per-line (mount declarations are always a single statement in every
real-world config/apps.rb), so a [^)]* options capture never has
to worry about matching past the end of the file.
Same block-nesting delta as the Sinatra analyzer (see its
SINATRA_DEPTH_TOKEN_RE for the detailed rationale) — duplicated
rather than shared so this analyzer stays self-contained.
Same params surface as Sinatra: params[...]/params.fetch(...) as
query params, request.env[...]/headers[...] as headers,
cookies[...] as cookies. splat/captures are Sinatra's own
pattern bindings, not user-supplied fields.
Precompile the <verb> :name matchers once — same reasoning as
RubyEngine::VERB_ROUTE_PATTERNS (interpolated regex literals are
recompiled on every evaluation otherwise). Group 1 is the route name,
group 2 is everything after it on the line (options + block opener).
Class methods
Instance methods
Instance-side view of the same declaration. The per-file rescues live on
this base class, which has no way to name the analyzer that is running
inside them, so a skipped file could not be attributed to a tech.
Deriving it from analyzer_for keeps the name written exactly once.