class

Analyzer::Python::Sanic

Inherits Analyzer::Python::PythonEngine < Analyzer < FileHelper < Reference < Object

Constants

ADD_ROUTE_CALL_RE = /\b(#{PYTHON_VAR_NAME_REGEX})\.add_route\s*\((.*)\)\s*$/m
ADD_WEBSOCKET_ROUTE_CALL_RE = /\b(#{PYTHON_VAR_NAME_REGEX})\.add_websocket_route\s*\((.*)\)\s*$/m
AS_VIEW_RE = /^(#{PYTHON_VAR_NAME_REGEX})\.as_view\s*\(/
BLUEPRINT_CALL_RE = /\.blueprint\s*\(\s*(#{PYTHON_VAR_NAME_REGEX})(.*?)\)/m
BLUEPRINT_CTOR_RE = /(#{PYTHON_VAR_NAME_REGEX})\s*=\s*(?:sanic\.)?Blueprint\s*\((.*?)\)/m
BLUEPRINT_GROUP_RE = /(?:#{PYTHON_VAR_NAME_REGEX}\s*=\s*)?Blueprint\s*\.\s*group\s*\((.*?)\)/m
DOTTED_REFERENCE_RE = /^#{PYTHON_VAR_NAME_REGEX}(?:\.#{PYTHON_VAR_NAME_REGEX})*$/
REQUEST_PARAM_FIELD_PATTERNS = REQUEST_PARAM_FIELDS.map do |field, tuple| {"request.#{field}", tuple[1], /request\.#{field}(?:\.get(?:list)?)?\(['"']([^'"']+)['"']\)/, /request\.#{field}\[['"']([^'"']+)['"']\]/} end

get_endpoints rebuilt two PCRE2 patterns per request field on every handler-body line. The field set is fixed, so precompile the access patterns (and the request.<field> guard substring) once. Tuple shape: {guard_substring, noir_param_type, paren_re, bracket_re}

REQUEST_PARAM_FIELDS = {"args" => {["GET"], "query"}, "form" => {["POST", "PUT", "PATCH", "DELETE"], "form"}, "files" => {["POST", "PUT", "PATCH", "DELETE"], "form"}, "json" => {["POST", "PUT", "PATCH", "DELETE"], "json"}, "cookies" => {nil, "cookie"}, "headers" => {nil, "header"}}

Reference: https://sanic.readthedocs.io/en/stable/sanic/request.html

REQUEST_PARAM_TYPES = {"query" => nil, "form" => ["POST", "PUT", "PATCH", "DELETE", "QUERY"], "json" => ["POST", "PUT", "PATCH", "DELETE", "QUERY"], "cookie" => nil, "header" => nil}

QUERY (RFC 10008) is safe/idempotent like GET but, per the method's whole purpose, carries its filter criteria in a request body like POST — so it joins the body-bearing methods for "form"/"json", not the read-only "query" (query-string) type.

SANIC_INSTANCE_RE = /(#{PYTHON_VAR_NAME_REGEX})(?::#{PYTHON_VAR_NAME_REGEX})?=(?:sanic\.)?Sanic\(/

Hoisted out of the analyze loops: an interpolated regex literal recompiles (PCRE2 JIT) on every evaluation, and these interpolate only constants. The .to_s expansion is byte-identical to the previous inline form, so matching behaviour is unchanged.

STATIC_CALL_RE = /\b(#{PYTHON_VAR_NAME_REGEX})\.static\s*\((.*)\)\s*$/m

Class methods

tech_name
Source

Instance methods

analyze
Source
tech

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.

Source

Nested types