From e62fffc6e0c30ec7b468b2d91749e766cc4f95bb Mon Sep 17 00:00:00 2001 From: tobjend Date: Sun, 12 Jul 2026 03:02:50 +0200 Subject: [PATCH] feat: grammar_structure_score + min_structure filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Quantifies how structured a SORE is (0.0=flat bag, 1.0=fully structured). Flat bags are CRX over-approximations — they list symbols without ordering. With min_structure=0.2: Flask: 2 kept (was 5), 9 dropped RAGSAK: 10 kept (was 19), 114 dropped FastAPI: 47 kept (was 106), 95 dropped Total: 59 useful grammars, 218 noise removed CLI: --min-structure 0.2 (default: 0, keep all) --- bex/gbnf.py | 45 +++ bex/tag_preprocessor/analyze.py | 21 +- experiments/results/fastapi_gbnf.json | 561 +++++++++++++++----------- experiments/results/flask_gbnf.json | 45 ++- experiments/results/ragsak_gbnf.json | 408 ++++++++++++------- 5 files changed, 669 insertions(+), 411 deletions(-) diff --git a/bex/gbnf.py b/bex/gbnf.py index fda87cf..b554876 100644 --- a/bex/gbnf.py +++ b/bex/gbnf.py @@ -383,3 +383,48 @@ def validate_sore(sore): return True, None except ValueError as e: return False, str(e) + + +def grammar_structure_score(sore): + """Quantify how structured a SORE is (0.0 = flat bag, 1.0 = fully structured). + + Structured grammars have ordering (concatenation, optional, repetition) + that tells you the SEQUENCE things happen. Flat bags just list symbols. + """ + import re + if not sore or sore in ('∅', 'ε'): + return 0.0 + depth = 0 + dots = 0 + pluses_outside = 0 + questions = 0 + stars = 0 + for ch in sore: + if ch == '(': + depth += 1 + elif ch == ')': + depth -= 1 + elif ch == '.' and depth == 0: + dots += 1 + elif ch == '+' and depth == 0: + pluses_outside += 1 + elif ch == '?' and depth == 0: + questions += 1 + elif ch == '*' and depth == 0: + stars += 1 + disj_parts = 0 + for m in re.finditer(r'\(([^)]+)\)', sore): + inner = m.group(1) + if '+' in inner: + disj_parts = max(disj_parts, inner.count('+') + 1) + symbols_only = re.sub(r'[.?*+()]', '', sore) + sym_len = len(symbols_only) + if sym_len == 0: + return 0.0 + struct_ops = dots + questions + stars + pluses_outside + struct_ratio = struct_ops / max(sym_len, 1) + disj_ratio = disj_parts / max(sym_len, 1) + score = min(1.0, struct_ratio * 3) + if disj_ratio > 0.5 and dots == 0: + score *= 0.3 + return score diff --git a/bex/tag_preprocessor/analyze.py b/bex/tag_preprocessor/analyze.py index 5696557..10a71cf 100644 --- a/bex/tag_preprocessor/analyze.py +++ b/bex/tag_preprocessor/analyze.py @@ -20,7 +20,7 @@ import pathspec from .code import preprocess_by_method, extract_arg_info, _summarize_arg_info from bex.ensemble import infer_ensemble -from bex.gbnf import validate_sore +from bex.gbnf import validate_sore, grammar_structure_score SUPPORTED_EXTENSIONS = { ".py", ".js", ".ts", ".kt", ".rb", ".go", ".rs", ".java", ".c", ".cpp", @@ -283,7 +283,7 @@ def analyze_clusters(file_paths, extension, project_root="", min_coverage=DEFAUL return [("(all methods)", result, len(sequences), meta)] -def _infer_group(label, group_seqs, group_files, project_root, min_coverage, prefer, kmax, N, include_kore=False, include_idregex=False, method='langsize', min_methods=5, crx_method='standard'): +def _infer_group(label, group_seqs, group_files, project_root, min_coverage, prefer, kmax, N, include_kore=False, include_idregex=False, method='langsize', min_methods=5, crx_method='standard', min_structure=0.0): """Infer grammar for one package group. Module-level for ProcessPoolExecutor.""" filtered = frequency_filter(group_seqs, min_coverage=min_coverage) imports = _extract_imports(group_files) @@ -316,16 +316,20 @@ def _infer_group(label, group_seqs, group_files, project_root, min_coverage, pre # Validate grammar is parseable if result and result.get('best') and result['best'].get('grammar'): - ok, err = validate_sore(result['best']['grammar']) + grammar = result['best']['grammar'] + ok, err = validate_sore(grammar) if not ok: meta = {"files": group_files, "imports": imports, "arg_patterns": arg_patterns, "packages": packages, "skip_reason": "malformed_grammar", "skip_detail": err} return (label, None, len(filtered), meta) + if min_structure > 0 and grammar_structure_score(grammar) < min_structure: + meta = {"files": group_files, "imports": imports, "arg_patterns": arg_patterns, "packages": packages, "skip_reason": "low_structure", "structure_score": grammar_structure_score(grammar)} + return (label, None, len(filtered), meta) meta = {"files": group_files, "imports": imports, "arg_patterns": arg_patterns, "packages": packages} return (label, result, len(filtered), meta) -def analyze_by_package(file_paths, extension, project_root="", min_coverage=DEFAULT_COVERAGE, prefer=None, kmax=2, N=3, min_pkg_size=3, include_kore=False, include_idregex=False, method='langsize', min_methods=5, crx_method='standard'): +def analyze_by_package(file_paths, extension, project_root="", min_coverage=DEFAULT_COVERAGE, prefer=None, kmax=2, N=3, min_pkg_size=3, include_kore=False, include_idregex=False, method='langsize', min_methods=5, crx_method='standard', min_structure=0.0): """Preprocess and group by package directory, infer per group. Groups methods by their file's relative directory path, merging @@ -360,7 +364,7 @@ def analyze_by_package(file_paths, extension, project_root="", min_coverage=DEFA gs = [sequences[i] for i in indices] gf = set(seq_files[i] for i in indices) f = ex.submit(_infer_group, label, gs, gf, project_root, - min_coverage, prefer, kmax, N, include_kore, include_idregex, method, min_methods, crx_method) + min_coverage, prefer, kmax, N, include_kore, include_idregex, method, min_methods, crx_method, min_structure) futures[f] = label for f in as_completed(futures): @@ -473,6 +477,7 @@ def analyze_directory( method='langsize', min_methods=5, crx_method='standard', + min_structure=0.0, ): """Scan a directory and run analysis for each language found. @@ -511,6 +516,7 @@ def analyze_directory( method=method, min_methods=min_methods, crx_method=crx_method, + min_structure=min_structure, ) else: results[ext] = analyze_clusters( @@ -680,6 +686,10 @@ def _parse_args(argv=None): "--crx-method", choices=["standard", "refined"], default="standard", help="CRX method: standard (default) or refined (cluster-then-infer, tighter grammars)", ) + parser.add_argument( + "--min-structure", type=float, default=0.0, + help="Minimum structure score (0.0-1.0) to keep grammar. Flat bags of symbols below this are dropped (default: 0, keep all)", + ) return parser.parse_args(argv) @@ -703,6 +713,7 @@ def main(): method=args.scoring_method, min_methods=args.min_methods, crx_method=args.crx_method, + min_structure=args.min_structure, ) if args.json_flag or args.format == "json": diff --git a/experiments/results/fastapi_gbnf.json b/experiments/results/fastapi_gbnf.json index bb2ac5a..04d07a1 100644 --- a/experiments/results/fastapi_gbnf.json +++ b/experiments/results/fastapi_gbnf.json @@ -3,25 +3,29 @@ "package": "docs/en/docs/js", "ext": ".js", "methods": 49, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "(other)", "ext": ".js", - "methods": 1 + "methods": 1, + "skip": "", + "structure_score": 0 }, { "package": "docs_src", "ext": ".py", "methods": 45, - "sore": "if?.(HTTP_201_CREATED+JSONResponse+app+await+content+duration+else+end_datetime+get+headers+id+in+item+item_id+items+json_compatible_item_data+jsonable_encoder+key+name+process_after+repeat_at+request+response+results+return+set_cookie+size+start_datetime+start_process+status+status_code+value)+.len+?.(ads_id+username)?.file?.token?.fileb?.content_type?", - "gbnf": "root ::= \"if\"? (\"HTTP_201_CREATED\" | \"JSONResponse\" | \"app\" | \"await\" | \"content\" | \"duration\" | \"else\" | \"end_datetime\" | \"get\" | \"headers\" | \"id\" | \"in\" | \"item\" | \"item_id\" | \"items\" | \"json_compatible_item_data\" | \"jsonable_encoder\" | \"key\" | \"name\" | \"process_after\" | \"repeat_at\" | \"request\" | \"response\" | \"results\" | \"return\" | \"set_cookie\" | \"size\" | \"start_datetime\" | \"start_process\" | \"status\" | \"status_code\" | \"value\")+ \"len\"* (\"ads_id\" | \"username\")? \"file\"? \"token\"? \"fileb\"? \"content_type\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.15841584158415842 }, { "package": "docs_src/additional_responses", "ext": ".py", "methods": 4, + "skip": "", + "structure_score": 0.40540540540540543, "sore": "if.(img+item_id).(FileResponse+else+media_type+return)+.JSONResponse+?.status_code?.content?", "gbnf": "root ::= \"if\" (\"img\" | \"item_id\") (\"FileResponse\" | \"else\" | \"media_type\" | \"return\")+ \"JSONResponse\"* \"status_code\"? \"content\"?", "gbnf_ok": true @@ -30,14 +34,15 @@ "package": "docs_src/advanced_middleware", "ext": ".py", "methods": 3, - "sore": "return", - "gbnf": "root ::= \"return\"", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.0 }, { "package": "docs_src/app_testing", "ext": ".py", "methods": 14, + "skip": "", + "structure_score": 0.34285714285714286, "sore": "return?.(TestClient+app+client+get+items+json+response+status_code+yield)+?.websocket_connect+?.(clear+item_id)+?.(accept+await+data+receive_json+send_json+websocket)+?.close+?", "gbnf": "root ::= \"return\"? (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"items\" | \"json\" | \"response\" | \"status_code\" | \"yield\")* \"websocket_connect\"* (\"clear\" | \"item_id\")* (\"accept\" | \"await\" | \"data\" | \"receive_json\" | \"send_json\" | \"websocket\")* \"close\"*", "gbnf_ok": true @@ -46,30 +51,32 @@ "package": "docs_src/app_testing/app_b_an_py310", "ext": ".py", "methods": 8, - "sore": "(HTTPException+client+detail+fake_db+fake_secret_token+get+headers+id+if+in+item+item_id+json+model_dump+not+not in+post+raise+response+return+status_code+x_token)+", - "gbnf": "root ::= (\"HTTPException\" | \"client\" | \"detail\" | \"fake_db\" | \"fake_secret_token\" | \"get\" | \"headers\" | \"id\" | \"if\" | \"in\" | \"item\" | \"item_id\" | \"json\" | \"model_dump\" | \"not\" | \"not in\" | \"post\" | \"raise\" | \"response\" | \"return\" | \"status_code\" | \"x_token\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.02142857142857143 }, { "package": "docs_src/app_testing/app_b_py310", "ext": ".py", "methods": 8, - "sore": "(HTTPException+client+detail+fake_db+fake_secret_token+get+headers+id+if+in+item+item_id+json+model_dump+not+not in+post+raise+response+return+status_code+x_token)+", - "gbnf": "root ::= (\"HTTPException\" | \"client\" | \"detail\" | \"fake_db\" | \"fake_secret_token\" | \"get\" | \"headers\" | \"id\" | \"if\" | \"in\" | \"item\" | \"item_id\" | \"json\" | \"model_dump\" | \"not\" | \"not in\" | \"post\" | \"raise\" | \"response\" | \"return\" | \"status_code\" | \"x_token\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.02142857142857143 }, { "package": "docs_src/background_tasks", "ext": ".py", "methods": 8, - "sore": "open+?.if?.mode?.log+?.(add_task+background_tasks+content+email+email_file+message+q+return+write+write_log+write_notification)+", - "gbnf": "root ::= \"open\"* \"if\"? \"mode\"? \"log\"* (\"add_task\" | \"background_tasks\" | \"content\" | \"email\" | \"email_file\" | \"message\" | \"q\" | \"return\" | \"write\" | \"write_log\" | \"write_notification\")+", + "skip": "", + "structure_score": 0.3142857142857143, + "sore": "if?.open+?.mode?.log+?.(add_task+background_tasks+content+email+email_file+message+q+return+write+write_log+write_notification)+", + "gbnf": "root ::= \"if\"? \"open\"* \"mode\"? \"log\"* (\"add_task\" | \"background_tasks\" | \"content\" | \"email\" | \"email_file\" | \"message\" | \"q\" | \"return\" | \"write\" | \"write_log\" | \"write_notification\")+", "gbnf_ok": true }, { "package": "docs_src/behind_a_proxy", "ext": ".py", "methods": 5, + "skip": "", + "structure_score": 1.0, "sore": "return.request?.scope?.get+?", "gbnf": "root ::= \"return\" \"request\"? \"scope\"? \"get\"*", "gbnf_ok": true @@ -78,6 +85,8 @@ "package": "docs_src/bigger_applications/app_an_py310", "ext": ".py", "methods": 4, + "skip": "", + "structure_score": 0.7636363636363636, "sore": "if?.return?.(token+x_token)?.raise?.HTTPException+?.status_code?.detail?", "gbnf": "root ::= \"if\"? \"return\"? (\"token\" | \"x_token\")? \"raise\"? \"HTTPException\"* \"status_code\"? \"detail\"?", "gbnf_ok": true @@ -86,28 +95,29 @@ "package": "docs_src/bigger_applications/app_an_py310/routers", "ext": ".py", "methods": 6, - "sore": "if?.(HTTPException+detail+fake_items_db+in+item_id+not+not in+raise+return+status_code)+.username?", - "gbnf": "root ::= \"if\"? (\"HTTPException\" | \"detail\" | \"fake_items_db\" | \"in\" | \"item_id\" | \"not\" | \"not in\" | \"raise\" | \"return\" | \"status_code\")+ \"username\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.18292682926829268 }, { "package": "docs_src/body", "ext": ".py", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "docs_src/body_multiple_params", "ext": ".py", "methods": 9, - "sore": "(if+importance+item+item_id+q+results+return+update+user)+", - "gbnf": "root ::= (\"if\" | \"importance\" | \"item\" | \"item_id\" | \"q\" | \"results\" | \"return\" | \"update\" | \"user\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.06382978723404255 }, { "package": "docs_src/body_nested_models", "ext": ".py", "methods": 9, + "skip": "", + "structure_score": 0.21428571428571427, "sore": "(item+item_id+results+return)+.(images+offer+weights)?", "gbnf": "root ::= (\"item\" | \"item_id\" | \"results\" | \"return\")+ (\"images\" | \"offer\" | \"weights\")?", "gbnf_ok": true @@ -116,14 +126,15 @@ "package": "docs_src/body_updates", "ext": ".py", "methods": 4, - "sore": "(Item+exclude_unset+item+item_id+items+jsonable_encoder+model_copy+model_dump+return+stored_item_data+stored_item_model+update+update_data+update_item_encoded+updated_item)+", - "gbnf": "root ::= (\"Item\" | \"exclude_unset\" | \"item\" | \"item_id\" | \"items\" | \"jsonable_encoder\" | \"model_copy\" | \"model_dump\" | \"return\" | \"stored_item_data\" | \"stored_item_model\" | \"update\" | \"update_data\" | \"update_item_encoded\" | \"updated_item\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.019230769230769232 }, { "package": "docs_src/configure_swagger_ui", "ext": ".py", "methods": 3, + "skip": "", + "structure_score": 0.21428571428571427, "sore": "return.username", "gbnf": "root ::= \"return\" \"username\"", "gbnf_ok": true @@ -132,6 +143,8 @@ "package": "docs_src/cookie_param_models", "ext": ".py", "methods": 4, + "skip": "", + "structure_score": 0.23076923076923078, "sore": "return.cookies", "gbnf": "root ::= \"return\" \"cookies\"", "gbnf_ok": true @@ -140,6 +153,8 @@ "package": "docs_src/custom_docs_ui", "ext": ".py", "methods": 8, + "skip": "", + "structure_score": 0.2670157068062827, "sore": "return.(get_swagger_ui_oauth2_redirect_html+username)+?.(get_redoc_html+get_swagger_ui_html)+?.(app+oauth2_redirect_url+openapi_url+title)+?.swagger_ui_oauth2_redirect_url?.redoc_js_url?.swagger_js_url?.swagger_css_url?", "gbnf": "root ::= \"return\" (\"get_swagger_ui_oauth2_redirect_html\" | \"username\")* (\"get_redoc_html\" | \"get_swagger_ui_html\")* (\"app\" | \"oauth2_redirect_url\" | \"openapi_url\" | \"title\")* \"swagger_ui_oauth2_redirect_url\"? \"redoc_js_url\"? \"swagger_js_url\"? \"swagger_css_url\"?", "gbnf_ok": true @@ -148,58 +163,66 @@ "package": "docs_src/custom_request_and_route", "ext": ".py", "methods": 18, - "sore": "(GzipRequest+HTTPException+Request+RequestValidationError+Response+_body+async+await+before+body+custom_route_handler+decode+decompress+def+detail+duration+errors+exc+except+get_route_handler+getlist+gzip+hasattr+headers+if+in+not+original_route_handler+print+raise+receive+request+response+return+scope+self+status_code+str+super+time+try)+.sum+?.numbers?", - "gbnf": "root ::= (\"GzipRequest\" | \"HTTPException\" | \"Request\" | \"RequestValidationError\" | \"Response\" | \"_body\" | \"async\" | \"await\" | \"before\" | \"body\" | \"custom_route_handler\" | \"decode\" | \"decompress\" | \"def\" | \"detail\" | \"duration\" | \"errors\" | \"exc\" | \"except\" | \"get_route_handler\" | \"getlist\" | \"gzip\" | \"hasattr\" | \"headers\" | \"if\" | \"in\" | \"not\" | \"original_route_handler\" | \"print\" | \"raise\" | \"receive\" | \"request\" | \"response\" | \"return\" | \"scope\" | \"self\" | \"status_code\" | \"str\" | \"super\" | \"time\" | \"try\")+ \"sum\"* \"numbers\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.05844155844155844 }, { "package": "docs_src/custom_response", "ext": ".py", "methods": 19, - "sore": "for?.def?.i?.in?.range+?.(FileResponse+HTMLResponse+StreamingResponse+content+dumps+file_like+from+html_content+is+is not+iterfile+mode+not+open+option+orjson+return+some_file_path+yield)+.(OPT_INDENT_2+ORJSONResponse+RedirectResponse+fake_video_streamer+generate_html_response+media_type+status_code)+?.await?.anyio?.sleep+?", - "gbnf": "root ::= \"for\"? \"def\"? \"i\"? \"in\"? \"range\"* (\"FileResponse\" | \"HTMLResponse\" | \"StreamingResponse\" | \"content\" | \"dumps\" | \"file_like\" | \"from\" | \"html_content\" | \"is\" | \"is not\" | \"iterfile\" | \"mode\" | \"not\" | \"open\" | \"option\" | \"orjson\" | \"return\" | \"some_file_path\" | \"yield\")+ (\"OPT_INDENT_2\" | \"ORJSONResponse\" | \"RedirectResponse\" | \"fake_video_streamer\" | \"generate_html_response\" | \"media_type\" | \"status_code\")* \"await\"? \"anyio\"? \"sleep\"*", + "skip": "", + "structure_score": 0.24, + "sore": "def?.for?.i?.in?.range+?.(FileResponse+HTMLResponse+StreamingResponse+content+dumps+file_like+from+html_content+is+is not+iterfile+mode+not+open+option+orjson+return+some_file_path+yield)+.await?.(OPT_INDENT_2+ORJSONResponse+RedirectResponse+fake_video_streamer+generate_html_response+media_type+status_code)+?.anyio?.sleep+?", + "gbnf": "root ::= \"def\"? \"for\"? \"i\"? \"in\"? \"range\"* (\"FileResponse\" | \"HTMLResponse\" | \"StreamingResponse\" | \"content\" | \"dumps\" | \"file_like\" | \"from\" | \"html_content\" | \"is\" | \"is not\" | \"iterfile\" | \"mode\" | \"not\" | \"open\" | \"option\" | \"orjson\" | \"return\" | \"some_file_path\" | \"yield\")+ \"await\"? (\"OPT_INDENT_2\" | \"ORJSONResponse\" | \"RedirectResponse\" | \"fake_video_streamer\" | \"generate_html_response\" | \"media_type\" | \"status_code\")* \"anyio\"? \"sleep\"*", "gbnf_ok": true }, { "package": "docs_src/dataclasses_", "ext": ".py", "methods": 4, - "sore": "return.item?.author_id?.items?", - "gbnf": "root ::= \"return\" \"item\"? \"author_id\"? \"items\"?", + "skip": "", + "structure_score": 0.75, + "sore": "return.author_id?.item?.items?", + "gbnf": "root ::= \"return\" \"author_id\"? \"item\"? \"items\"?", "gbnf_ok": true }, { "package": "docs_src/dependencies", "ext": ".py", "methods": 82, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "docs_src/dependency_testing", "ext": ".py", "methods": 14, - "sore": "(client+get+response+status_code)+?.return?.json+?.commons?.q?.skip?.limit?", - "gbnf": "root ::= (\"client\" | \"get\" | \"response\" | \"status_code\")* \"return\"? \"json\"* \"commons\"? \"q\"? \"skip\"? \"limit\"?", + "skip": "", + "structure_score": 0.8181818181818181, + "sore": "(client+get+response+status_code)+?.return?.json+?.q?.commons?.skip?.limit?", + "gbnf": "root ::= (\"client\" | \"get\" | \"response\" | \"status_code\")* \"return\"? \"json\"* \"q\"? \"commons\"? \"skip\"? \"limit\"?", "gbnf_ok": true }, { "package": "docs_src/events", "ext": ".py", "methods": 7, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "docs_src/extra_models", "ext": ".py", "methods": 9, - "sore": "(UserInDB+fake_password_hasher+fake_save_user+hashed_password+model_dump+password+print+return+user_in+user_in_db+user_saved)+.items?.raw_password?.item_id?", - "gbnf": "root ::= (\"UserInDB\" | \"fake_password_hasher\" | \"fake_save_user\" | \"hashed_password\" | \"model_dump\" | \"password\" | \"print\" | \"return\" | \"user_in\" | \"user_in_db\" | \"user_saved\")+ \"items\"? \"raw_password\"? \"item_id\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.15328467153284672 }, { "package": "docs_src/generate_clients", "ext": ".py", "methods": 9, + "skip": "", + "structure_score": 0.7894736842105263, "sore": "return.(route+tags)+?.name?", "gbnf": "root ::= \"return\" (\"route\" | \"tags\")* \"name\"?", "gbnf_ok": true @@ -208,12 +231,15 @@ "package": "docs_src/handling_errors", "ext": ".py", "methods": 13, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "docs_src/header_param_models", "ext": ".py", "methods": 6, + "skip": "", + "structure_score": 0.23076923076923078, "sore": "return.headers", "gbnf": "root ::= \"return\" \"headers\"", "gbnf_ok": true @@ -222,34 +248,36 @@ "package": "docs_src/header_params", "ext": ".py", "methods": 6, - "sore": "return.(strange_header+user_agent+x_token)", - "gbnf": "root ::= \"return\" (\"strange_header\" | \"user_agent\" | \"x_token\")", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.08108108108108109 }, { "package": "docs_src/json_base64_bytes", "ext": ".py", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "docs_src/metadata", "ext": ".py", "methods": 6, - "sore": "(return+urn [{)", - "gbnf": "root ::= \"return\" | \"urn [{\"", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.0 }, { "package": "docs_src/path_operation_advanced_configuration", "ext": ".py", "methods": 9, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "docs_src/path_operation_configuration", "ext": ".py", "methods": 12, + "skip": "", + "structure_score": 0.6000000000000001, "sore": "return.item?", "gbnf": "root ::= \"return\" \"item\"?", "gbnf_ok": true @@ -258,22 +286,22 @@ "package": "docs_src/path_params", "ext": ".py", "methods": 8, - "sore": "(ModelName+alexnet+if+is+model_name+return+value)+.(file_path+item_id+user_id)?", - "gbnf": "root ::= (\"ModelName\" | \"alexnet\" | \"if\" | \"is\" | \"model_name\" | \"return\" | \"value\")+ (\"file_path\" | \"item_id\" | \"user_id\")?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.140625 }, { "package": "docs_src/path_params_numeric_validations", "ext": ".py", "methods": 12, - "sore": "(if+item_id+q+results+return+size+update)+", - "gbnf": "root ::= (\"if\" | \"item_id\" | \"q\" | \"results\" | \"return\" | \"size\" | \"update\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.09090909090909091 }, { "package": "docs_src/pydantic_v1_in_v2", "ext": ".py", "methods": 3, + "skip": "", + "structure_score": 0.30000000000000004, "sore": "return.item", "gbnf": "root ::= \"return\" \"item\"", "gbnf_ok": true @@ -282,34 +310,36 @@ "package": "docs_src/python_types", "ext": ".py", "methods": 13, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "docs_src/query_param_models", "ext": ".py", "methods": 4, - "sore": "return.filter_query", - "gbnf": "root ::= \"return\" \"filter_query\"", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.16666666666666666 }, { "package": "docs_src/query_params", "ext": ".py", "methods": 6, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "docs_src/query_params_str_validations", "ext": ".py", "methods": 31, - "sore": "(ValueError+choice+data+else+get+hidden_query+id+if+item+items+list+not+q+query_items+raise+random+results+return+startswith+update)+", - "gbnf": "root ::= (\"ValueError\" | \"choice\" | \"data\" | \"else\" | \"get\" | \"hidden_query\" | \"id\" | \"if\" | \"item\" | \"items\" | \"list\" | \"not\" | \"q\" | \"query_items\" | \"raise\" | \"random\" | \"results\" | \"return\" | \"startswith\" | \"update\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.02702702702702703 }, { "package": "docs_src/request_files", "ext": ".py", "methods": 24, + "skip": "", + "structure_score": 0.4576271186440678, "sore": "if?.not?.(HTMLResponse+content+else+file+filename+for+len+return)+.in?.files?", "gbnf": "root ::= \"if\"? \"not\"? (\"HTMLResponse\" | \"content\" | \"else\" | \"file\" | \"filename\" | \"for\" | \"len\" | \"return\")+ \"in\"? \"files\"?", "gbnf_ok": true @@ -318,6 +348,8 @@ "package": "docs_src/request_form_models", "ext": ".py", "methods": 4, + "skip": "", + "structure_score": 0.30000000000000004, "sore": "return.data", "gbnf": "root ::= \"return\" \"data\"", "gbnf_ok": true @@ -326,6 +358,8 @@ "package": "docs_src/response_model", "ext": ".py", "methods": 16, + "skip": "", + "structure_score": 0.6551724137931034, "sore": "if?.teleport?.(RedirectResponse+return+url)+.(item+user)?.(Item+name+price)+?.items?.JSONResponse+?.item_id?.content?", "gbnf": "root ::= \"if\"? \"teleport\"? (\"RedirectResponse\" | \"return\" | \"url\")+ (\"item\" | \"user\")? (\"Item\" | \"name\" | \"price\")* \"items\"? \"JSONResponse\"* \"item_id\"? \"content\"?", "gbnf_ok": true @@ -334,38 +368,39 @@ "package": "docs_src/schema_extra_example", "ext": ".py", "methods": 8, - "sore": "(item+item_id+results+return)+", - "gbnf": "root ::= (\"item\" | \"item_id\" | \"results\" | \"return\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.125 }, { "package": "docs_src/security", "ext": ".py", "methods": 70, - "sore": "(ACCESS_TOKEN_EXPIRE_MINUTES+ALGORITHM+DUMMY_HASH+HTTPException+HTTP_401_UNAUTHORIZED+InvalidTokenError+SECRET_KEY+Token+TokenData+UserInDB+access_token+access_token_expires+algorithm+algorithms+authenticate_user+copy+create_access_token+credentials+credentials_exception+current_user+data+datetime+db+decode+detail+disabled+else+encode+encoded_jwt+except+expire+expires_delta+fake_db+fake_decode_token+fake_users_db+form_data+get+get_user+hash+hashed_password+headers+if+in+is+jwt+minutes+not+now+password+password_hash+payload+plain_password+raise+return+scopes+status+status_code+timedelta+timezone+to_encode+token+token_data+try+update+user+user_dict+username+utc+verify+verify_password)+.token_type?", - "gbnf": "root ::= (\"ACCESS_TOKEN_EXPIRE_MINUTES\" | \"ALGORITHM\" | \"DUMMY_HASH\" | \"HTTPException\" | \"HTTP_401_UNAUTHORIZED\" | \"InvalidTokenError\" | \"SECRET_KEY\" | \"Token\" | \"TokenData\" | \"UserInDB\" | \"access_token\" | \"access_token_expires\" | \"algorithm\" | \"algorithms\" | \"authenticate_user\" | \"copy\" | \"create_access_token\" | \"credentials\" | \"credentials_exception\" | \"current_user\" | \"data\" | \"datetime\" | \"db\" | \"decode\" | \"detail\" | \"disabled\" | \"else\" | \"encode\" | \"encoded_jwt\" | \"except\" | \"expire\" | \"expires_delta\" | \"fake_db\" | \"fake_decode_token\" | \"fake_users_db\" | \"form_data\" | \"get\" | \"get_user\" | \"hash\" | \"hashed_password\" | \"headers\" | \"if\" | \"in\" | \"is\" | \"jwt\" | \"minutes\" | \"not\" | \"now\" | \"password\" | \"password_hash\" | \"payload\" | \"plain_password\" | \"raise\" | \"return\" | \"scopes\" | \"status\" | \"status_code\" | \"timedelta\" | \"timezone\" | \"to_encode\" | \"token\" | \"token_data\" | \"try\" | \"update\" | \"user\" | \"user_dict\" | \"username\" | \"utc\" | \"verify\" | \"verify_password\")+ \"token_type\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.014285714285714287 }, { "package": "docs_src/separate_openapi_schemas", "ext": ".py", "methods": 4, - "sore": "return.item?.(Item+description+name)+?", - "gbnf": "root ::= \"return\" \"item\"? (\"Item\" | \"description\" | \"name\")*", + "skip": "", + "structure_score": 0.5172413793103449, + "sore": "return.(Item+description+name)+?.item?", + "gbnf": "root ::= \"return\" (\"Item\" | \"description\" | \"name\")* \"item\"?", "gbnf_ok": true }, { "package": "docs_src/server_sent_events", "ext": ".py", "methods": 8, - "sore": "(ServerSentEvent+comment+continue+data+else+enumerate+event+for+i+id+if+in+is+is not+item+items+last_event_id+log_line+logs+not+prompt+raw_data+split+start+str+text+word+words+yield)+.retry?", - "gbnf": "root ::= (\"ServerSentEvent\" | \"comment\" | \"continue\" | \"data\" | \"else\" | \"enumerate\" | \"event\" | \"for\" | \"i\" | \"id\" | \"if\" | \"in\" | \"is\" | \"is not\" | \"item\" | \"items\" | \"last_event_id\" | \"log_line\" | \"logs\" | \"not\" | \"prompt\" | \"raw_data\" | \"split\" | \"start\" | \"str\" | \"text\" | \"word\" | \"words\" | \"yield\")+ \"retry\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.05732484076433121 }, { "package": "docs_src/settings", "ext": ".py", "methods": 5, + "skip": "", + "structure_score": 0.4918032786885246, "sore": "return.(admin_email+app_name+settings)+?.config?.items_per_user?.Settings+?", "gbnf": "root ::= \"return\" (\"admin_email\" | \"app_name\" | \"settings\")* \"config\"? \"items_per_user\"? \"Settings\"*", "gbnf_ok": true @@ -374,34 +409,39 @@ "package": "docs_src/settings/app02_an_py310", "ext": ".py", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "docs_src/settings/app02_py310", "ext": ".py", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "docs_src/sql_databases", "ext": ".py", "methods": 30, - "sore": "SQLModel?.Session+?.create_db_and_tables+?.metadata?.create_all+?.engine?.(HTTPException+Hero+add+all+commit+db_hero+delete+detail+exclude_unset+exec+get+hero+hero_data+hero_db+hero_id+heroes+if+limit+model_dump+model_validate+not+offset+raise+refresh+return+select+session+sqlmodel_update+status_code+yield)+?", - "gbnf": "root ::= \"SQLModel\"? \"Session\"* \"create_db_and_tables\"* \"metadata\"? \"create_all\"* \"engine\"? (\"HTTPException\" | \"Hero\" | \"add\" | \"all\" | \"commit\" | \"db_hero\" | \"delete\" | \"detail\" | \"exclude_unset\" | \"exec\" | \"get\" | \"hero\" | \"hero_data\" | \"hero_db\" | \"hero_id\" | \"heroes\" | \"if\" | \"limit\" | \"model_dump\" | \"model_validate\" | \"not\" | \"offset\" | \"raise\" | \"refresh\" | \"return\" | \"select\" | \"session\" | \"sqlmodel_update\" | \"status_code\" | \"yield\")*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.1946564885496183 }, { "package": "docs_src/stream_data", "ext": ".py", "methods": 14, - "sore": "read_image+?.return?.(chunk+for+from+image_file+in+line+message+splitlines+yield)+?.BytesIO+?.encode+?.binary_image?", - "gbnf": "root ::= \"read_image\"* \"return\"? (\"chunk\" | \"for\" | \"from\" | \"image_file\" | \"in\" | \"line\" | \"message\" | \"splitlines\" | \"yield\")* \"BytesIO\"* \"encode\"* \"binary_image\"?", + "skip": "", + "structure_score": 0.4945054945054945, + "sore": "return?.read_image+?.BytesIO+?.(chunk+for+from+image_file+in+line+message+splitlines+yield)+?.binary_image?.encode+?", + "gbnf": "root ::= \"return\"? \"read_image\"* \"BytesIO\"* (\"chunk\" | \"for\" | \"from\" | \"image_file\" | \"in\" | \"line\" | \"message\" | \"splitlines\" | \"yield\")* \"binary_image\"? \"encode\"*", "gbnf_ok": true }, { "package": "docs_src/stream_json_lines", "ext": ".py", "methods": 4, + "skip": "", + "structure_score": 0.3157894736842105, "sore": "for.(in+item+items+yield)+", "gbnf": "root ::= \"for\" (\"in\" | \"item\" | \"items\" | \"yield\")+", "gbnf_ok": true @@ -410,104 +450,109 @@ "package": "docs_src/websockets_", "ext": ".py", "methods": 15, - "sore": "for?.(WS_1008_POLICY_VIOLATION+WebSocketDisconnect+WebSocketException+accept+active_connections+and+append+await+broadcast+client_id+code+connect+connection+cookie_or_token+data+disconnect+except+if+in+is+is not+manager+not+or+q+raise+receive_text+remove+return+self+send_personal_message+send_text+session+status+token+try+websocket+while)+.HTMLResponse+?.list+?.(item_id+message)?.html?.WebSocket?", - "gbnf": "root ::= \"for\"? (\"WS_1008_POLICY_VIOLATION\" | \"WebSocketDisconnect\" | \"WebSocketException\" | \"accept\" | \"active_connections\" | \"and\" | \"append\" | \"await\" | \"broadcast\" | \"client_id\" | \"code\" | \"connect\" | \"connection\" | \"cookie_or_token\" | \"data\" | \"disconnect\" | \"except\" | \"if\" | \"in\" | \"is\" | \"is not\" | \"manager\" | \"not\" | \"or\" | \"q\" | \"raise\" | \"receive_text\" | \"remove\" | \"return\" | \"self\" | \"send_personal_message\" | \"send_text\" | \"session\" | \"status\" | \"token\" | \"try\" | \"websocket\" | \"while\")+ \"HTMLResponse\"* \"list\"* (\"item_id\" | \"message\")? \"html\"? \"WebSocket\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.13157894736842105 }, { "package": "fastapi", "ext": ".py", "methods": 239, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "fastapi/_compat", "ext": ".py", "methods": 45, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "fastapi/dependencies", "ext": ".py", "methods": 38, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "fastapi/openapi", "ext": ".py", "methods": 19, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "fastapi/security", "ext": ".py", "methods": 34, - "sore": "(APIKey+APIKeyIn+Annotated+Any+Doc+Error+HTTPAuthorizationCredentials+HTTPBaseModel+HTTPBasicCredentials+HTTPBearerModel+HTTPException+HTTP_401_UNAUTHORIZED+OAuth2Model+OAuthFlowsModel+OpenIdConnectModel+UnicodeDecodeError+ValueError+_+__class__+__init__+__name__+and+api_key+authorization+authorizationCode+authorizationUrl+authorization_header_value+auto_error+b64decode+bearerFormat+binascii+cast+check_api_key+client_id+cookie+cookies+credentials+data+decode+description+detail+e+else+except+flows+from+get+get_authorization_scheme_param+grant_type+header+headers+if+join+list+location+lower+make_not_authenticated_error+model+name+not+openIdConnectUrl+or+param+partition+password+query+query_params+raise+realm+refreshUrl+request+return+scheme+scheme_name+scope+scope_str+scopes+self+separator+split+status_code+str+super+tokenUrl+try+username)+.(client_secret+make_authenticate_headers+strip+title)+?", - "gbnf": "root ::= (\"APIKey\" | \"APIKeyIn\" | \"Annotated\" | \"Any\" | \"Doc\" | \"Error\" | \"HTTPAuthorizationCredentials\" | \"HTTPBaseModel\" | \"HTTPBasicCredentials\" | \"HTTPBearerModel\" | \"HTTPException\" | \"HTTP_401_UNAUTHORIZED\" | \"OAuth2Model\" | \"OAuthFlowsModel\" | \"OpenIdConnectModel\" | \"UnicodeDecodeError\" | \"ValueError\" | \"_\" | \"__class__\" | \"__init__\" | \"__name__\" | \"and\" | \"api_key\" | \"authorization\" | \"authorizationCode\" | \"authorizationUrl\" | \"authorization_header_value\" | \"auto_error\" | \"b64decode\" | \"bearerFormat\" | \"binascii\" | \"cast\" | \"check_api_key\" | \"client_id\" | \"cookie\" | \"cookies\" | \"credentials\" | \"data\" | \"decode\" | \"description\" | \"detail\" | \"e\" | \"else\" | \"except\" | \"flows\" | \"from\" | \"get\" | \"get_authorization_scheme_param\" | \"grant_type\" | \"header\" | \"headers\" | \"if\" | \"join\" | \"list\" | \"location\" | \"lower\" | \"make_not_authenticated_error\" | \"model\" | \"name\" | \"not\" | \"openIdConnectUrl\" | \"or\" | \"param\" | \"partition\" | \"password\" | \"query\" | \"query_params\" | \"raise\" | \"realm\" | \"refreshUrl\" | \"request\" | \"return\" | \"scheme\" | \"scheme_name\" | \"scope\" | \"scope_str\" | \"scopes\" | \"self\" | \"separator\" | \"split\" | \"status_code\" | \"str\" | \"super\" | \"tokenUrl\" | \"try\" | \"username\")+ (\"client_secret\" | \"make_authenticate_headers\" | \"strip\" | \"title\")*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.014814814814814815 }, { "package": "scripts", "ext": ".py", "methods": 132, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "scripts/playwright", "ext": ".py", "methods": 7, - "sore": "(browser+chromium+click+close+context+get_by_label+get_by_role+goto+headless+launch+name+new_context+new_page+page+path+playwright+screenshot+viewport)+", - "gbnf": "root ::= (\"browser\" | \"chromium\" | \"click\" | \"close\" | \"context\" | \"get_by_label\" | \"get_by_role\" | \"goto\" | \"headless\" | \"launch\" | \"name\" | \"new_context\" | \"new_page\" | \"page\" | \"path\" | \"playwright\" | \"screenshot\" | \"viewport\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.022727272727272728 }, { "package": "scripts/playwright/separate_openapi_schemas", "ext": ".py", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "scripts/tests/test_translation_fixer", "ext": ".py", "methods": 12, - "sore": "changing_dir+?.tmp_path?.(Path+THIS_DIR+chdir+cli+copy+data_path+directory+docs_dir+en_docs_dir+en_file_path+exist_ok+exit_code+expected_content+finally+fixed_content+for+fspath+getcwd+if+in+initial_dir+invoke+is_relative_to+item+item_path+items+lang_docs_dir+mkdir+os+output+param+parents+platform+read_text+request+resolve+result+return+root_dir+runner+shutil+str+sys+translation_file_path+try+yield)+.add_marker+?.(CliRunner+cwd)+?.skip_on_windows?", - "gbnf": "root ::= \"changing_dir\"* \"tmp_path\"? (\"Path\" | \"THIS_DIR\" | \"chdir\" | \"cli\" | \"copy\" | \"data_path\" | \"directory\" | \"docs_dir\" | \"en_docs_dir\" | \"en_file_path\" | \"exist_ok\" | \"exit_code\" | \"expected_content\" | \"finally\" | \"fixed_content\" | \"for\" | \"fspath\" | \"getcwd\" | \"if\" | \"in\" | \"initial_dir\" | \"invoke\" | \"is_relative_to\" | \"item\" | \"item_path\" | \"items\" | \"lang_docs_dir\" | \"mkdir\" | \"os\" | \"output\" | \"param\" | \"parents\" | \"platform\" | \"read_text\" | \"request\" | \"resolve\" | \"result\" | \"return\" | \"root_dir\" | \"runner\" | \"shutil\" | \"str\" | \"sys\" | \"translation_file_path\" | \"try\" | \"yield\")+ \"add_marker\"* (\"CliRunner\" | \"cwd\")* \"skip_on_windows\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.10852713178294573 }, { "package": "scripts/tests/test_translation_fixer/test_code_blocks", "ext": ".py", "methods": 8, - "sore": "(Path+cli+data_path+exit_code+expected_content+fixed_content+in+invoke+not+not in+output+read_text+result+root_dir+runner)+", - "gbnf": "root ::= (\"Path\" | \"cli\" | \"data_path\" | \"exit_code\" | \"expected_content\" | \"fixed_content\" | \"in\" | \"invoke\" | \"not\" | \"not in\" | \"output\" | \"read_text\" | \"result\" | \"root_dir\" | \"runner\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.02830188679245283 }, { "package": "scripts/tests/test_translation_fixer/test_header_permalinks", "ext": ".py", "methods": 4, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "tests", "ext": ".py", "methods": 2036, - "sore": "(@+FastAPI+TestClient+app+client+data+def+get+headers+in+json+post+pytest+raises+response+return+status_code+str+text+value+yield)+.snapshot+?", - "gbnf": "root ::= (\"@\" | \"FastAPI\" | \"TestClient\" | \"app\" | \"client\" | \"data\" | \"def\" | \"get\" | \"headers\" | \"in\" | \"json\" | \"post\" | \"pytest\" | \"raises\" | \"response\" | \"return\" | \"status_code\" | \"str\" | \"text\" | \"value\" | \"yield\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.10344827586206896 }, { "package": "tests/benchmarks", "ext": ".py", "methods": 48, - "sore": "(LARGE_PAYLOAD+_bench_get+_bench_post_json+benchmark+body+bytes+client+content+def+do_request+get+int+json+path+post+response+return+status_code+tuple+warmup)+.ItemOut+?._expected_large_payload_json_bytes+?.len+?.LargeOut+?.(item+name+value)+?.payload?.dep+?.items?.LARGE_ITEMS?.metadata?.LARGE_METADATA?", - "gbnf": "root ::= (\"LARGE_PAYLOAD\" | \"_bench_get\" | \"_bench_post_json\" | \"benchmark\" | \"body\" | \"bytes\" | \"client\" | \"content\" | \"def\" | \"do_request\" | \"get\" | \"int\" | \"json\" | \"path\" | \"post\" | \"response\" | \"return\" | \"status_code\" | \"tuple\" | \"warmup\")+ \"ItemOut\"* \"_expected_large_payload_json_bytes\"* \"len\"* \"LargeOut\"* (\"item\" | \"name\" | \"value\")* \"payload\"? \"dep\"* \"items\"? \"LARGE_ITEMS\"? \"metadata\"? \"LARGE_METADATA\"?", + "skip": "", + "structure_score": 0.34800000000000003, + "sore": "(LARGE_PAYLOAD+_bench_get+_bench_post_json+benchmark+body+bytes+client+content+def+do_request+get+int+json+path+post+response+return+status_code+tuple+warmup)+.ItemOut+?.LargeOut+?.len+?._expected_large_payload_json_bytes+?.(item+name+value)+?.payload?.dep+?.items?.LARGE_ITEMS?.metadata?.LARGE_METADATA?", + "gbnf": "root ::= (\"LARGE_PAYLOAD\" | \"_bench_get\" | \"_bench_post_json\" | \"benchmark\" | \"body\" | \"bytes\" | \"client\" | \"content\" | \"def\" | \"do_request\" | \"get\" | \"int\" | \"json\" | \"path\" | \"post\" | \"response\" | \"return\" | \"status_code\" | \"tuple\" | \"warmup\")+ \"ItemOut\"* \"LargeOut\"* \"len\"* \"_expected_large_payload_json_bytes\"* (\"item\" | \"name\" | \"value\")* \"payload\"? \"dep\"* \"items\"? \"LARGE_ITEMS\"? \"metadata\"? \"LARGE_METADATA\"?", "gbnf_ok": true }, { "package": "tests/test_modules_same_name_body", "ext": ".py", "methods": 5, + "skip": "", + "structure_score": 0.515625, "sore": "(client+data+get+json+path+post+response+status_code+text)+?.return?.snapshot+?.a?.b?", "gbnf": "root ::= (\"client\" | \"data\" | \"get\" | \"json\" | \"path\" | \"post\" | \"response\" | \"status_code\" | \"text\")* \"return\"? \"snapshot\"* \"a\"? \"b\"?", "gbnf_ok": true @@ -516,22 +561,28 @@ "package": "tests/test_request_params/test_body", "ext": ".py", "methods": 113, - "sore": "(TestClient+app+body_model_name+client+get_body_model_name+json+openapi+path+post+response+status_code+text)+?.return?.IsOneOf+?.p+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"body_model_name\" | \"client\" | \"get_body_model_name\" | \"json\" | \"openapi\" | \"path\" | \"post\" | \"response\" | \"status_code\" | \"text\")* \"return\"? \"IsOneOf\"* \"p\"*", + "skip": "", + "structure_score": 0.27522935779816515, + "sore": "(TestClient+app+body_model_name+client+get_body_model_name+json+openapi+path+post+response+status_code+text)+?.IsOneOf+?.return?.p+?", + "gbnf": "root ::= (\"TestClient\" | \"app\" | \"body_model_name\" | \"client\" | \"get_body_model_name\" | \"json\" | \"openapi\" | \"path\" | \"post\" | \"response\" | \"status_code\" | \"text\")* \"IsOneOf\"* \"return\"? \"p\"*", "gbnf_ok": true }, { "package": "tests/test_request_params/test_cookie", "ext": ".py", "methods": 48, - "sore": "(TestClient+app+client+cookies+get+openapi+path+response+set+status_code+text)+?.return?.json+?.snapshot+?.p+?.IsOneOf+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"cookies\" | \"get\" | \"openapi\" | \"path\" | \"response\" | \"set\" | \"status_code\" | \"text\")* \"return\"? \"json\"* \"snapshot\"* \"p\"* \"IsOneOf\"*", + "skip": "", + "structure_score": 0.5217391304347826, + "sore": "(TestClient+app+client+cookies+get+openapi+path+response+set+status_code+text)+?.return?.snapshot+?.json+?.p+?.IsOneOf+?", + "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"cookies\" | \"get\" | \"openapi\" | \"path\" | \"response\" | \"set\" | \"status_code\" | \"text\")* \"return\"? \"snapshot\"* \"json\"* \"p\"* \"IsOneOf\"*", "gbnf_ok": true }, { "package": "tests/test_request_params/test_file", "ext": ".py", "methods": 97, + "skip": "", + "structure_score": 0.3488372093023256, "sore": "(TestClient+app+body_model_name+client+files+get_body_model_name+openapi+path+post+response+status_code+text)+?.json+?.return?.len+?.(file+for+if+in+p+size)+?.else?", "gbnf": "root ::= (\"TestClient\" | \"app\" | \"body_model_name\" | \"client\" | \"files\" | \"get_body_model_name\" | \"openapi\" | \"path\" | \"post\" | \"response\" | \"status_code\" | \"text\")* \"json\"* \"return\"? \"len\"* (\"file\" | \"for\" | \"if\" | \"in\" | \"p\" | \"size\")* \"else\"?", "gbnf_ok": true @@ -540,6 +591,8 @@ "package": "tests/test_request_params/test_form", "ext": ".py", "methods": 97, + "skip": "", + "structure_score": 0.34513274336283184, "sore": "(TestClient+app+body_model_name+client+data+get_body_model_name+openapi+path+post+response+status_code+text)+?.json+?.return?.IsOneOf+?.p+?", "gbnf": "root ::= (\"TestClient\" | \"app\" | \"body_model_name\" | \"client\" | \"data\" | \"get_body_model_name\" | \"openapi\" | \"path\" | \"post\" | \"response\" | \"status_code\" | \"text\")* \"json\"* \"return\"? \"IsOneOf\"* \"p\"*", "gbnf_ok": true @@ -548,38 +601,45 @@ "package": "tests/test_request_params/test_header", "ext": ".py", "methods": 96, - "sore": "(TestClient+app+client+get+headers+openapi+path+response+status_code+text)+?.return?.json+?.snapshot+?.p+?.AnyThing?.IsOneOf+?.IsPartialDict+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"headers\" | \"openapi\" | \"path\" | \"response\" | \"status_code\" | \"text\")* \"return\"? \"json\"* \"snapshot\"* \"p\"* \"AnyThing\"? \"IsOneOf\"* \"IsPartialDict\"*", + "skip": "", + "structure_score": 0.5727272727272728, + "sore": "(TestClient+app+client+get+headers+openapi+path+response+status_code+text)+?.return?.snapshot+?.json+?.p+?.IsOneOf+?.AnyThing?.IsPartialDict+?", + "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"headers\" | \"openapi\" | \"path\" | \"response\" | \"status_code\" | \"text\")* \"return\"? \"snapshot\"* \"json\"* \"p\"* \"IsOneOf\"* \"AnyThing\"? \"IsPartialDict\"*", "gbnf_ok": true }, { "package": "tests/test_request_params/test_path", "ext": ".py", "methods": 6, - "sore": "(TestClient+app+client+get+openapi+path+response+status_code+text)+?.return?.json+?.snapshot+?.p?.(Is+expected_title)+?.expected_name?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"openapi\" | \"path\" | \"response\" | \"status_code\" | \"text\")* \"return\"? \"json\"* \"snapshot\"* \"p\"? (\"Is\" | \"expected_title\")* \"expected_name\"?", + "skip": "", + "structure_score": 0.4903846153846154, + "sore": "(TestClient+app+client+get+openapi+path+response+status_code+text)+?.return?.snapshot+?.json+?.p?.(Is+expected_title)+?.expected_name?", + "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"openapi\" | \"path\" | \"response\" | \"status_code\" | \"text\")* \"return\"? \"snapshot\"* \"json\"* \"p\"? (\"Is\" | \"expected_title\")* \"expected_name\"?", "gbnf_ok": true }, { "package": "tests/test_request_params/test_query", "ext": ".py", "methods": 96, - "sore": "(TestClient+app+client+get+openapi+path+response+status_code+text)+?.return?.json+?.snapshot+?.p+?.IsOneOf+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"openapi\" | \"path\" | \"response\" | \"status_code\" | \"text\")* \"return\"? \"json\"* \"snapshot\"* \"p\"* \"IsOneOf\"*", + "skip": "", + "structure_score": 0.5853658536585367, + "sore": "(TestClient+app+client+get+openapi+path+response+status_code+text)+?.return?.snapshot+?.json+?.p+?.IsOneOf+?", + "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"openapi\" | \"path\" | \"response\" | \"status_code\" | \"text\")* \"return\"? \"snapshot\"* \"json\"* \"p\"* \"IsOneOf\"*", "gbnf_ok": true }, { "package": "tests/test_tutorial", "ext": ".py", "methods": 16, - "sore": "(TestClient+app+client+content+copytree+docs_src+from+get+headers+if+import+in+isdir+json+not+not in+openapi_schema+options+os+path+post+print+put+response+rmtree+shutil+snapshot+status_code+templates+text+tutorial001_py310)+?.await?.cookies?.test_root+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"content\" | \"copytree\" | \"docs_src\" | \"from\" | \"get\" | \"headers\" | \"if\" | \"import\" | \"in\" | \"isdir\" | \"json\" | \"not\" | \"not in\" | \"openapi_schema\" | \"options\" | \"os\" | \"path\" | \"post\" | \"print\" | \"put\" | \"response\" | \"rmtree\" | \"shutil\" | \"snapshot\" | \"status_code\" | \"templates\" | \"text\" | \"tutorial001_py310\")* \"await\"? \"cookies\"? \"test_root\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.1267605633802817 }, { "package": "tests/test_tutorial/test_additional_responses", "ext": ".py", "methods": 14, + "skip": "", + "structure_score": 0.40714285714285714, "sore": "shutil?.copy+?.(TestClient+app+clear+client+get+headers+import_module+importlib+len+mod+param+request+response+return+status_code+text)+.json+?.content?.snapshot+?.os?.remove+?", "gbnf": "root ::= \"shutil\"? \"copy\"* (\"TestClient\" | \"app\" | \"clear\" | \"client\" | \"get\" | \"headers\" | \"import_module\" | \"importlib\" | \"len\" | \"mod\" | \"param\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"json\"* \"content\"? \"snapshot\"* \"os\"? \"remove\"*", "gbnf_ok": true @@ -588,26 +648,29 @@ "package": "tests/test_tutorial/test_additional_status_codes", "ext": ".py", "methods": 3, - "sore": "(TestClient+app+client+import_module+importlib+json+mod+param+put+request+response+return+status_code+text)+", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"put\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.03260869565217391 }, { "package": "tests/test_tutorial/test_advanced_middleware", "ext": ".py", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_authentication_error_status_code", "ext": ".py", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_background_tasks", "ext": ".py", "methods": 3, + "skip": "", + "structure_score": 0.375, "sore": "(Path+if+is_file+log+os+remove)+?.(TestClient+app+client+import_module+importlib+mod+param+post+request+response+return+status_code+text)+.json+?.open+?.(f+in)+?.read+?", "gbnf": "root ::= (\"Path\" | \"if\" | \"is_file\" | \"log\" | \"os\" | \"remove\")* (\"TestClient\" | \"app\" | \"client\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"post\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"json\"* \"open\"* (\"f\" | \"in\")* \"read\"*", "gbnf_ok": true @@ -616,22 +679,25 @@ "package": "tests/test_tutorial/test_behind_a_proxy", "ext": ".py", "methods": 10, - "sore": "(client+get+response+status_code)+.headers?.json+?.snapshot+?", - "gbnf": "root ::= (\"client\" | \"get\" | \"response\" | \"status_code\")+ \"headers\"? \"json\"* \"snapshot\"*", + "skip": "", + "structure_score": 0.574468085106383, + "sore": "(client+get+response+status_code)+.json+?.headers?.snapshot+?", + "gbnf": "root ::= (\"client\" | \"get\" | \"response\" | \"status_code\")+ \"json\"* \"headers\"? \"snapshot\"*", "gbnf_ok": true }, { "package": "tests/test_tutorial/test_bigger_applications", "ext": ".py", "methods": 26, - "sore": "(TestClient+app+client+get+headers+import_module+importlib+mod+param+post+put+request+response+return+status_code+text)+.json+?.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"headers\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"post\" | \"put\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"json\"* \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.18421052631578946 }, { "package": "tests/test_tutorial/test_body", "ext": ".py", "methods": 32, + "skip": "", + "structure_score": 0.2236024844720497, "sore": "patch+?.side_effect?.Exception+?.(TestClient+app+client+content+data+get+headers+import_module+importlib+json+mod+param+params+post+price+put+request+response+return+status_code+text)+.snapshot+?", "gbnf": "root ::= \"patch\"* \"side_effect\"? \"Exception\"* (\"TestClient\" | \"app\" | \"client\" | \"content\" | \"data\" | \"get\" | \"headers\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"params\" | \"post\" | \"price\" | \"put\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"snapshot\"*", "gbnf_ok": true @@ -640,44 +706,43 @@ "package": "tests/test_tutorial/test_body_fields", "ext": ".py", "methods": 5, - "sore": "(TestClient+app+client+get+import_module+importlib+json+mod+param+put+request+response+return+status_code+text)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"put\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.11650485436893203 }, { "package": "tests/test_tutorial/test_body_multiple_params", "ext": ".py", "methods": 35, - "sore": "(TestClient+app+client+get+import_module+importlib+json+mod+param+params+put+request+response+return+status_code+text)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"params\" | \"put\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.11009174311926606 }, { "package": "tests/test_tutorial/test_body_nested_models", "ext": ".py", "methods": 44, - "sore": "if?.(IsList+TestClient+app+check_order+client+data+get+import_module+importlib+json+mod+mod_name+param+post+put+request+response+return+startswith+status_code+text)+.snapshot+?", - "gbnf": "root ::= \"if\"? (\"IsList\" | \"TestClient\" | \"app\" | \"check_order\" | \"client\" | \"data\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"mod_name\" | \"param\" | \"post\" | \"put\" | \"request\" | \"response\" | \"return\" | \"startswith\" | \"status_code\" | \"text\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.12162162162162163 }, { "package": "tests/test_tutorial/test_body_updates", "ext": ".py", "methods": 9, - "sore": "(TestClient+app+client+get+import_module+importlib+json+mod+param+patch+put+request+response+return+status_code+text)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"patch\" | \"put\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.1111111111111111 }, { "package": "tests/test_tutorial/test_conditional_openapi", "ext": ".py", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_configure_swagger_ui", "ext": ".py", "methods": 6, + "skip": "", + "structure_score": 0.2553191489361702, "sore": "(client+get+in+not+not in+response+status_code+text)+.json+?", "gbnf": "root ::= (\"client\" | \"get\" | \"in\" | \"not\" | \"not in\" | \"response\" | \"status_code\" | \"text\")+ \"json\"*", "gbnf_ok": true @@ -686,72 +751,71 @@ "package": "tests/test_tutorial/test_cookie_param_models", "ext": ".py", "methods": 12, - "sore": "(TestClient+app+c+client+cookies+get+import_module+importlib+mod+param+request+response+return+set+status_code+text)+.json+?.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"c\" | \"client\" | \"cookies\" | \"get\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"request\" | \"response\" | \"return\" | \"set\" | \"status_code\" | \"text\")+ \"json\"* \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.18918918918918917 }, { "package": "tests/test_tutorial/test_cookie_params", "ext": ".py", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_custom_docs_ui", "ext": ".py", "methods": 10, - "sore": "(Path+TestClient+app+client+custom_docs_ui+docs_src+exist_ok+from+get+getcwd+import+in+mkdir+os+print+response+static_dir+status_code+text+tutorial001_py310+tutorial002_py310+yield)+.(json+rmdir)+?", - "gbnf": "root ::= (\"Path\" | \"TestClient\" | \"app\" | \"client\" | \"custom_docs_ui\" | \"docs_src\" | \"exist_ok\" | \"from\" | \"get\" | \"getcwd\" | \"import\" | \"in\" | \"mkdir\" | \"os\" | \"print\" | \"response\" | \"static_dir\" | \"status_code\" | \"text\" | \"tutorial001_py310\" | \"tutorial002_py310\" | \"yield\")+ (\"json\" | \"rmdir\")*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.07185628742514971 }, { "package": "tests/test_tutorial/test_custom_request_and_route", "ext": ".py", "methods": 10, - "sore": "(@+Request+TestClient+__name__+app+async+body+check_gzip_request+client+compress+content+data+def+dumps+encode+float+get+gzip+headers+if+import_module+importlib+in+json+mod+n+not+not in+param+post+request+response+return+type)+.IsOneOf+?", - "gbnf": "root ::= (\"@\" | \"Request\" | \"TestClient\" | \"__name__\" | \"app\" | \"async\" | \"body\" | \"check_gzip_request\" | \"client\" | \"compress\" | \"content\" | \"data\" | \"def\" | \"dumps\" | \"encode\" | \"float\" | \"get\" | \"gzip\" | \"headers\" | \"if\" | \"import_module\" | \"importlib\" | \"in\" | \"json\" | \"mod\" | \"n\" | \"not\" | \"not in\" | \"param\" | \"post\" | \"request\" | \"response\" | \"return\" | \"type\")+ \"IsOneOf\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.06060606060606061 }, { "package": "tests/test_tutorial/test_custom_response", "ext": ".py", "methods": 25, - "sore": "if?.(Any+Is+Path+TestClient+app+cast+client+content+else+fake_content+file_path+follow_redirects+get+import_module+importlib+json+mod+mod_name+param+request+response+response_content+return+snapshot+some_file_path+startswith+status_code+str+test_content+text+tmp_path+tutorial008_py310+tutorial009_py310+tutorial009b_py310+write_bytes)+.(headers+html_contents)?", - "gbnf": "root ::= \"if\"? (\"Any\" | \"Is\" | \"Path\" | \"TestClient\" | \"app\" | \"cast\" | \"client\" | \"content\" | \"else\" | \"fake_content\" | \"file_path\" | \"follow_redirects\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"mod_name\" | \"param\" | \"request\" | \"response\" | \"response_content\" | \"return\" | \"snapshot\" | \"some_file_path\" | \"startswith\" | \"status_code\" | \"str\" | \"test_content\" | \"text\" | \"tmp_path\" | \"tutorial008_py310\" | \"tutorial009_py310\" | \"tutorial009b_py310\" | \"write_bytes\")+ (\"headers\" | \"html_contents\")?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.0473186119873817 }, { "package": "tests/test_tutorial/test_dataclasses", "ext": ".py", "methods": 11, - "sore": "(TestClient+app+clear+client+get+headers+import_module+importlib+json+mod+param+post+request+response+return+status_code)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"clear\" | \"client\" | \"get\" | \"headers\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"post\" | \"request\" | \"response\" | \"return\" | \"status_code\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.10714285714285714 }, { "package": "tests/test_tutorial/test_debugging", "ext": ".py", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_dependencies", "ext": ".py", "methods": 51, - "sore": "(@+Annotated+Any+Depends+FastAPI+Mock+TestClient+app+async+asynccontextmanager+c+client+cm+create+db_session+def+exc_info+expected_status+get+get_db+headers+import_module+importlib+is+json+mod+param+patch+path+pytest+raise_server_exceptions+raises+read_root+request+response+return+return_value+status_code+str+text+value)+.(args+expected_response+snapshot)+?", - "gbnf": "root ::= (\"@\" | \"Annotated\" | \"Any\" | \"Depends\" | \"FastAPI\" | \"Mock\" | \"TestClient\" | \"app\" | \"async\" | \"asynccontextmanager\" | \"c\" | \"client\" | \"cm\" | \"create\" | \"db_session\" | \"def\" | \"exc_info\" | \"expected_status\" | \"get\" | \"get_db\" | \"headers\" | \"import_module\" | \"importlib\" | \"is\" | \"json\" | \"mod\" | \"param\" | \"patch\" | \"path\" | \"pytest\" | \"raise_server_exceptions\" | \"raises\" | \"read_root\" | \"request\" | \"response\" | \"return\" | \"return_value\" | \"status_code\" | \"str\" | \"text\" | \"value\")+ (\"args\" | \"expected_response\" | \"snapshot\")*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.03883495145631068 }, { "package": "tests/test_tutorial/test_encoder", "ext": ".py", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_events", "ext": ".py", "methods": 8, + "skip": "", + "structure_score": 0.47663551401869153, "sore": "pytest?.warns+?.DeprecationWarning+?.from?.docs_src+?.events+?.(tutorial001_py310+tutorial002_py310)+?.import?.(TestClient+app+client+fake_answer_to_everything_ml_model+get+json+ml_models+not+params+response+status_code+text+yield)+.snapshot+?.open+?.(in+log)+?.read+?", "gbnf": "root ::= \"pytest\"? \"warns\"* \"DeprecationWarning\"* \"from\"? \"docs_src\"* \"events\"* (\"tutorial001_py310\" | \"tutorial002_py310\")* \"import\"? (\"TestClient\" | \"app\" | \"client\" | \"fake_answer_to_everything_ml_model\" | \"get\" | \"json\" | \"ml_models\" | \"not\" | \"params\" | \"response\" | \"status_code\" | \"text\" | \"yield\")+ \"snapshot\"* \"open\"* (\"in\" | \"log\")* \"read\"*", "gbnf_ok": true @@ -760,12 +824,15 @@ "package": "tests/test_tutorial/test_extra_data_types", "ext": ".py", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_extra_models", "ext": ".py", "methods": 13, + "skip": "", + "structure_score": 0.2231404958677686, "sore": "(TestClient+app+client+get+import_module+importlib+json+mod+param+post+request+response+return+status_code+text)+.snapshot+?.IsList+?.check_order?", "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"post\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"snapshot\"* \"IsList\"* \"check_order\"?", "gbnf_ok": true @@ -774,34 +841,36 @@ "package": "tests/test_tutorial/test_first_steps", "ext": ".py", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_generate_clients", "ext": ".py", "methods": 13, - "sore": "(TestClient+app+client+dumps+get+import_module+importlib+json+loads+mod+modified_openapi+openapi+openapi_json+param+patch+post+read_text+request+response+return+return_value+status_code+text+tmp_file+tmp_path+tutorial003_py310+write_text)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"dumps\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"loads\" | \"mod\" | \"modified_openapi\" | \"openapi\" | \"openapi_json\" | \"param\" | \"patch\" | \"post\" | \"read_text\" | \"request\" | \"response\" | \"return\" | \"return_value\" | \"status_code\" | \"text\" | \"tmp_file\" | \"tmp_path\" | \"tutorial003_py310\" | \"write_text\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.05504587155963303 }, { "package": "tests/test_tutorial/test_graphql", "ext": ".py", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_handling_errors", "ext": ".py", "methods": 20, - "sore": "(client+data+get+headers+in+is+json+post+response+status_code+text)+.(content+snapshot)+?", - "gbnf": "root ::= (\"client\" | \"data\" | \"get\" | \"headers\" | \"in\" | \"is\" | \"json\" | \"post\" | \"response\" | \"status_code\" | \"text\")+ (\"content\" | \"snapshot\")*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.17142857142857143 }, { "package": "tests/test_tutorial/test_header_param_models", "ext": ".py", "methods": 19, + "skip": "", + "structure_score": 0.25210084033613445, "sore": "(TestClient+app+clear+client+get+headers+import_module+importlib+mod+param+request+response+return+status_code+text)+.json+?.snapshot+?.IsOneOf+?", "gbnf": "root ::= (\"TestClient\" | \"app\" | \"clear\" | \"client\" | \"get\" | \"headers\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"json\"* \"snapshot\"* \"IsOneOf\"*", "gbnf_ok": true @@ -810,22 +879,22 @@ "package": "tests/test_tutorial/test_header_params", "ext": ".py", "methods": 9, - "sore": "(TestClient+app+client+expected_status+get+headers+import_module+importlib+mod+param+path+request+response+return+status_code)+.json+?.(expected_response+snapshot)+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"expected_status\" | \"get\" | \"headers\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"path\" | \"request\" | \"response\" | \"return\" | \"status_code\")+ \"json\"* (\"expected_response\" | \"snapshot\")*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.1510791366906475 }, { "package": "tests/test_tutorial/test_json_base64_bytes", "ext": ".py", "methods": 5, - "sore": "(TestClient+app+client+get+import_module+importlib+json+mod+param+post+request+response+return+status_code+text)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"post\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.11538461538461539 }, { "package": "tests/test_tutorial/test_metadata", "ext": ".py", "methods": 14, + "skip": "", + "structure_score": 0.4565217391304348, "sore": "(client+get+in+response+status_code+text)+.json+?.snapshot+?", "gbnf": "root ::= (\"client\" | \"get\" | \"in\" | \"response\" | \"status_code\" | \"text\")+ \"json\"* \"snapshot\"*", "gbnf_ok": true @@ -834,32 +903,36 @@ "package": "tests/test_tutorial/test_openapi_callbacks", "ext": ".py", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_openapi_webhooks", "ext": ".py", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_path_operation_advanced_configurations", "ext": ".py", "methods": 18, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_path_operation_configurations", "ext": ".py", "methods": 20, - "sore": "(DESCRIPTIONS+Is+TestClient+app+client+expected_status+get+import_module+importlib+json+mod+mod_name+param+path+post+request+response+return+snapshot+status_code+text)+.expected_response?.IsList+?.check_order?", - "gbnf": "root ::= (\"DESCRIPTIONS\" | \"Is\" | \"TestClient\" | \"app\" | \"client\" | \"expected_status\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"mod_name\" | \"param\" | \"path\" | \"post\" | \"request\" | \"response\" | \"return\" | \"snapshot\" | \"status_code\" | \"text\")+ \"expected_response\"? \"IsList\"* \"check_order\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.1340782122905028 }, { "package": "tests/test_tutorial/test_path_params", "ext": ".py", "methods": 18, + "skip": "", + "structure_score": 0.4444444444444444, "sore": "(client+content+get+item_id+print+response+status_code+text+user_id)+?.asyncio?.json+?.run+?.(expected_response+snapshot)+?.read_users2+?", "gbnf": "root ::= (\"client\" | \"content\" | \"get\" | \"item_id\" | \"print\" | \"response\" | \"status_code\" | \"text\" | \"user_id\")* \"asyncio\"? \"json\"* \"run\"* (\"expected_response\" | \"snapshot\")* \"read_users2\"*", "gbnf_ok": true @@ -868,6 +941,8 @@ "package": "tests/test_tutorial/test_path_params_numeric_validations", "ext": ".py", "methods": 29, + "skip": "", + "structure_score": 0.3223140495867769, "sore": "(TestClient+import_module+importlib+mod+param+request+return)+?.(client+get+path+response+status_code+text)+?.app?.json+?.(expected_response+snapshot)+?", "gbnf": "root ::= (\"TestClient\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"request\" | \"return\")* (\"client\" | \"get\" | \"path\" | \"response\" | \"status_code\" | \"text\")* \"app\"? \"json\"* (\"expected_response\" | \"snapshot\")*", "gbnf_ok": true @@ -876,164 +951,158 @@ "package": "tests/test_tutorial/test_python_types", "ext": ".py", "methods": 15, - "sore": "(get_items+res)+?.(import_module+importlib+mod+param+request+return)+?.say_hello+?.get_person_name+?.pytest?.patch+?.Person+?.raises+?.(arg+args+call_args+call_args_list+call_count+for+in+items_s+items_t+mock_print+module+module_name+process_item+process_items+run_module+run_name+runpy+say_hi+str)+?.TypeError+?.assert_called_with+?.get_name_with_age+?", - "gbnf": "root ::= (\"get_items\" | \"res\")* (\"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"request\" | \"return\")* \"say_hello\"* \"get_person_name\"* \"pytest\"? \"patch\"* \"Person\"* \"raises\"* (\"arg\" | \"args\" | \"call_args\" | \"call_args_list\" | \"call_count\" | \"for\" | \"in\" | \"items_s\" | \"items_t\" | \"mock_print\" | \"module\" | \"module_name\" | \"process_item\" | \"process_items\" | \"run_module\" | \"run_name\" | \"runpy\" | \"say_hi\" | \"str\")* \"TypeError\"* \"assert_called_with\"* \"get_name_with_age\"*", + "skip": "", + "structure_score": 0.3529411764705882, + "sore": "(import_module+importlib+mod+param+request+return)+?.(get_items+res)+?.get_person_name+?.pytest?.patch+?.say_hello+?.Person+?.raises+?.(arg+args+call_args+call_args_list+call_count+for+in+items_s+items_t+mock_print+module+module_name+process_item+process_items+run_module+run_name+runpy+say_hi+str)+?.TypeError+?.assert_called_with+?.get_name_with_age+?", + "gbnf": "root ::= (\"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"request\" | \"return\")* (\"get_items\" | \"res\")* \"get_person_name\"* \"pytest\"? \"patch\"* \"say_hello\"* \"Person\"* \"raises\"* (\"arg\" | \"args\" | \"call_args\" | \"call_args_list\" | \"call_count\" | \"for\" | \"in\" | \"items_s\" | \"items_t\" | \"mock_print\" | \"module\" | \"module_name\" | \"process_item\" | \"process_items\" | \"run_module\" | \"run_name\" | \"runpy\" | \"say_hi\" | \"str\")* \"TypeError\"* \"assert_called_with\"* \"get_name_with_age\"*", "gbnf_ok": true }, { "package": "tests/test_tutorial/test_query_param_models", "ext": ".py", "methods": 12, - "sore": "(TestClient+app+client+get+import_module+importlib+mod+param+params+request+response+return+status_code+text)+.json+?.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"params\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"json\"* \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.19811320754716982 }, { "package": "tests/test_tutorial/test_query_params", "ext": ".py", "methods": 19, - "sore": "(TestClient+app+c+client+get+import_module+importlib+mod+param+path+request+response+return+status_code)+.json+?.(expected_json+snapshot)+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"c\" | \"client\" | \"get\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"path\" | \"request\" | \"response\" | \"return\" | \"status_code\")+ \"json\"* (\"expected_json\" | \"snapshot\")*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.18421052631578946 }, { "package": "tests/test_tutorial/test_query_params_str_validations", "ext": ".py", "methods": 81, - "sore": "(TestClient+app+client+get+import_module+importlib+mod+param+params+request+response+return+status_code+text+url)+.json+?.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"params\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\" | \"url\")+ \"json\"* \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.1926605504587156 }, { "package": "tests/test_tutorial/test_request_files", "ext": ".py", "methods": 31, - "sore": "(TestClient+app+client+default_pydantic_max_size+file+file2+files+get+import_module+importlib+in+json+mod+open+param+path+path2+post+request+response+return+status_code+text+tmp_path+write_bytes)+.(content+snapshot)+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"default_pydantic_max_size\" | \"file\" | \"file2\" | \"files\" | \"get\" | \"import_module\" | \"importlib\" | \"in\" | \"json\" | \"mod\" | \"open\" | \"param\" | \"path\" | \"path2\" | \"post\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\" | \"tmp_path\" | \"write_bytes\")+ (\"content\" | \"snapshot\")*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.06521739130434782 }, { "package": "tests/test_tutorial/test_request_form_models", "ext": ".py", "methods": 15, - "sore": "(TestClient+app+client+data+get+import_module+importlib+json+mod+param+post+request+response+return+status_code+text)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"data\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"post\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.1111111111111111 }, { "package": "tests/test_tutorial/test_request_forms", "ext": ".py", "methods": 7, - "sore": "(TestClient+app+client+data+get+import_module+importlib+json+mod+param+post+request+response+return+status_code+text)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"data\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"post\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.1111111111111111 }, { "package": "tests/test_tutorial/test_request_forms_and_files", "ext": ".py", "methods": 8, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_response_directly", "ext": ".py", "methods": 6, - "sore": "(TestClient+app+client+expected_content+get+headers+import_module+importlib+json+mod+param+put+request+response+return+status_code+text)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"expected_content\" | \"get\" | \"headers\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"put\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.09523809523809523 }, { "package": "tests/test_tutorial/test_response_model", "ext": ".py", "methods": 35, - "sore": "pytest?.raises+?.FastAPIError?.(TestClient+app+client+follow_redirects+get+import_module+importlib+item_data+json+mod+param+params+post+request+response+return+status_code+text+url+user_data)+.(data+headers+module_name+snapshot)+?", - "gbnf": "root ::= \"pytest\"? \"raises\"* \"FastAPIError\"? (\"TestClient\" | \"app\" | \"client\" | \"follow_redirects\" | \"get\" | \"import_module\" | \"importlib\" | \"item_data\" | \"json\" | \"mod\" | \"param\" | \"params\" | \"post\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\" | \"url\" | \"user_data\")+ (\"data\" | \"headers\" | \"module_name\" | \"snapshot\")*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.17098445595854922 }, { "package": "tests/test_tutorial/test_response_status_code", "ext": ".py", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_schema_extra_example", "ext": ".py", "methods": 15, - "sore": "(TestClient+app+client+get+import_module+importlib+json+mod+param+put+request+response+return+status_code+text)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"put\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.11650485436893203 }, { "package": "tests/test_tutorial/test_security", "ext": ".py", "methods": 73, - "sore": "(TestClient+access_token+app+auth+client+content+data+get+get_access_token+get_password_hash+headers+import_module+importlib+json+mod+param+password+post+request+response+return+scope+status_code+text+username+verify_password)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"access_token\" | \"app\" | \"auth\" | \"client\" | \"content\" | \"data\" | \"get\" | \"get_access_token\" | \"get_password_hash\" | \"headers\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"password\" | \"post\" | \"request\" | \"response\" | \"return\" | \"scope\" | \"status_code\" | \"text\" | \"username\" | \"verify_password\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.05797101449275362 }, { "package": "tests/test_tutorial/test_separate_openapi_schemas", "ext": ".py", "methods": 8, - "sore": "(TestClient+app+client+get+import_module+importlib+json+mod+param+post+request+response+return+status_code+text)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"import_module\" | \"importlib\" | \"json\" | \"mod\" | \"param\" | \"post\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.11538461538461539 }, { "package": "tests/test_tutorial/test_server_sent_events", "ext": ".py", "methods": 17, - "sore": "(TestClient+all+app+client+data_lines+event_lines+for+get+headers+id_lines+if+import_module+importlib+in+json+len+line+lines+mod+param+path+post+request+response+retry_lines+return+split+startswith+status_code+strip+text)+.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"all\" | \"app\" | \"client\" | \"data_lines\" | \"event_lines\" | \"for\" | \"get\" | \"headers\" | \"id_lines\" | \"if\" | \"import_module\" | \"importlib\" | \"in\" | \"json\" | \"len\" | \"line\" | \"lines\" | \"mod\" | \"param\" | \"path\" | \"post\" | \"request\" | \"response\" | \"retry_lines\" | \"return\" | \"split\" | \"startswith\" | \"status_code\" | \"strip\" | \"text\")+ \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.06091370558375634 }, { "package": "tests/test_tutorial/test_settings", "ext": ".py", "methods": 16, - "sore": "(TestClient+ValidationError+admin_email+app+app_name+client+data+del+delenv+exc_info+get+get_settings+if+import_module+importlib+in+json+main_mod+mod+mod_name+mod_path+modules+monkeypatch+param+pytest+raises+raising+request+response+return+setenv+settings+status_code+sys+test_main_mod+text)+.value?.(items_per_user+snapshot+test_app)+?.errors+?.IsAnyStr?", - "gbnf": "root ::= (\"TestClient\" | \"ValidationError\" | \"admin_email\" | \"app\" | \"app_name\" | \"client\" | \"data\" | \"del\" | \"delenv\" | \"exc_info\" | \"get\" | \"get_settings\" | \"if\" | \"import_module\" | \"importlib\" | \"in\" | \"json\" | \"main_mod\" | \"mod\" | \"mod_name\" | \"mod_path\" | \"modules\" | \"monkeypatch\" | \"param\" | \"pytest\" | \"raises\" | \"raising\" | \"request\" | \"response\" | \"return\" | \"setenv\" | \"settings\" | \"status_code\" | \"sys\" | \"test_main_mod\" | \"text\")+ \"value\"? (\"items_per_user\" | \"snapshot\" | \"test_app\")* \"errors\"* \"IsAnyStr\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.10891089108910892 }, { "package": "tests/test_tutorial/test_sql_databases", "ext": ".py", "methods": 8, - "sore": "(Any+StaticPool+TestClient+app+c+cast+catch_warnings+clear_sqlmodel+connect_args+create_engine+engine+import_module+importlib+mod+mod_any+param+poolclass+record+reload+request+simplefilter+sqlite_url+warnings+yield)+?.SQLModel?.(Is+IsInt+client+delete+get+hero_id+json+patch+post+response+snapshot+status_code+text)+?.metadata?.clear+?.default_registry?.dispose+?", - "gbnf": "root ::= (\"Any\" | \"StaticPool\" | \"TestClient\" | \"app\" | \"c\" | \"cast\" | \"catch_warnings\" | \"clear_sqlmodel\" | \"connect_args\" | \"create_engine\" | \"engine\" | \"import_module\" | \"importlib\" | \"mod\" | \"mod_any\" | \"param\" | \"poolclass\" | \"record\" | \"reload\" | \"request\" | \"simplefilter\" | \"sqlite_url\" | \"warnings\" | \"yield\")* \"SQLModel\"? (\"Is\" | \"IsInt\" | \"client\" | \"delete\" | \"get\" | \"hero_id\" | \"json\" | \"patch\" | \"post\" | \"response\" | \"snapshot\" | \"status_code\" | \"text\")* \"metadata\"? \"clear\"* \"default_registry\"? \"dispose\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.16612377850162866 }, { "package": "tests/test_tutorial/test_static_files", "ext": ".py", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_stream_data", "ext": ".py", "methods": 7, - "sore": "(TestClient+app+client+content+get+headers+import_module+importlib+mod+param+path+request+response+return+status_code+text)+.json+?.(binary_image+expected_text)?.snapshot+?", - "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"content\" | \"get\" | \"headers\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"path\" | \"request\" | \"response\" | \"return\" | \"status_code\" | \"text\")+ \"json\"* (\"binary_image\" | \"expected_text\")? \"snapshot\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.18881118881118883 }, { "package": "tests/test_tutorial/test_stream_json_lines", "ext": ".py", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_strict_content_type", "ext": ".py", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_tutorial/test_sub_applications", "ext": ".py", "methods": 4, + "skip": "", + "structure_score": 0.40909090909090906, "sore": "(client+get+response+status_code+text)+.json+.snapshot+?", "gbnf": "root ::= (\"client\" | \"get\" | \"response\" | \"status_code\" | \"text\")+ \"json\"+ \"snapshot\"*", "gbnf_ok": true @@ -1042,28 +1111,32 @@ "package": "tests/test_tutorial/test_testing", "ext": ".py", "methods": 10, - "sore": "(ModuleType+import_module+importlib+mod+param+request+return)+?.(client+get+response+status_code+text)+?.pytest?.(test_create_existing_item+test_create_item+test_create_item_bad_token+test_main+test_module+test_read_item+test_read_nonexistent_item)+?.(test_read_main+test_websocket)+?.json+?.warns+?.test_read_item_bad_token+?.snapshot+?.DeprecationWarning+?.from?.docs_src+?.app_testing+?.tutorial003_py310+?.import?.test_read_items+?", - "gbnf": "root ::= (\"ModuleType\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"request\" | \"return\")* (\"client\" | \"get\" | \"response\" | \"status_code\" | \"text\")* \"pytest\"? (\"test_create_existing_item\" | \"test_create_item\" | \"test_create_item_bad_token\" | \"test_main\" | \"test_module\" | \"test_read_item\" | \"test_read_nonexistent_item\")* (\"test_read_main\" | \"test_websocket\")* \"json\"* \"warns\"* \"test_read_item_bad_token\"* \"snapshot\"* \"DeprecationWarning\"* \"from\"? \"docs_src\"* \"app_testing\"* \"tutorial003_py310\"* \"import\"? \"test_read_items\"*", + "skip": "", + "structure_score": 0.360655737704918, + "sore": "(client+get+response+status_code+text)+?.(ModuleType+import_module+importlib+mod+param+request+return)+?.(test_create_existing_item+test_create_item+test_create_item_bad_token+test_main+test_module+test_read_item+test_read_nonexistent_item)+?.pytest?.(test_read_main+test_websocket)+?.json+?.test_read_item_bad_token+?.warns+?.snapshot+?.DeprecationWarning+?.from?.docs_src+?.app_testing+?.tutorial003_py310+?.import?.test_read_items+?", + "gbnf": "root ::= (\"client\" | \"get\" | \"response\" | \"status_code\" | \"text\")* (\"ModuleType\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"request\" | \"return\")* (\"test_create_existing_item\" | \"test_create_item\" | \"test_create_item_bad_token\" | \"test_main\" | \"test_module\" | \"test_read_item\" | \"test_read_nonexistent_item\")* \"pytest\"? (\"test_read_main\" | \"test_websocket\")* \"json\"* \"test_read_item_bad_token\"* \"warns\"* \"snapshot\"* \"DeprecationWarning\"* \"from\"? \"docs_src\"* \"app_testing\"* \"tutorial003_py310\"* \"import\"? \"test_read_items\"*", "gbnf_ok": true }, { "package": "tests/test_tutorial/test_testing_dependencies", "ext": ".py", "methods": 8, - "sore": "(ModuleType+import_module+importlib+mod+param+request+return)+?.(app+client+dependency_overrides+get+response+status_code+test_module+test_override_in_items+test_override_in_items_with_params+test_override_in_items_with_q+text)+?.json+?", - "gbnf": "root ::= (\"ModuleType\" | \"import_module\" | \"importlib\" | \"mod\" | \"param\" | \"request\" | \"return\")* (\"app\" | \"client\" | \"dependency_overrides\" | \"get\" | \"response\" | \"status_code\" | \"test_module\" | \"test_override_in_items\" | \"test_override_in_items_with_params\" | \"test_override_in_items_with_q\" | \"text\")* \"json\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.11538461538461539 }, { "package": "tests/test_tutorial/test_websockets", "ext": ".py", "methods": 14, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_validate_response_recursive", "ext": ".py", "methods": 3, + "skip": "", + "structure_score": 0.21818181818181817, "sore": "(TestClient+app+client+get+json+response+status_code+text)+?.return?", "gbnf": "root ::= (\"TestClient\" | \"app\" | \"client\" | \"get\" | \"json\" | \"response\" | \"status_code\" | \"text\")* \"return\"?", "gbnf_ok": true diff --git a/experiments/results/flask_gbnf.json b/experiments/results/flask_gbnf.json index c076849..2070958 100644 --- a/experiments/results/flask_gbnf.json +++ b/experiments/results/flask_gbnf.json @@ -3,66 +3,71 @@ "package": "examples/celery/src/task_app", "ext": ".py", "methods": 11, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "examples/javascript/tests", "ext": ".py", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "examples/tutorial/flaskr", "ext": ".py", "methods": 18, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "examples/tutorial/tests", "ext": ".py", "methods": 25, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "src/flask", "ext": ".py", "methods": 216, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "src/flask/json", "ext": ".py", "methods": 50, - "sore": "(TypeError+UUID+__html__+_app+_default+_json+_prepare_response_obj+_untag_scan+and+args+current_app+dict+dumps+else+for+fp+http_date+if+in+is+isinstance+item+items+iter+json+k+key+kwargs+len+list+loads+mimetype+next+not+obj+or+order+raise+response_class+return+s+self+serializer+setdefault+str+tag+tags+tuple+v+value)+.NotImplementedError+?", - "gbnf": "root ::= (\"TypeError\" | \"UUID\" | \"__html__\" | \"_app\" | \"_default\" | \"_json\" | \"_prepare_response_obj\" | \"_untag_scan\" | \"and\" | \"args\" | \"current_app\" | \"dict\" | \"dumps\" | \"else\" | \"for\" | \"fp\" | \"http_date\" | \"if\" | \"in\" | \"is\" | \"isinstance\" | \"item\" | \"items\" | \"iter\" | \"json\" | \"k\" | \"key\" | \"kwargs\" | \"len\" | \"list\" | \"loads\" | \"mimetype\" | \"next\" | \"not\" | \"obj\" | \"or\" | \"order\" | \"raise\" | \"response_class\" | \"return\" | \"s\" | \"self\" | \"serializer\" | \"setdefault\" | \"str\" | \"tag\" | \"tags\" | \"tuple\" | \"v\" | \"value\")+ \"NotImplementedError\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.042105263157894736 }, { "package": "src/flask/sansio", "ext": ".py", "methods": 102, - "sore": "(Any+BlueprintSetupState+ValueError+__name__+_method_route+add_url_rule+and+app+append+callable+code+config+decorator+def+dict+else+endpoint+f+for+func+if+import_name+in+is+is not+lambda+name+not+options+or+os+path+raise+record_once+return+root_path+rstrip+rule+s+self+setdefault+state+static_folder+str+t+url_default_functions+value+values+view_func+view_functions)+", - "gbnf": "root ::= (\"Any\" | \"BlueprintSetupState\" | \"ValueError\" | \"__name__\" | \"_method_route\" | \"add_url_rule\" | \"and\" | \"app\" | \"append\" | \"callable\" | \"code\" | \"config\" | \"decorator\" | \"def\" | \"dict\" | \"else\" | \"endpoint\" | \"f\" | \"for\" | \"func\" | \"if\" | \"import_name\" | \"in\" | \"is\" | \"is not\" | \"lambda\" | \"name\" | \"not\" | \"options\" | \"or\" | \"os\" | \"path\" | \"raise\" | \"record_once\" | \"return\" | \"root_path\" | \"rstrip\" | \"rule\" | \"s\" | \"self\" | \"setdefault\" | \"state\" | \"static_folder\" | \"str\" | \"t\" | \"url_default_functions\" | \"value\" | \"values\" | \"view_func\" | \"view_functions\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.009523809523809525 }, { "package": "tests", "ext": ".py", "methods": 962, - "sore": "(@+Blueprint+__name__+app+append+class+client+config+data+def+e+flask+get+in+index+isinstance+not+raise+render_template+request+return+route+rv+s+self+session+value)+", - "gbnf": "root ::= (\"@\" | \"Blueprint\" | \"__name__\" | \"app\" | \"append\" | \"class\" | \"client\" | \"config\" | \"data\" | \"def\" | \"e\" | \"flask\" | \"get\" | \"in\" | \"index\" | \"isinstance\" | \"not\" | \"raise\" | \"render_template\" | \"request\" | \"return\" | \"route\" | \"rv\" | \"s\" | \"self\" | \"session\" | \"value\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.021897810218978103 }, { "package": "tests/test_apps", "ext": ".py", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "tests/test_apps/blueprintapp/apps", "ext": ".py", "methods": 4, + "skip": "", + "structure_score": 0.2857142857142857, "sore": "return.render_template+", "gbnf": "root ::= \"return\" \"render_template\"+", "gbnf_ok": true @@ -71,13 +76,17 @@ "package": "tests/type_check", "ext": ".py", "methods": 24, - "sore": "def?.(Generator+encode+for+in+iter+range+return+show+str+t+x+yield)+?.(Response+code+jsonify)+?.render_template+?.HTTPStatus?.stream_template+?.self?.OK?.name+?.template_name+?", - "gbnf": "root ::= \"def\"? (\"Generator\" | \"encode\" | \"for\" | \"in\" | \"iter\" | \"range\" | \"return\" | \"show\" | \"str\" | \"t\" | \"x\" | \"yield\")* (\"Response\" | \"code\" | \"jsonify\")* \"render_template\"* \"HTTPStatus\"? \"stream_template\"* \"self\"? \"OK\"? \"name\"* \"template_name\"*", + "skip": "", + "structure_score": 0.5597014925373135, + "sore": "def?.(Generator+encode+for+in+iter+range+return+show+str+t+x+yield)+?.stream_template+?.(Response+code+jsonify)+?.render_template+?.HTTPStatus?.name+?.self?.OK?.template_name+?", + "gbnf": "root ::= \"def\"? (\"Generator\" | \"encode\" | \"for\" | \"in\" | \"iter\" | \"range\" | \"return\" | \"show\" | \"str\" | \"t\" | \"x\" | \"yield\")* \"stream_template\"* (\"Response\" | \"code\" | \"jsonify\")* \"render_template\"* \"HTTPStatus\"? \"name\"* \"self\"? \"OK\"? \"template_name\"*", "gbnf_ok": true }, { "package": "(other)", "ext": ".py", - "methods": 4 + "methods": 4, + "skip": "", + "structure_score": 0 } ] \ No newline at end of file diff --git a/experiments/results/ragsak_gbnf.json b/experiments/results/ragsak_gbnf.json index 4247073..594c962 100644 --- a/experiments/results/ragsak_gbnf.json +++ b/experiments/results/ragsak_gbnf.json @@ -3,6 +3,8 @@ "package": "agents", "ext": ".kt", "methods": 5, + "skip": "", + "structure_score": 0.24757281553398058, "sore": "slot?.(defaultCapabilityId+summarize)?.ToolInvocationRequest?.ToolingRequest?.ToolInvocationResult?.(String+answer+any+assertEquals+capture+captured+every+generateText+invoke+invokeTools+promptRunner+toolProfile+verify)+?.prompt?.contains+?", "gbnf": "root ::= \"slot\"? (\"defaultCapabilityId\" | \"summarize\")? \"ToolInvocationRequest\"? \"ToolingRequest\"? \"ToolInvocationResult\"? (\"String\" | \"answer\" | \"any\" | \"assertEquals\" | \"capture\" | \"captured\" | \"every\" | \"generateText\" | \"invoke\" | \"invokeTools\" | \"promptRunner\" | \"toolProfile\" | \"verify\")* \"prompt\"? \"contains\"*", "gbnf_ok": true @@ -11,166 +13,190 @@ "package": "agents/capability/ports/src/main/kotlin/eu/corentic/springrag/agent/capability", "ext": ".kt", "methods": 5, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "agents/capability/support/src/main/kotlin/eu/corentic/springrag/agent/capability/support", "ext": ".kt", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/capability/support/src/test/kotlin/eu/corentic/springrag/agent/capability/support", "ext": ".kt", "methods": 6, - "sore": "runTest?.TestRequest?.(AgentCapabilityDescriptor+DefaultAgentCapabilityDirectory+IllegalStateException+assertEquals+assertFailsWith+authorize+capabilityDescriptors+coEvery+coVerify+defaultCapabilityId+every+id+invoke+listOf+message+resolve+verify)+.(any+listCapabilities)+?", - "gbnf": "root ::= \"runTest\"? \"TestRequest\"? (\"AgentCapabilityDescriptor\" | \"DefaultAgentCapabilityDirectory\" | \"IllegalStateException\" | \"assertEquals\" | \"assertFailsWith\" | \"authorize\" | \"capabilityDescriptors\" | \"coEvery\" | \"coVerify\" | \"defaultCapabilityId\" | \"every\" | \"id\" | \"invoke\" | \"listOf\" | \"message\" | \"resolve\" | \"verify\")+ (\"any\" | \"listCapabilities\")*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.09836065573770492 }, { "package": "agents/examples/simple-rag/src/main/kotlin/eu/corentic/springrag/example/rag/simple", "ext": ".kt", "methods": 9, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/examples/simple-rag/src/test/kotlin/eu/corentic/springrag/example/rag/simple", "ext": ".kt", "methods": 14, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/rag/embabel/src/main/kotlin/eu/corentic/springrag/agent/rag/embabel", "ext": ".kt", "methods": 58, - "sore": "buildObservationContext?.shouldRetrieve?.(ASK+ChatResponse+EmbabelJudgeDecision+Exception+JudgeOutcome+ResponseDraft+RetrievedEvidence+String+WORKFLOW_ORIGIN_CAPABILITY_KEY+WORKFLOW_TRANSPORT_KEY+advisors+agent+agents+allowAsk+allowRetrieve+applyRetrieveCost+askCost+asksSoFar+budgetRemaining+build+builder+call+canAffordRetrieve+catch+chatOptions+confidence+consumeBudget+contains+content+conversationId+copy+debug+decision+decisionState+docs+draftAnswer+else+emptyList+enoughEvidence+entity+equals+error+evidence+expandContext+find+get+if+ifBlank+info+invoke+isEmpty+isNotBlank+isNotEmpty+isNullOrBlank+java+joinToString+knowledgeBaseId+length+let+lowercase+maxRetrievalRounds+memoryContext+message+name+nextAction+of+options+orEmpty+originCapabilityId+param+prompt+promptClient+refinedQuery+removePrefix+removeSuffix+request+resultOfType+retrievalRounds+retrieve+retrieveCost+return false+return null+return this+return true+run+runWithCircuitBreaker+simpleName+size+system+take+takeIf+text+transport+trim+trimIndent+try+user+warn+withConversationId+withObservationContext+withWorkflowStep)+?.map+?.hasDefaultKb?.coerceIn+?", - "gbnf": "root ::= \"buildObservationContext\"? \"shouldRetrieve\"? (\"ASK\" | \"ChatResponse\" | \"EmbabelJudgeDecision\" | \"Exception\" | \"JudgeOutcome\" | \"ResponseDraft\" | \"RetrievedEvidence\" | \"String\" | \"WORKFLOW_ORIGIN_CAPABILITY_KEY\" | \"WORKFLOW_TRANSPORT_KEY\" | \"advisors\" | \"agent\" | \"agents\" | \"allowAsk\" | \"allowRetrieve\" | \"applyRetrieveCost\" | \"askCost\" | \"asksSoFar\" | \"budgetRemaining\" | \"build\" | \"builder\" | \"call\" | \"canAffordRetrieve\" | \"catch\" | \"chatOptions\" | \"confidence\" | \"consumeBudget\" | \"contains\" | \"content\" | \"conversationId\" | \"copy\" | \"debug\" | \"decision\" | \"decisionState\" | \"docs\" | \"draftAnswer\" | \"else\" | \"emptyList\" | \"enoughEvidence\" | \"entity\" | \"equals\" | \"error\" | \"evidence\" | \"expandContext\" | \"find\" | \"get\" | \"if\" | \"ifBlank\" | \"info\" | \"invoke\" | \"isEmpty\" | \"isNotBlank\" | \"isNotEmpty\" | \"isNullOrBlank\" | \"java\" | \"joinToString\" | \"knowledgeBaseId\" | \"length\" | \"let\" | \"lowercase\" | \"maxRetrievalRounds\" | \"memoryContext\" | \"message\" | \"name\" | \"nextAction\" | \"of\" | \"options\" | \"orEmpty\" | \"originCapabilityId\" | \"param\" | \"prompt\" | \"promptClient\" | \"refinedQuery\" | \"removePrefix\" | \"removeSuffix\" | \"request\" | \"resultOfType\" | \"retrievalRounds\" | \"retrieve\" | \"retrieveCost\" | \"return false\" | \"return null\" | \"return this\" | \"return true\" | \"run\" | \"runWithCircuitBreaker\" | \"simpleName\" | \"size\" | \"system\" | \"take\" | \"takeIf\" | \"text\" | \"transport\" | \"trim\" | \"trimIndent\" | \"try\" | \"user\" | \"warn\" | \"withConversationId\" | \"withObservationContext\" | \"withWorkflowStep\")* \"map\"* \"hasDefaultKb\"? \"coerceIn\"*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.041584158415841586 }, { "package": "agents/rag/embabel/src/main/kotlin/eu/corentic/springrag/agent/rag/embabel/librechat", "ext": ".kt", "methods": 13, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/rag/embabel/src/test/kotlin/eu/corentic/springrag/agent/rag/embabel", "ext": ".kt", "methods": 36, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "agents/rag/embabel/src/test/kotlin/eu/corentic/springrag/testsupport", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/rag/ports/src/main/kotlin/eu/corentic/springrag/agent/rag", "ext": ".kt", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/rag/ports/src/test/kotlin/eu/corentic/springrag/agent/rag", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/rag/ports/src/test/kotlin/eu/corentic/springrag/model", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/rag/support/src/main/kotlin/eu/corentic/springrag/agent/rag/support", "ext": ".kt", "methods": 13, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/rag/support/src/test/kotlin/eu/corentic/springrag/agent/rag/support", "ext": ".kt", "methods": 11, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/summarizer/embabel/src/main/kotlin/eu/corentic/springrag/agent/summarizer/embabel", "ext": ".kt", "methods": 13, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/summarizer/embabel/src/test/kotlin/eu/corentic/springrag/agent/summarizer/embabel", "ext": ".kt", "methods": 14, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/tooling/agent/src/main/kotlin/eu/corentic/springrag/agent/tooling/agent", "ext": ".kt", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/tooling/embabel/src/main/kotlin/eu/corentic/springrag/agent/tooling/embabel", "ext": ".kt", "methods": 12, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/tooling/embabel/src/main/kotlin/eu/corentic/springrag/agent/tooling/embabel/recording", "ext": ".kt", "methods": 11, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/tooling/embabel/src/test/kotlin/eu/corentic/springrag/agent/tooling/embabel", "ext": ".kt", "methods": 6, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/wikipedia/adapters/src/main/kotlin/eu/corentic/springrag/agent/wikipedia", "ext": ".kt", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/wikipedia/adapters/src/test/kotlin/eu/corentic/springrag/agent/wikipedia", "ext": ".kt", "methods": 8, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/wikipedia/static/src/main/kotlin/eu/corentic/springrag/agent/wikipedia", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "agents/wikipedia/static/src/test/kotlin/eu/corentic/springrag/agent/wikipedia", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "app/src", "ext": ".kt", "methods": 6, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "app/src/e2eTest/kotlin/eu/corentic/springrag/e2e/cucumber/steps", "ext": ".kt", "methods": 17, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "app/src/integrationTest/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 15, + "skip": "", + "structure_score": 0.25925925925925924, "sore": "(ChatModel+Driver+QdrantClient+Session+String+also+any+close+every+mockk+run+session)+?.return JobRepositoryTestUtils(jobRepository)?.defaultOptions?.JobRepositoryTestUtils?.builder+?.build+?", "gbnf": "root ::= (\"ChatModel\" | \"Driver\" | \"QdrantClient\" | \"Session\" | \"String\" | \"also\" | \"any\" | \"close\" | \"every\" | \"mockk\" | \"run\" | \"session\")* \"return JobRepositoryTestUtils\" \"jobRepository\"? \"defaultOptions\"? \"JobRepositoryTestUtils\"? \"builder\"* \"build\"*", "gbnf_ok": true @@ -179,144 +205,165 @@ "package": "app/src/integrationTest/kotlin/eu/corentic/springrag/controller", "ext": ".kt", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "app/src/integrationTest/kotlin/eu/corentic/springrag/service", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "app/src/systemTest/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 14, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "app/src/systemTest/kotlin/eu/corentic/springrag/system", "ext": ".kt", "methods": 46, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "app/src/test/kotlin/eu/corentic/springrag/architecture", "ext": ".kt", "methods": 87, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "app/src/test/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "buildSrc/src/main/kotlin", "ext": ".kt", "methods": 8, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "buildSrc/src/test/kotlin", "ext": ".kt", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "entrypoints/agent-mcp-server/src/main/kotlin/eu/corentic/springrag/mcp", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "entrypoints/agent-mcp-server/src/test/kotlin/eu/corentic/springrag/mcp", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/controller", "ext": ".kt", "methods": 58, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/controller/librechat", "ext": ".kt", "methods": 29, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/controller/web", "ext": ".kt", "methods": 6, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 4, - "sore": "bindToWebHandler+?.from+?.webTestClient?.WebHandler?.post+?.(OK+response+setStatusCode)+?.setComplete+?.webFilter+?.build+?.(AtomicReference+String)+?.WebFilterChain?.(assertEquals+assertNull+block+empty+filter+get+set)+?.uri+?.exchange+?.expectStatus+?.isOk?", - "gbnf": "root ::= \"bindToWebHandler\"* \"from\"* \"webTestClient\"? \"WebHandler\"? \"post\"* (\"OK\" | \"response\" | \"setStatusCode\")* \"setComplete\"* \"webFilter\"* \"build\"* (\"AtomicReference\" | \"String\")* \"WebFilterChain\"? (\"assertEquals\" | \"assertNull\" | \"block\" | \"empty\" | \"filter\" | \"get\" | \"set\")* \"uri\"* \"exchange\"* \"expectStatus\"* \"isOk\"?", + "skip": "", + "structure_score": 0.6417910447761194, + "sore": "from+?.bindToWebHandler+?.webTestClient?.post+?.WebHandler?.(OK+response+setStatusCode)+?.setComplete+?.webFilter+?.build+?.(AtomicReference+String)+?.WebFilterChain?.(assertEquals+assertNull+block+empty+filter+get+set)+?.uri+?.exchange+?.expectStatus+?.isOk?", + "gbnf": "root ::= \"from\"* \"bindToWebHandler\"* \"webTestClient\"? \"post\"* \"WebHandler\"? (\"OK\" | \"response\" | \"setStatusCode\")* \"setComplete\"* \"webFilter\"* \"build\"* (\"AtomicReference\" | \"String\")* \"WebFilterChain\"? (\"assertEquals\" | \"assertNull\" | \"block\" | \"empty\" | \"filter\" | \"get\" | \"set\")* \"uri\"* \"exchange\"* \"expectStatus\"* \"isOk\"?", "gbnf_ok": true }, { "package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/controller", "ext": ".kt", "methods": 83, - "sore": "runTest?.(BAD_REQUEST+COMPLETED+ChatRequest+ChatResponse+GlobalExceptionHandler+JobStatus+MULTIPART_FORM_DATA+MultipartBodyBuilder+NOT_FOUND+SessionChatRequest+StorageProperties+String+any+assertEquals+bindToController+body+bodyValue+build+chatWithSources+chatWithSourcesAndMemory+coEvery+contentType+controllerAdvice+emptyList+every+exchange+expectBody+expectStatus+fromMultipartData+get+getJobStatus+header+isAccepted+isBadRequest+isEqualTo+isNotFound+isOk+jsonPath+knowledgeBaseExists+listOf+minusMinutes+mockk+now+part+post+runBlocking+startBulkJob+statusCode+toByteArray+toString+uri+value+verify)+?.error?", - "gbnf": "root ::= \"runTest\"? (\"BAD_REQUEST\" | \"COMPLETED\" | \"ChatRequest\" | \"ChatResponse\" | \"GlobalExceptionHandler\" | \"JobStatus\" | \"MULTIPART_FORM_DATA\" | \"MultipartBodyBuilder\" | \"NOT_FOUND\" | \"SessionChatRequest\" | \"StorageProperties\" | \"String\" | \"any\" | \"assertEquals\" | \"bindToController\" | \"body\" | \"bodyValue\" | \"build\" | \"chatWithSources\" | \"chatWithSourcesAndMemory\" | \"coEvery\" | \"contentType\" | \"controllerAdvice\" | \"emptyList\" | \"every\" | \"exchange\" | \"expectBody\" | \"expectStatus\" | \"fromMultipartData\" | \"get\" | \"getJobStatus\" | \"header\" | \"isAccepted\" | \"isBadRequest\" | \"isEqualTo\" | \"isNotFound\" | \"isOk\" | \"jsonPath\" | \"knowledgeBaseExists\" | \"listOf\" | \"minusMinutes\" | \"mockk\" | \"now\" | \"part\" | \"post\" | \"runBlocking\" | \"startBulkJob\" | \"statusCode\" | \"toByteArray\" | \"toString\" | \"uri\" | \"value\" | \"verify\")* \"error\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.032667876588021776 }, { "package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/controller/auth", "ext": ".kt", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/controller/librechat", "ext": ".kt", "methods": 46, - "sore": "runTest?.coEvery?.mockk?.mockFilePart?.FilePart?.(APPLICATION_JSON+APPLICATION_PDF+COMPLETED+DocumentImageInfo+EmbedOutcome+FAILED+GraphDocument+InvalidUploadRequestException+JobStatus+LibreChatRagIngestionService+LibreChatRetrievalRequest+LibreChatRetrievalResult+MULTIPART_FORM_DATA+MultipartBodyBuilder+ParsedDocument+RuntimeException+String+VectorChunk+any+asStorageUri+assertEquals+assertFailsWith+assertNotNull+batchUploadFile+batchUploadRoot+body+bodyValue+build+capture+captured+coVerify+contentType+emptyList+emptyMap+every+exchange+expectBody+expectStatus+fetchByJobId+fileId+fileIds+filename+findPageRendering+fromMultipartData+get+getJobStatus+getOrCreateAgentKnowledgeBase+header+ingestLocalFile+ingestMultipart+invoke+isEqualTo+isObjectStorageRoot+isOk+java+jsonPath+knowledgeBaseId+listOf+loadImage+mapOf+of+parse+part+post+slot+startJobWithId+toByteArray+uri+value+verify)+.(assertContains+message)+?.(assertTrue+doesNotExist+isNotFound)+?", - "gbnf": "root ::= \"runTest\"? \"coEvery\"? \"mockk\"? \"mockFilePart\"? \"FilePart\"? (\"APPLICATION_JSON\" | \"APPLICATION_PDF\" | \"COMPLETED\" | \"DocumentImageInfo\" | \"EmbedOutcome\" | \"FAILED\" | \"GraphDocument\" | \"InvalidUploadRequestException\" | \"JobStatus\" | \"LibreChatRagIngestionService\" | \"LibreChatRetrievalRequest\" | \"LibreChatRetrievalResult\" | \"MULTIPART_FORM_DATA\" | \"MultipartBodyBuilder\" | \"ParsedDocument\" | \"RuntimeException\" | \"String\" | \"VectorChunk\" | \"any\" | \"asStorageUri\" | \"assertEquals\" | \"assertFailsWith\" | \"assertNotNull\" | \"batchUploadFile\" | \"batchUploadRoot\" | \"body\" | \"bodyValue\" | \"build\" | \"capture\" | \"captured\" | \"coVerify\" | \"contentType\" | \"emptyList\" | \"emptyMap\" | \"every\" | \"exchange\" | \"expectBody\" | \"expectStatus\" | \"fetchByJobId\" | \"fileId\" | \"fileIds\" | \"filename\" | \"findPageRendering\" | \"fromMultipartData\" | \"get\" | \"getJobStatus\" | \"getOrCreateAgentKnowledgeBase\" | \"header\" | \"ingestLocalFile\" | \"ingestMultipart\" | \"invoke\" | \"isEqualTo\" | \"isObjectStorageRoot\" | \"isOk\" | \"java\" | \"jsonPath\" | \"knowledgeBaseId\" | \"listOf\" | \"loadImage\" | \"mapOf\" | \"of\" | \"parse\" | \"part\" | \"post\" | \"slot\" | \"startJobWithId\" | \"toByteArray\" | \"uri\" | \"value\" | \"verify\")+ (\"assertContains\" | \"message\")* (\"assertTrue\" | \"doesNotExist\" | \"isNotFound\")*", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.05930232558139535 }, { "package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/controller/web", "ext": ".kt", "methods": 10, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/ai-provider/src/main/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/ai-provider/src/main/kotlin/eu/corentic/springrag/health", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 6, + "skip": "", + "structure_score": 0.3448275862068966, "sore": "assertThrows?.IllegalArgumentException?.java?.EmbabelAiHttpClientProperties?.OllamaClientProperties?.Timeout+?.(assertEquals+baseUrl+ofSeconds+readTimeout+writeTimeout)+.timeout?.connectTimeout?.read?", "gbnf": "root ::= \"assertThrows\"? \"IllegalArgumentException\"? \"java\"? \"EmbabelAiHttpClientProperties\"? \"OllamaClientProperties\"? \"Timeout\"* (\"assertEquals\" | \"baseUrl\" | \"ofSeconds\" | \"readTimeout\" | \"writeTimeout\")+ \"timeout\"? \"connectTimeout\"? \"read\"?", "gbnf_ok": true @@ -325,164 +372,189 @@ "package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/health", "ext": ".kt", "methods": 4, - "sore": "`when`.listModels+.thenReturn+?.thenThrow+?.ListModelResponse+?.RuntimeException?.listOf+?.(Model+now)+?.requireNotNull+.OllamaHealthIndicator.NoOpCircuitBreakerFactory.health+.block+.assertEquals.status.code", - "gbnf": "root ::= \"`when`\" \"listModels\"+ \"thenReturn\"* \"thenThrow\"* \"ListModelResponse\"* \"RuntimeException\"? \"listOf\"* (\"Model\" | \"now\")* \"requireNotNull\"+ \"OllamaHealthIndicator\" \"NoOpCircuitBreakerFactory\" \"health\"+ \"block\"+ \"assertEquals\" \"status\" \"code\"", + "skip": "", + "structure_score": 0.5142857142857142, + "sore": "`when`.listModels+.thenThrow+?.thenReturn+?.RuntimeException?.ListModelResponse+?.listOf+?.(Model+now)+?.requireNotNull+.OllamaHealthIndicator.NoOpCircuitBreakerFactory.health+.block+.assertEquals.status.code", + "gbnf": "root ::= \"`when`\" \"listModels\"+ \"thenThrow\"* \"thenReturn\"* \"RuntimeException\"? \"ListModelResponse\"* \"listOf\"* (\"Model\" | \"now\")* \"requireNotNull\"+ \"OllamaHealthIndicator\" \"NoOpCircuitBreakerFactory\" \"health\"+ \"block\"+ \"assertEquals\" \"status\" \"code\"", "gbnf_ok": true }, { "package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/service/embedding", "ext": ".kt", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/testsupport", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/chat-memory/src/test/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 6, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/doc-parser/src", "ext": ".kt", "methods": 6, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/doc-parser/src/main/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/doc-parser/src/main/kotlin/eu/corentic/springrag/service/docling", "ext": ".kt", "methods": 21, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/doc-parser/src/systemTest/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 6, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/doc-parser/src/test/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 12, - "sore": "DoclingConfig?.doclingServeApi+?.trimIndent+?.PipelineOptions?.baseUrl?.assertNotNull+?.lines+?.(assertNull+concurrency+layoutBatchSize+ocrBatchSize+tableBatchSize)+?.(imageExportMode+includeImages+options+useS3Target)+?.toString+?.(indexOfFirst+startsWith+trimStart)+?.documentTimeout?.s3Target?.(assertThat+contains+doesNotContain+isGreaterThan)+?.bucket?.assertThatThrownBy?.validateCriticalSettings+?.isInstanceOf+?.IllegalStateException?.java?.hasMessageContaining+?", - "gbnf": "root ::= \"DoclingConfig\"? \"doclingServeApi\"* \"trimIndent\"* \"PipelineOptions\"? \"baseUrl\"? \"assertNotNull\"* \"lines\"* (\"assertNull\" | \"concurrency\" | \"layoutBatchSize\" | \"ocrBatchSize\" | \"tableBatchSize\")* (\"imageExportMode\" | \"includeImages\" | \"options\" | \"useS3Target\")* \"toString\"* (\"indexOfFirst\" | \"startsWith\" | \"trimStart\")* \"documentTimeout\"? \"s3Target\"? (\"assertThat\" | \"contains\" | \"doesNotContain\" | \"isGreaterThan\")* \"bucket\"? \"assertThatThrownBy\"? \"validateCriticalSettings\"* \"isInstanceOf\"* \"IllegalStateException\"? \"java\"? \"hasMessageContaining\"*", + "skip": "", + "structure_score": 0.39949748743718594, + "sore": "PipelineOptions?.doclingServeApi+?.DoclingConfig?.trimIndent+?.(assertNull+concurrency+layoutBatchSize+ocrBatchSize+tableBatchSize)+?.assertNotNull+?.baseUrl?.lines+?.documentTimeout?.toString+?.(imageExportMode+includeImages+options+useS3Target)+?.(indexOfFirst+startsWith+trimStart)+?.s3Target?.(assertThat+contains+doesNotContain+isGreaterThan)+?.bucket?.assertThatThrownBy?.validateCriticalSettings+?.isInstanceOf+?.IllegalStateException?.java?.hasMessageContaining+?", + "gbnf": "root ::= \"PipelineOptions\"? \"doclingServeApi\"* \"DoclingConfig\"? \"trimIndent\"* (\"assertNull\" | \"concurrency\" | \"layoutBatchSize\" | \"ocrBatchSize\" | \"tableBatchSize\")* \"assertNotNull\"* \"baseUrl\"? \"lines\"* \"documentTimeout\"? \"toString\"* (\"imageExportMode\" | \"includeImages\" | \"options\" | \"useS3Target\")* (\"indexOfFirst\" | \"startsWith\" | \"trimStart\")* \"s3Target\"? (\"assertThat\" | \"contains\" | \"doesNotContain\" | \"isGreaterThan\")* \"bucket\"? \"assertThatThrownBy\"? \"validateCriticalSettings\"* \"isInstanceOf\"* \"IllegalStateException\"? \"java\"? \"hasMessageContaining\"*", "gbnf_ok": true }, { "package": "infrastructure/adapters/doc-parser/src/test/kotlin/eu/corentic/springrag/health", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/doc-parser/src/test/kotlin/eu/corentic/springrag/service/docling", "ext": ".kt", "methods": 10, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/doc-parser/src/test/kotlin/eu/corentic/springrag/testsupport", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/health", "ext": ".kt", "methods": 7, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/model/graph", "ext": ".kt", "methods": 9, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/repository", "ext": ".kt", "methods": 24, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/agent", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/cleanup", "ext": ".kt", "methods": 4, - "sore": "info+.(deleteByJobId+deleteByKnowledgeBaseId+jobId+knowledgeBaseId+value)+", - "gbnf": "root ::= \"info\"+ (\"deleteByJobId\" | \"deleteByKnowledgeBaseId\" | \"jobId\" | \"knowledgeBaseId\" | \"value\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.13846153846153847 }, { "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/graph", "ext": ".kt", "methods": 12, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/port/adapter", "ext": ".kt", "methods": 45, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/storage", "ext": ".kt", "methods": 40, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/systemTest/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/systemTest/kotlin/eu/corentic/springrag/repository/graph", "ext": ".kt", "methods": 23, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/systemTest/kotlin/eu/corentic/springrag/system", "ext": ".kt", "methods": 6, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/health", "ext": ".kt", "methods": 6, - "sore": "(HealthCheckReply+`when`+collectionExistsAsync+getDefaultInstance+healthCheckAsync+immediateFuture+thenReturn+verifyConnectivityAsync)+.completedFuture+?.failedFuture+?.immediateFailedFuture+?.IllegalStateException?.(InterruptedException+TimeoutException)?.(Neo4jDriverHealthIndicator+QdrantVectorStoreHealthIndicator+assertEquals+assertTrue+block+code+currentThread+health+interrupted+isInterrupted+requireNotNull+status)+", - "gbnf": "root ::= (\"HealthCheckReply\" | \"`when`\" | \"collectionExistsAsync\" | \"getDefaultInstance\" | \"healthCheckAsync\" | \"immediateFuture\" | \"thenReturn\" | \"verifyConnectivityAsync\")+ \"completedFuture\"* \"failedFuture\"* \"immediateFailedFuture\"* \"IllegalStateException\"? (\"InterruptedException\" | \"TimeoutException\")? (\"Neo4jDriverHealthIndicator\" | \"QdrantVectorStoreHealthIndicator\" | \"assertEquals\" | \"assertTrue\" | \"block\" | \"code\" | \"currentThread\" | \"health\" | \"interrupted\" | \"isInterrupted\" | \"requireNotNull\" | \"status\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.12565445026178013 }, { "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/model/graph", "ext": ".kt", "methods": 7, + "skip": "", + "structure_score": 0.47368421052631576, "sore": "(ImageData+PageNode)+?.(PictureElement+SectionHeaderElement)?.copy+?.assertEquals+?.assertNotEquals?.(hashCode+label)+?", "gbnf": "root ::= (\"ImageData\" | \"PageNode\")* (\"PictureElement\" | \"SectionHeaderElement\")? \"copy\"* \"assertEquals\"* \"assertNotEquals\"? (\"hashCode\" | \"label\")*", "gbnf_ok": true @@ -491,32 +563,36 @@ "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/repository", "ext": ".kt", "methods": 19, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/service/cleanup", "ext": ".kt", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/service/graph", "ext": ".kt", "methods": 30, - "sore": "GraphDocument?.assertThrows?.IllegalArgumentException?.java?.(DocumentGraphJob+DocumentJobNode+GraphImagePayload+GraphPage+GraphPictureElement+GraphTableElement+GraphTextElement+Instant+String+activateDocument+activateDocumentGraph+adjustCounters+adjustSizeInBytes+any+arg+asDocumentId+asFilename+asJobId+asKnowledgeBaseId+asLogicalDocumentId+asStorageUri+assertDoesNotThrow+byteArrayOf+capture+corentic+countActiveDocumentsByLogicalDocumentId+countActiveElementsByLogicalDocumentId+createBelongsToRelationship+deactivateByLogicalDocumentId+deactivateByLogicalDocumentIdExcept+deleteByJobId+deleteObject+deleteObjects+emptyGraphDocument+emptyList+eu+every+existsById+findByJobId+findByKnowledgeBaseId+findByLogicalDocumentId+findOrCreateInactive+forEach+graph+isActive+listOf+minusSeconds+model+now+parse+repeat+saveDocumentGraph+slot+springrag+stageDocumentGraph+storeDocumentGraph+storeImage+stubDocumentGraphJob+sumActiveFileSizeBytesByLogicalDocumentId+time+value+verify+verifyOrder)+?.captured?.GraphIngestionOrchestrator?.(assertEquals+assertNotNull+assertNull+doclingId+first+height+imageData+imageType+page+pageNo+pages+pictureElements+rendering+size+storageUri+textElements+width)+?.NoOpCircuitBreakerFactory?.text?", - "gbnf": "root ::= \"GraphDocument\"? \"assertThrows\"? \"IllegalArgumentException\"? \"java\"? (\"DocumentGraphJob\" | \"DocumentJobNode\" | \"GraphImagePayload\" | \"GraphPage\" | \"GraphPictureElement\" | \"GraphTableElement\" | \"GraphTextElement\" | \"Instant\" | \"String\" | \"activateDocument\" | \"activateDocumentGraph\" | \"adjustCounters\" | \"adjustSizeInBytes\" | \"any\" | \"arg\" | \"asDocumentId\" | \"asFilename\" | \"asJobId\" | \"asKnowledgeBaseId\" | \"asLogicalDocumentId\" | \"asStorageUri\" | \"assertDoesNotThrow\" | \"byteArrayOf\" | \"capture\" | \"corentic\" | \"countActiveDocumentsByLogicalDocumentId\" | \"countActiveElementsByLogicalDocumentId\" | \"createBelongsToRelationship\" | \"deactivateByLogicalDocumentId\" | \"deactivateByLogicalDocumentIdExcept\" | \"deleteByJobId\" | \"deleteObject\" | \"deleteObjects\" | \"emptyGraphDocument\" | \"emptyList\" | \"eu\" | \"every\" | \"existsById\" | \"findByJobId\" | \"findByKnowledgeBaseId\" | \"findByLogicalDocumentId\" | \"findOrCreateInactive\" | \"forEach\" | \"graph\" | \"isActive\" | \"listOf\" | \"minusSeconds\" | \"model\" | \"now\" | \"parse\" | \"repeat\" | \"saveDocumentGraph\" | \"slot\" | \"springrag\" | \"stageDocumentGraph\" | \"storeDocumentGraph\" | \"storeImage\" | \"stubDocumentGraphJob\" | \"sumActiveFileSizeBytesByLogicalDocumentId\" | \"time\" | \"value\" | \"verify\" | \"verifyOrder\")* \"captured\"? \"GraphIngestionOrchestrator\"? (\"assertEquals\" | \"assertNotNull\" | \"assertNull\" | \"doclingId\" | \"first\" | \"height\" | \"imageData\" | \"imageType\" | \"page\" | \"pageNo\" | \"pages\" | \"pictureElements\" | \"rendering\" | \"size\" | \"storageUri\" | \"textElements\" | \"width\")* \"NoOpCircuitBreakerFactory\"? \"text\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.056199821587867974 }, { "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/service/port/adapter", "ext": ".kt", "methods": 28, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/service/storage", "ext": ".kt", "methods": 3, + "skip": "", + "structure_score": 0.5882352941176471, "sore": "assertNull?.parseS3Location.error+?.(assertEquals+bucket)+?.key?", "gbnf": "root ::= \"assertNull\"? \"parseS3Location\" \"error\"* (\"assertEquals\" | \"bucket\")* \"key\"?", "gbnf_ok": true @@ -525,270 +601,314 @@ "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/testsupport", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/chat/src/integrationTest/kotlin/eu/corentic/springrag/service/chat", "ext": ".kt", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/chat/src/main/kotlin/eu/corentic/springrag/service/chat", "ext": ".kt", "methods": 6, - "skip": "malformed_grammar" + "skip": "malformed_grammar", + "structure_score": 0 }, { "package": "modules/chat/src/systemTest/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 15, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/chat/src/systemTest/kotlin/eu/corentic/springrag/system", "ext": ".kt", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/chat/src/test/kotlin/eu/corentic/springrag/service/chat", "ext": ".kt", "methods": 8, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/common/src/main/kotlin/eu/corentic/springrag/common", "ext": ".kt", "methods": 7, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/common/src/main/kotlin/eu/corentic/springrag/common/ids", "ext": ".kt", "methods": 18, - "sore": "of+?.requireNonBlankNoWhitespace?.(removeSuffix+trim)+?.(DocumentId+JobId+KnowledgeBaseId+LogicalDocumentId)?.trimStart+?.requireSafeId?.return StorageUri(\"$base/$relative\")?.StorageUri?.requireNonBlank?.(contains+isNotEmpty+require)+?.matches+?.return BatchId(normalized)?.any+?.return Filename(normalized)?.BatchId?.isWhitespace+?.Filename?.return normalized?", - "gbnf": "root ::= \"of\"* \"requireNonBlankNoWhitespace\"? (\"removeSuffix\" | \"trim\")* (\"DocumentId\" | \"JobId\" | \"KnowledgeBaseId\" | \"LogicalDocumentId\")? \"trimStart\"* \"requireSafeId\"? \"return StorageUri\" \"\\\"$base/$relative\\\"\"? \"StorageUri\"? \"requireNonBlank\"? (\"contains\" | \"isNotEmpty\" | \"require\")* \"matches\"* \"return BatchId\" \"normalized\"? \"any\"* \"return Filename\" \"normalized\"? \"BatchId\"? \"isWhitespace\"* \"Filename\"? \"return normalized\"?", + "skip": "", + "structure_score": 0.41860465116279066, + "sore": "(removeSuffix+trim)+?.of+?.requireNonBlankNoWhitespace?.(DocumentId+JobId+KnowledgeBaseId+LogicalDocumentId)?.trimStart+?.requireSafeId?.return StorageUri(\"$base/$relative\")?.StorageUri?.requireNonBlank?.(contains+isNotEmpty+require)+?.return Filename(normalized)?.return BatchId(normalized)?.any+?.matches+?.Filename?.BatchId?.isWhitespace+?.return normalized?", + "gbnf": "root ::= (\"removeSuffix\" | \"trim\")* \"of\"* \"requireNonBlankNoWhitespace\"? (\"DocumentId\" | \"JobId\" | \"KnowledgeBaseId\" | \"LogicalDocumentId\")? \"trimStart\"* \"requireSafeId\"? \"return StorageUri\" \"\\\"$base/$relative\\\"\"? \"StorageUri\"? \"requireNonBlank\"? (\"contains\" | \"isNotEmpty\" | \"require\")* \"return Filename\" \"normalized\"? \"return BatchId\" \"normalized\"? \"any\"* \"matches\"* \"Filename\"? \"BatchId\"? \"isWhitespace\"* \"return normalized\"?", "gbnf_ok": true }, { "package": "modules/common/src/test/kotlin/eu/corentic/springrag/common/ids", "ext": ".kt", "methods": 8, - "sore": "(IllegalArgumentException+asBatchId+asDocumentId+asFilename+asJobId+asKnowledgeBaseId+asLogicalDocumentId+asStorageUri+assertEquals+assertFailsWith+of+value)+", - "gbnf": "root ::= (\"IllegalArgumentException\" | \"asBatchId\" | \"asDocumentId\" | \"asFilename\" | \"asJobId\" | \"asKnowledgeBaseId\" | \"asLogicalDocumentId\" | \"asStorageUri\" | \"assertEquals\" | \"assertFailsWith\" | \"of\" | \"value\")+", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.020833333333333332 }, { "package": "modules/ingestion/src/integrationTest/kotlin/eu/corentic/springrag/service/job", "ext": ".kt", "methods": 34, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/batch", "ext": ".kt", "methods": 16, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/batch/listener", "ext": ".kt", "methods": 16, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/batch/model", "ext": ".kt", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/batch/partition", "ext": ".kt", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/batch/reader", "ext": ".kt", "methods": 4, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/batch/writer", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 26, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/service/chunk", "ext": ".kt", "methods": 18, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/service/document", "ext": ".kt", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/main/kotlin/eu/corentic/springrag/service/job", "ext": ".kt", "methods": 62, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch", "ext": ".kt", "methods": 17, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch/listener", "ext": ".kt", "methods": 34, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch/model", "ext": ".kt", "methods": 8, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch/partition", "ext": ".kt", "methods": 7, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch/processor", "ext": ".kt", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch/reader", "ext": ".kt", "methods": 12, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/batch/writer", "ext": ".kt", "methods": 14, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/service/chunk", "ext": ".kt", "methods": 8, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/ingestion/src/test/kotlin/eu/corentic/springrag/service/job", "ext": ".kt", "methods": 49, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/knowledgebase/ports/src/main/kotlin/eu/corentic/springrag/model", "ext": ".kt", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/knowledgebase/src/main/kotlin/eu/corentic/springrag/service/knowledgebase", "ext": ".kt", "methods": 11, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/knowledgebase/src/test/kotlin/eu/corentic/springrag/service/knowledgebase", "ext": ".kt", "methods": 16, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/security/src/main/kotlin/eu/corentic/springrag/security/config", "ext": ".kt", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/security/src/main/kotlin/eu/corentic/springrag/security/service", "ext": ".kt", "methods": 10, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/security/src/test/kotlin/eu/corentic/springrag/security/config", "ext": ".kt", "methods": 6, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "modules/security/src/test/kotlin/eu/corentic/springrag/security/service", "ext": ".kt", "methods": 15, - "sore": "(encode+every+existsByUsername)+?.init+?.JwtService?.UserService?.JwtProperties?.hmacShaKeyFor+?.generateToken+?.toByteArray+?.assertFalse?.UTF_8?.builder+?.subject+?.issuedAt+?.(Date+expiration)+?.currentTimeMillis+?.signWith+?.compact+?.(Err+Outcome+PasswordPolicyViolationException+ROLE_USER+String+UserAlreadyExistsException+any+assertEquals+assertThrows+assertTrue+authorities+authority+emptyList+error+extractAuthorities+extractUsername+firstArg+getOrThrow+java+listOf+map+match+parseToken+password+registerUser+role+save+username+validateToken+verify)+?.errorCode?.JwtValidationError?.(Expired+InvalidSignature+Malformed)?", - "gbnf": "root ::= (\"encode\" | \"every\" | \"existsByUsername\")* \"init\"* \"JwtService\"? \"UserService\"? \"JwtProperties\"? \"hmacShaKeyFor\"* \"generateToken\"* \"toByteArray\"* \"assertFalse\"? \"UTF_8\"? \"builder\"* \"subject\"* \"issuedAt\"* (\"Date\" | \"expiration\")* \"currentTimeMillis\"* \"signWith\"* \"compact\"* (\"Err\" | \"Outcome\" | \"PasswordPolicyViolationException\" | \"ROLE_USER\" | \"String\" | \"UserAlreadyExistsException\" | \"any\" | \"assertEquals\" | \"assertThrows\" | \"assertTrue\" | \"authorities\" | \"authority\" | \"emptyList\" | \"error\" | \"extractAuthorities\" | \"extractUsername\" | \"firstArg\" | \"getOrThrow\" | \"java\" | \"listOf\" | \"map\" | \"match\" | \"parseToken\" | \"password\" | \"registerUser\" | \"role\" | \"save\" | \"username\" | \"validateToken\" | \"verify\")* \"errorCode\"? \"JwtValidationError\"? (\"Expired\" | \"InvalidSignature\" | \"Malformed\")?", + "skip": "", + "structure_score": 0.30393996247654786, + "sore": "(encode+every+existsByUsername)+?.JwtService?.init+?.JwtProperties?.UserService?.generateToken+?.hmacShaKeyFor+?.assertFalse?.toByteArray+?.UTF_8?.builder+?.subject+?.issuedAt+?.(Date+expiration)+?.currentTimeMillis+?.signWith+?.compact+?.(Err+Outcome+PasswordPolicyViolationException+ROLE_USER+String+UserAlreadyExistsException+any+assertEquals+assertThrows+assertTrue+authorities+authority+emptyList+error+extractAuthorities+extractUsername+firstArg+getOrThrow+java+listOf+map+match+parseToken+password+registerUser+role+save+username+validateToken+verify)+?.JwtValidationError?.errorCode?.(Expired+InvalidSignature+Malformed)?", + "gbnf": "root ::= (\"encode\" | \"every\" | \"existsByUsername\")* \"JwtService\"? \"init\"* \"JwtProperties\"? \"UserService\"? \"generateToken\"* \"hmacShaKeyFor\"* \"assertFalse\"? \"toByteArray\"* \"UTF_8\"? \"builder\"* \"subject\"* \"issuedAt\"* (\"Date\" | \"expiration\")* \"currentTimeMillis\"* \"signWith\"* \"compact\"* (\"Err\" | \"Outcome\" | \"PasswordPolicyViolationException\" | \"ROLE_USER\" | \"String\" | \"UserAlreadyExistsException\" | \"any\" | \"assertEquals\" | \"assertThrows\" | \"assertTrue\" | \"authorities\" | \"authority\" | \"emptyList\" | \"error\" | \"extractAuthorities\" | \"extractUsername\" | \"firstArg\" | \"getOrThrow\" | \"java\" | \"listOf\" | \"map\" | \"match\" | \"parseToken\" | \"password\" | \"registerUser\" | \"role\" | \"save\" | \"username\" | \"validateToken\" | \"verify\")* \"JwtValidationError\"? \"errorCode\"? (\"Expired\" | \"InvalidSignature\" | \"Malformed\")?", "gbnf_ok": true }, { "package": "platform/test-support/src/main/kotlin/eu/corentic/springrag/testcontainers", "ext": ".kt", "methods": 13, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "platform/test-support/src/test/kotlin/eu/corentic/springrag/testcontainers", "ext": ".kt", "methods": 5, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "(other)", "ext": ".kt", - "methods": 6 + "methods": 6, + "skip": "", + "structure_score": 0 }, { "package": "compose/patches", "ext": ".js", "methods": 17, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "testing/steps", "ext": ".js", "methods": 68, - "sore": "(Promise+TEST_FILE+all+await+btn+chip+click+document+evaluate+expect+fc+fill+filter+first+form+generateSuffix+getByRole+goto+idPara+if+includes+isClosed+last+locator+modelBtn+querySelector+setFiles+suffix+textContent+waitFor+waitForEvent+waitForTimeout+waitForURL)+.url?.(toBeTruthy+toBeVisible)?.toContain?", - "gbnf": "root ::= (\"Promise\" | \"TEST_FILE\" | \"all\" | \"await\" | \"btn\" | \"chip\" | \"click\" | \"document\" | \"evaluate\" | \"expect\" | \"fc\" | \"fill\" | \"filter\" | \"first\" | \"form\" | \"generateSuffix\" | \"getByRole\" | \"goto\" | \"idPara\" | \"if\" | \"includes\" | \"isClosed\" | \"last\" | \"locator\" | \"modelBtn\" | \"querySelector\" | \"setFiles\" | \"suffix\" | \"textContent\" | \"waitFor\" | \"waitForEvent\" | \"waitForTimeout\" | \"waitForURL\")+ \"url\"? (\"toBeTruthy\" | \"toBeVisible\")? \"toContain\"?", - "gbnf_ok": true + "skip": "low_structure", + "structure_score": 0.07984790874524714 }, { "package": "testing/support", "ext": ".js", "methods": 3, - "skip": "too_diverse" + "skip": "too_diverse", + "structure_score": 0 }, { "package": "(other)", "ext": ".js", - "methods": 1 + "methods": 1, + "skip": "", + "structure_score": 0 }, { "package": "tools/setup-ui", "ext": ".go", "methods": 44, - "skip": "malformed_grammar" + "skip": "low_structure", + "structure_score": 0.0482573726541555 } ] \ No newline at end of file