Analyzer::Ruby::RubyEngine
Inherits Analyzer < FileHelper < Reference < Object
Constants
Rails, Hanami and Sinatra all spell a route get "/books" …, and every
Ruby analyzer is handed every .rb file in the scan, so each one could
parse the others' route table with its own DSL. These two predicates
identify a file as unmistakably belonging to Rails or to Hanami; an
analyzer that is neither uses them to step aside.
Rails.application.routes.draw and Hanami::Routes are positive
markers — a router that carries one is that framework's and nobody
else's. There is deliberately no Sinatra equivalent: a Sinatra route
file can be a bare get "/x" do … end with no framework reference at
all, which is why the checks run in this direction only.
Whole-tree Ruby analyzers (Sinatra/Grape/Roda/WEBrick) otherwise see
Rack test helpers, benchmark apps, and framework examples as live
services. Match these directories only relative to the configured scan
root so noir's own fixture tree under spec/functional_test/fixtures
is not accidentally skipped when the fixture directory itself is the
base path.
Exact translation of the three-way check this replaces:
relative == dir and relative.starts_with?("#{dir}/") collapse to
the leading branch, relative.includes?("/#{dir}/") to the second.
Deliberately NOT (?:\A|\/)dir(?:\/|\z), which would also match a
trailing segment (app/spec) the old chain rejected.
The chain built two interpolated Strings per directory per call — 18 allocations on every Ruby file, for every whole-tree Ruby analyzer — before scanning for each of them separately.
Walk Ruby sources (.rb / .ru) in parallel. Used by analyzers
that scan the whole tree (Sinatra, Grape, Roda, WEBrick);
Rails/Hanami target specific config files directly. Candidates
come from the extension index so monorepo file_map entries in
other languages never enter the channel. Paths are detector-
registered regular files — no per-path File.exists? /
File.directory?.
Name-consistent with the other engines' parallel_file_scan helpers.
Crystal recompiles an interpolated regex literal on every evaluation
(a full PCRE2 JIT compile). The verb set is fixed, so precompile the
<verb> "<path>" matchers once at load time.
Class methods
Minitest's *_test.rb and RSpec's *_spec.rb conventions are
rigid in Ruby — rake test / mri test only run files matching
the first, and rspec discovers the second. Production Ruby
never adopts either filename, so the suffix check is safe for
every Ruby analyzer (sinatra, grape, roda, hanami). Promoted
from Analyzer::Ruby::Sinatra (#1571) so the rest of the
family stays in sync.
Test::Unit / Minitest equally support the inverse test_*.rb
prefix (rake test globs test/test_*.rb). gollum, for
instance, exercises its modular Sinatra app exclusively through
test/test_app.rb-style files whose inline Rack::Test requests
(get "/wiki/Home", post "/gollum/upload_file") are
indistinguishable from real route registrations to a line-based
matcher — ~70 phantom endpoints per scan. Production route files
never carry the test_ prefix, so it is as safe as the suffix
forms. We match on the basename only (never the full path) so a
legitimate app that merely lives under a spec/-suffixed
absolute path — e.g. noir's own fixtures — is untouched.