docs(configuration): improve clarity and formatting in configuration documentation

This commit is contained in:
elipeter 2026-05-22 09:42:18 -05:00
parent 9062cd652a
commit 32211079a0
32 changed files with 717 additions and 380 deletions

View file

@ -277,9 +277,7 @@ pub fn collect_use_middleware(root: Node<'_>, bytes: &[u8]) -> Vec<MiddlewareSha
walk_use_calls(root, bytes, &mut raw);
let mut out: Vec<MiddlewareShape> = Vec::new();
for name in raw {
if auth_markers::is_protective(Lang::Go, &name)
&& !out.iter().any(|m| m.name == name)
{
if auth_markers::is_protective(Lang::Go, &name) && !out.iter().any(|m| m.name == name) {
out.push(MiddlewareShape { name });
}
}
@ -540,7 +538,8 @@ mod tests {
#[test]
fn collect_use_middleware_picks_bare_identifier() {
let src: &[u8] = b"package main\nfunc init() { r := gin.Default(); r.Use(AuthMiddleware) }\n";
let src: &[u8] =
b"package main\nfunc init() { r := gin.Default(); r.Use(AuthMiddleware) }\n";
let tree = parse(src);
let mw = collect_use_middleware(tree.root_node(), src);
assert_eq!(mw.len(), 1);
@ -549,8 +548,7 @@ mod tests {
#[test]
fn collect_use_middleware_picks_selector_marker() {
let src: &[u8] =
b"package main\nfunc init() { e := echo.New(); e.Use(middleware.JWT) }\n";
let src: &[u8] = b"package main\nfunc init() { e := echo.New(); e.Use(middleware.JWT) }\n";
let tree = parse(src);
let mw = collect_use_middleware(tree.root_node(), src);
assert_eq!(mw.len(), 1);
@ -597,8 +595,7 @@ mod tests {
#[test]
fn collect_use_middleware_returns_empty_when_none_recognised() {
let src: &[u8] =
b"package main\nfunc init() { r := gin.Default(); r.GET(\"/x\", Show) }\n";
let src: &[u8] = b"package main\nfunc init() { r := gin.Default(); r.GET(\"/x\", Show) }\n";
let tree = parse(src);
let mw = collect_use_middleware(tree.root_node(), src);
assert!(mw.is_empty());

View file

@ -680,7 +680,8 @@ mod tests {
#[test]
fn records_class_and_method_use_decorators_in_order() {
let src: &[u8] = b"import { Controller, Post, UseGuards, UseInterceptors } from '@nestjs/common';\n\
let src: &[u8] =
b"import { Controller, Post, UseGuards, UseInterceptors } from '@nestjs/common';\n\
import { AuthGuard } from './auth.guard';\n\
import { LoggingInterceptor } from './logging.interceptor';\n\
import { RoleGuard } from './role.guard';\n\

View file

@ -900,8 +900,7 @@ mod tests {
#[test]
fn extract_middleware_skips_member_expression_path_alias() {
let src: &[u8] =
b"app.post('/save', mw.csrf, mw.auth, controller.save);\n";
let src: &[u8] = b"app.post('/save', mw.csrf, mw.auth, controller.save);\n";
let tree = parse_js(src);
let recv = |n: &str| n == "app";
let mw = extract_route_middleware(tree.root_node(), src, "save", &recv);

View file

@ -72,9 +72,7 @@ fn extract_version(file_bytes: &[u8]) -> Option<String> {
.map(|c| if c == '_' { '.' } else { c })
.collect();
if !normalised.is_empty()
&& normalised
.chars()
.all(|c| c.is_ascii_digit() || c == '.')
&& normalised.chars().all(|c| c.is_ascii_digit() || c == '.')
{
return Some(normalised);
}

View file

@ -24,10 +24,7 @@ const ADAPTER_NAME: &str = "migration-go-migrate";
fn callee_is_go_migrate(name: &str) -> bool {
let last = name.rsplit_once('.').map(|(_, s)| s).unwrap_or(name);
matches!(
last,
"Up" | "Down" | "Steps" | "Migrate" | "Force" | "Drop"
)
matches!(last, "Up" | "Down" | "Steps" | "Migrate" | "Force" | "Drop")
}
fn source_imports_go_migrate(file_bytes: &[u8]) -> bool {

View file

@ -161,10 +161,7 @@ mod tests {
.detect(&summary("index"), tree.root_node(), src)
.expect("binding");
assert!(
binding
.middleware
.iter()
.any(|m| m.name == "auth:sanctum"),
binding.middleware.iter().any(|m| m.name == "auth:sanctum"),
"got {:?}",
binding.middleware
);

View file

@ -698,9 +698,7 @@ pub fn collect_php_middleware(root: Node<'_>, bytes: &[u8]) -> Vec<MiddlewareSha
walk_php_middleware(root, bytes, &mut raw);
let mut out: Vec<MiddlewareShape> = Vec::new();
for name in raw {
if auth_markers::is_protective(Lang::Php, &name)
&& !out.iter().any(|m| m.name == name)
{
if auth_markers::is_protective(Lang::Php, &name) && !out.iter().any(|m| m.name == name) {
out.push(MiddlewareShape { name });
}
}
@ -926,8 +924,7 @@ mod tests {
#[test]
fn collects_array_middleware_arg() {
let src: &[u8] =
b"<?php\nRoute::get('/x', 'C@x')->middleware(['auth', 'verified']);\n";
let src: &[u8] = b"<?php\nRoute::get('/x', 'C@x')->middleware(['auth', 'verified']);\n";
let tree = parse(src);
let mw = collect_php_middleware(tree.root_node(), src);
assert!(mw.iter().any(|m| m.name == "auth"), "got {mw:?}");

View file

@ -170,10 +170,7 @@ mod tests {
.detect(&summary("show"), tree.root_node(), src)
.expect("binding");
assert!(
binding
.middleware
.iter()
.any(|m| m.name == "#[IsGranted]"),
binding.middleware.iter().any(|m| m.name == "#[IsGranted]"),
"got {:?}",
binding.middleware
);

View file

@ -88,7 +88,11 @@ fn parse_inline_route(file_bytes: &[u8], class_name: &str) -> Option<(HttpMethod
None
}
fn parse_route_line(line: &str, class_orig: &str, class_snake: &str) -> Option<(HttpMethod, String)> {
fn parse_route_line(
line: &str,
class_orig: &str,
class_snake: &str,
) -> Option<(HttpMethod, String)> {
let (verb_tok, after) = line.split_once(char::is_whitespace)?;
let method = HttpMethod::from_ident(verb_tok)?;
let after = after.trim_start();

View file

@ -8,7 +8,9 @@
//! helpers here keeps the three adapters terse and lets every
//! framework share the same placeholder-binding semantics.
use crate::dynamic::framework::{HttpMethod, MiddlewareShape, ParamBinding, ParamSource, auth_markers};
use crate::dynamic::framework::{
HttpMethod, MiddlewareShape, ParamBinding, ParamSource, auth_markers,
};
use crate::symbol::Lang;
use tree_sitter::Node;
@ -499,9 +501,7 @@ pub fn collect_ruby_middleware(root: Node<'_>, bytes: &[u8]) -> Vec<MiddlewareSh
walk_attach_calls(root, bytes, &mut raw);
let mut out: Vec<MiddlewareShape> = Vec::new();
for name in raw {
if auth_markers::is_protective(Lang::Ruby, &name)
&& !out.iter().any(|m| m.name == name)
{
if auth_markers::is_protective(Lang::Ruby, &name) && !out.iter().any(|m| m.name == name) {
out.push(MiddlewareShape { name });
}
}
@ -722,7 +722,8 @@ mod tests {
fn collects_rails_protect_from_forgery_self_naming() {
// `protect_from_forgery with: :exception` carries no positional
// arg — the verb itself must be recognised as the marker.
let src: &[u8] = b"class A < ApplicationController\n protect_from_forgery with: :exception\nend\n";
let src: &[u8] =
b"class A < ApplicationController\n protect_from_forgery with: :exception\nend\n";
let tree = parse(src);
let mw = collect_ruby_middleware(tree.root_node(), src);
assert!(
@ -744,8 +745,7 @@ mod tests {
#[test]
fn collects_sinatra_use_rack_attack_rate_limit() {
let src: &[u8] =
b"require 'sinatra'\nuse Rack::Attack\nget '/x' do\n 'ok'\nend\n";
let src: &[u8] = b"require 'sinatra'\nuse Rack::Attack\nget '/x' do\n 'ok'\nend\n";
let tree = parse(src);
let mw = collect_ruby_middleware(tree.root_node(), src);
assert!(mw.iter().any(|m| m.name == "Rack::Attack"), "got {mw:?}");
@ -762,7 +762,8 @@ mod tests {
#[test]
fn drops_unknown_marker_names() {
let src: &[u8] = b"class A < ApplicationController\n before_action :do_something_custom\nend\n";
let src: &[u8] =
b"class A < ApplicationController\n before_action :do_something_custom\nend\n";
let tree = parse(src);
let mw = collect_ruby_middleware(tree.root_node(), src);
// `do_something_custom` is not in the Ruby auth-markers table.

View file

@ -298,16 +298,14 @@ mod tests {
#[test]
fn populates_middleware_from_use_rack_attack() {
let src: &[u8] = b"require 'sinatra'\nuse Rack::Attack\nget '/run' do |payload|\n payload\nend\n";
let src: &[u8] =
b"require 'sinatra'\nuse Rack::Attack\nget '/run' do |payload|\n payload\nend\n";
let tree = parse(src);
let binding = RubySinatraAdapter
.detect(&summary("run"), tree.root_node(), src)
.expect("binding");
assert!(
binding
.middleware
.iter()
.any(|m| m.name == "Rack::Attack"),
binding.middleware.iter().any(|m| m.name == "Rack::Attack"),
"expected Rack::Attack marker, got {:?}",
binding.middleware
);

View file

@ -177,7 +177,12 @@ mod tests {
let binding = RustActixAdapter
.detect(&summary("show"), tree.root_node(), src)
.expect("binding");
assert!(binding.middleware.iter().any(|m| m.name.contains("HttpAuthentication")));
assert!(
binding
.middleware
.iter()
.any(|m| m.name.contains("HttpAuthentication"))
);
}
#[test]

View file

@ -318,9 +318,7 @@ pub fn collect_rust_middleware(root: Node<'_>, bytes: &[u8]) -> Vec<MiddlewareSh
walk_attach_calls(root, bytes, &mut raw);
let mut out: Vec<MiddlewareShape> = Vec::new();
for name in raw {
if auth_markers::is_protective(Lang::Rust, &name)
&& !out.iter().any(|m| m.name == name)
{
if auth_markers::is_protective(Lang::Rust, &name) && !out.iter().any(|m| m.name == name) {
out.push(MiddlewareShape { name });
}
}
@ -1117,7 +1115,8 @@ mod tests {
#[test]
fn collect_rust_middleware_drops_unknown_names() {
let src: &[u8] = b"use axum::Router;\nfn build() -> Router { Router::new().layer(LoggingLayer) }\n";
let src: &[u8] =
b"use axum::Router;\nfn build() -> Router { Router::new().layer(LoggingLayer) }\n";
let tree = parse(src);
let mw = collect_rust_middleware(tree.root_node(), src);
assert!(mw.is_empty(), "LoggingLayer is not a recognised marker");

View file

@ -128,7 +128,10 @@ const PYTHON_EXACT: &[ExactRow] = &[
("ValidationMiddleware", AuthMarkerKind::InputValidation),
("pydantic_validate", AuthMarkerKind::InputValidation),
("SecurityMiddleware", AuthMarkerKind::OutputSanitization),
("XContentTypeOptionsMiddleware", AuthMarkerKind::OutputSanitization),
(
"XContentTypeOptionsMiddleware",
AuthMarkerKind::OutputSanitization,
),
("bleach_clean", AuthMarkerKind::OutputSanitization),
("RateLimitMiddleware", AuthMarkerKind::RateLimit),
("ratelimit", AuthMarkerKind::RateLimit),
@ -504,10 +507,7 @@ mod tests {
classify(Lang::Go, "JWTAuth"),
Some(AuthMarkerKind::Authentication)
);
assert_eq!(
classify(Lang::Go, "csrf.New"),
Some(AuthMarkerKind::Csrf)
);
assert_eq!(classify(Lang::Go, "csrf.New"), Some(AuthMarkerKind::Csrf));
}
#[test]

View file

@ -450,11 +450,13 @@ mod tests {
let adapter = LegacyDetectOnlyAdapter;
let no_ssa = adapter.detect_with_context(&summary, None, tree.root_node(), src);
assert_eq!(no_ssa.as_ref().map(|b| b.adapter.as_str()), Some("legacy:handler"));
assert_eq!(
no_ssa.as_ref().map(|b| b.adapter.as_str()),
Some("legacy:handler")
);
let mut ssa = SsaFuncSummary::default();
ssa.typed_call_receivers
.push((0, "Repository".to_string()));
ssa.typed_call_receivers.push((0, "Repository".to_string()));
let with_ssa = adapter.detect_with_context(&summary, Some(&ssa), tree.root_node(), src);
// Default impl ignores the SSA summary, so both calls produce
// the same binding identity.