class
Analyzer::Perl::Mojolicious
Defined in:
analyzer/analyzers/perl/mojolicious.crConstant Summary
-
ANGLE_PLACEHOLDER_RE =
/<([:#*]?)([A-Za-z_]\w*)(?::[^<>]*)?>/ -
Mojolicious angle-bracket placeholders:
<id>,<:id>,<#id>,<*id>, and the type-constrained<id:num>/<id:[^/]+>. Normalize them to the sigil form (:id,#id,*id) so URLs read consistently and the path-param scanner picks them up. -
ASSIGNMENT_HEAD_RE =
/^\s*(?:my|our|local)?\s*\$([A-Za-z_]\w*)\s*=\s*(.+)$/ -
CHAIN_RECEIVER_RE =
/\$([A-Za-z_]\w*)\s*->/ -
CHAIN_ROUTE_CALL_RE =
/->\s*(?:under|any|route)\s*\(/ -
A receiver chain that is already building a route:
$r->under('/v2')->get(…). -
CONVENTIONAL_ROUTE_VARS =
Set {"r", "route", "routes", "router"} -
Mojolicious names its route object
$r(or$routes/$route/$router) by universal convention, including in helper subs that receive it as an argument (sub _api ($r) { $r->get('/x') }) where no assignment exists forbuild_prefix_mapsto record. Accepted on top of the assignments it does see. -
FULL_ANY_RE =
/->\s*any\s*\(\s*(?:\[([^\]]+)\]\s*,?\s*=?>?\s*)?['"]([^'"]*)['"]/ -
FULL_ROUTE_RE =
/->\s*route\s*\(\s*['"]([^'"]*)['"]\s*\)(?:\s*->\s*via\s*\(\s*([^)]+)\))?/ -
FULL_VERB_RE =
/->\s*(get|post|put|patch|delete|del|options|head|websocket)\s*\(\s*['"]([^'"]*)['"]/ -
Leaf path may be empty (
$r->get('')) — a Mojolicious idiom for a route that is its receiver's prefix (e.g.$auth->get('')), so the capture is[^'"]*rather than+.A quoted argument does NOT make the call a route:
$cache->get("ttl")and$self->stash->get("current_user")are ordinary data accessors and are the common shape, not an exotic one. Every->verb(...)match is therefore additionally gated onroute_receiver?. -
HTTP_VERBS =
["get", "post", "put", "delete", "patch", "options", "head"] of ::String -
LITE_ANY_RE =
/^\s*any\s+(?:\[([^\]]+)\]\s*=>\s*)?['"]([^'"]+)['"]/ -
LITE_VERB_RE =
/^\s*(get|post|put|patch|delete|del|options|head|websocket)\s+['"]([^'"]+)['"]/ -
MOJO_MARKERS =
["Mojolicious", "Mojo::Base"] -
The file has to be Mojolicious before any of its
->get(…)calls can be a Mojolicious route.Mojoliciouscoversuse Mojolicious,Mojolicious::Lite,Mojo::Base 'Mojolicious…', and the Plugin/Controller base classes;Mojo::Basecovers a controller that subclasses another one of the app's controllers. -
NAMED_TO_ARG_PATTERNS =
{"controller" => /(?:^|[,\s])controller\s*=>\s*['"]([A-Za-z_][A-Za-z0-9_:\/-]*)['"]/, "action" => /(?:^|[,\s])action\s*=>\s*['"]([A-Za-z_][A-Za-z0-9_:\/-]*)['"]/} -
Crystal recompiles an interpolated regex literal on every evaluation (a full PCRE2 JIT compile). Only
controllerandactionare looked up, so precompile their matchers once at load time. -
PATH_VAR_RE =
/^\s*(?:my|our|local)?\s*\$([A-Za-z_]\w*)\s*=\s*(['"])(\/[^'"]*)\2\s*;?\s*$/ -
PREFIX_SEGMENT_RE =
/->\s*(?:under|any|route)\s*\(\s*(?:\[[^\]]+\]\s*,?\s*=?>?\s*)?(?:(['"])([^'"]*)\1|\$([A-Za-z_]\w*))/ -
A prefix-building segment (
->under/->any/->route) whose argument is either a quoted literal or a$varresolved againstpath_vars(a scalar holding a path string, e.g.my $p = '/tests/<id:num>'). -
PRELUDE_VAR_RE =
/\$([A-Za-z_]\w*)/ -
ROUTES_ACCESSOR_RE =
/->\s*routes\b/ -
A receiver chain that names the router itself:
$self->routes->get(…),$app->routes->any(…),shift->routes->under(…). -
TRAILING_VAR_RE =
/\$([A-Za-z_]\w*)\s*$/ -
The bare
$varsitting immediately left of the call, with nothing between it and the->: the$cacheof$cache->get("ttl").
Class Method Summary
Instance Method Summary
- #analyze
- #analyze_content(content : String, file_path : String, include_callee : Bool = false, controller_callees : ControllerCalleeIndex = ControllerCalleeIndex.new) : Array(Endpoint)
- #analyze_file(path : String) : Array(Endpoint)
- #line_to_endpoints(line : String, var_prefix : Hash(String, String), path_vars : Hash(String, String), route_vars : Set(String)) : Array(Endpoint)
- #line_to_endpoints(line : String, var_prefix : Hash(String, String), path_vars : Hash(String, String)) : Array(Endpoint)
- #line_to_endpoints(line : String, var_prefix : Hash(String, String)) : Array(Endpoint)
- #line_to_endpoints(line : String) : Array(Endpoint)
-
#tech : String
Instance-side view of the same declaration.
Instance methods inherited from class FileScanEngine
analyze
analyze,
analyze_file(path : String) : Array(Endpoint)
analyze_file
Instance methods inherited from class Analyzer
analyze
analyze,
base_path : String
base_path,
base_paths : Array(String)
base_paths,
base_relative_path(path : String) : String
base_relative_path,
callees_needed? : Bool
callees_needed?,
content_matches?(content : String, markers : Regex) : Bool
content_matches?,
http_header_name(name : String) : String | Nil
http_header_name,
line_number_for_index(content : String, char_index : Int32) : Int32
line_number_for_index,
logger : NoirLogger
logger,
parallel_analyze(files : Array(String), &block : String -> Nil)
parallel_analyze,
read_file_content(path : String) : String
read_file_content,
result : Array(Endpoint)
result,
tech : String
tech,
unique_params(params : Array(Param)) : Array(Param)
unique_params,
url : String
url,
web_root_path(path : String, markers : Array(String)) : String
web_root_path
Constructor methods inherited from class Analyzer
new(options : Hash(String, YAML::Any))
new
Macros inherited from class Analyzer
analyzer_for(tech)
analyzer_for
Instance methods inherited from module FileHelper
all_files : Array(String)
all_files,
get_files_by_basename(basename : String) : Array(String)
get_files_by_basename,
get_files_by_extension(extension : String) : Array(String)
get_files_by_extension,
get_files_by_extensions(extensions : Array(String)) : Array(String)
get_files_by_extensions,
get_files_by_prefix(prefix : String) : Array(String)
get_files_by_prefix,
get_files_by_prefix_and_extension(prefix : String, extension : String) : Array(String)
get_files_by_prefix_and_extension,
get_files_by_relative_path(relative_path : String, root : String = "") : Array(String)
get_files_by_relative_path,
get_public_dir_files(base_path : String, folder : String) : Array(String)
get_public_dir_files,
get_public_files(base_path : String, anchors : Array(String) = ["shard.yml", "Gemfile"]) : Array(String)
get_public_files,
walked_path(expanded : String) : String
walked_path
Class Method Detail
Instance Method Detail
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.