mirror of
https://github.com/elicpeter/nyx.git
synced 2026-06-09 19:45:13 +02:00
docs(configuration): improve clarity and formatting in configuration documentation
This commit is contained in:
parent
9062cd652a
commit
32211079a0
32 changed files with 717 additions and 380 deletions
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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\
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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:?}");
|
||||
|
|
|
|||
|
|
@ -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
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue