From 3468813ec8861fa38cee161b395f587a7bea2d88 Mon Sep 17 00:00:00 2001 From: tobjend Date: Sun, 12 Jul 2026 02:56:13 +0200 Subject: [PATCH] fix: validate SORE before returning, skip malformed grammars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add validate_sore() to gbnf.py — checks parseability without converting - _infer_group now validates grammar and returns skip_reason='malformed_grammar' for SOREs containing raw code (e.g. w_body=, sult=, (+,+:N+...) - Results: 130 grammars, 130 GBNF OK, 0 GBNF FAIL - Flask: 5 OK, 0 FAIL, 3.4s - RAGSAK: 19 OK, 0 FAIL, 11 malformed, 12.9s - FastAPI: 106 OK, 0 FAIL, 6 malformed, 30.5s --- bex/gbnf.py | 11 + bex/tag_preprocessor/analyze.py | 9 + experiments/results/fastapi_gbnf.json | 1071 +++++++++++++++++++++++++ experiments/results/flask_gbnf.json | 83 ++ experiments/results/ragsak_gbnf.json | 80 +- 5 files changed, 1203 insertions(+), 51 deletions(-) create mode 100644 experiments/results/fastapi_gbnf.json create mode 100644 experiments/results/flask_gbnf.json diff --git a/bex/gbnf.py b/bex/gbnf.py index d8bdc15..fda87cf 100644 --- a/bex/gbnf.py +++ b/bex/gbnf.py @@ -372,3 +372,14 @@ def to_gbnf_with_rules(sore, name='root'): tree = _parse_sore(sore) frag, _, _ = _node_to_gbnf(tree, 0) return f'{name} ::= {frag}' + + +def validate_sore(sore): + """Check if a SORE string is parseable. Returns (True, None) or (False, error_msg).""" + if not sore or sore in ('∅', 'ε'): + return True, None + try: + _parse_sore(sore) + return True, None + except ValueError as e: + return False, str(e) diff --git a/bex/tag_preprocessor/analyze.py b/bex/tag_preprocessor/analyze.py index 1eb9a88..5696557 100644 --- a/bex/tag_preprocessor/analyze.py +++ b/bex/tag_preprocessor/analyze.py @@ -20,6 +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 SUPPORTED_EXTENSIONS = { ".py", ".js", ".ts", ".kt", ".rb", ".go", ".rs", ".java", ".c", ".cpp", @@ -312,6 +313,14 @@ def _infer_group(label, group_seqs, group_files, project_root, min_coverage, pre } else: result = infer_ensemble(symbol_seqs, kmax=kmax, N=N, prefer=prefer, min_coverage=min_coverage, include_kore=include_kore, include_idregex=include_idregex) + + # Validate grammar is parseable + if result and result.get('best') and result['best'].get('grammar'): + ok, err = validate_sore(result['best']['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) + meta = {"files": group_files, "imports": imports, "arg_patterns": arg_patterns, "packages": packages} return (label, result, len(filtered), meta) diff --git a/experiments/results/fastapi_gbnf.json b/experiments/results/fastapi_gbnf.json new file mode 100644 index 0000000..bb2ac5a --- /dev/null +++ b/experiments/results/fastapi_gbnf.json @@ -0,0 +1,1071 @@ +[ + { + "package": "docs/en/docs/js", + "ext": ".js", + "methods": 49, + "skip": "too_diverse" + }, + { + "package": "(other)", + "ext": ".js", + "methods": 1 + }, + { + "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 + }, + { + "package": "docs_src/additional_responses", + "ext": ".py", + "methods": 4, + "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 + }, + { + "package": "docs_src/advanced_middleware", + "ext": ".py", + "methods": 3, + "sore": "return", + "gbnf": "root ::= \"return\"", + "gbnf_ok": true + }, + { + "package": "docs_src/app_testing", + "ext": ".py", + "methods": 14, + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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\")+", + "gbnf_ok": true + }, + { + "package": "docs_src/behind_a_proxy", + "ext": ".py", + "methods": 5, + "sore": "return.request?.scope?.get+?", + "gbnf": "root ::= \"return\" \"request\"? \"scope\"? \"get\"*", + "gbnf_ok": true + }, + { + "package": "docs_src/bigger_applications/app_an_py310", + "ext": ".py", + "methods": 4, + "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 + }, + { + "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 + }, + { + "package": "docs_src/body", + "ext": ".py", + "methods": 4, + "skip": "too_diverse" + }, + { + "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 + }, + { + "package": "docs_src/body_nested_models", + "ext": ".py", + "methods": 9, + "sore": "(item+item_id+results+return)+.(images+offer+weights)?", + "gbnf": "root ::= (\"item\" | \"item_id\" | \"results\" | \"return\")+ (\"images\" | \"offer\" | \"weights\")?", + "gbnf_ok": true + }, + { + "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 + }, + { + "package": "docs_src/configure_swagger_ui", + "ext": ".py", + "methods": 3, + "sore": "return.username", + "gbnf": "root ::= \"return\" \"username\"", + "gbnf_ok": true + }, + { + "package": "docs_src/cookie_param_models", + "ext": ".py", + "methods": 4, + "sore": "return.cookies", + "gbnf": "root ::= \"return\" \"cookies\"", + "gbnf_ok": true + }, + { + "package": "docs_src/custom_docs_ui", + "ext": ".py", + "methods": 8, + "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 + }, + { + "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 + }, + { + "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\"*", + "gbnf_ok": true + }, + { + "package": "docs_src/dataclasses_", + "ext": ".py", + "methods": 4, + "sore": "return.item?.author_id?.items?", + "gbnf": "root ::= \"return\" \"item\"? \"author_id\"? \"items\"?", + "gbnf_ok": true + }, + { + "package": "docs_src/dependencies", + "ext": ".py", + "methods": 82, + "skip": "malformed_grammar" + }, + { + "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\"?", + "gbnf_ok": true + }, + { + "package": "docs_src/events", + "ext": ".py", + "methods": 7, + "skip": "too_diverse" + }, + { + "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 + }, + { + "package": "docs_src/generate_clients", + "ext": ".py", + "methods": 9, + "sore": "return.(route+tags)+?.name?", + "gbnf": "root ::= \"return\" (\"route\" | \"tags\")* \"name\"?", + "gbnf_ok": true + }, + { + "package": "docs_src/handling_errors", + "ext": ".py", + "methods": 13, + "skip": "too_diverse" + }, + { + "package": "docs_src/header_param_models", + "ext": ".py", + "methods": 6, + "sore": "return.headers", + "gbnf": "root ::= \"return\" \"headers\"", + "gbnf_ok": true + }, + { + "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 + }, + { + "package": "docs_src/json_base64_bytes", + "ext": ".py", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "docs_src/metadata", + "ext": ".py", + "methods": 6, + "sore": "(return+urn [{)", + "gbnf": "root ::= \"return\" | \"urn [{\"", + "gbnf_ok": true + }, + { + "package": "docs_src/path_operation_advanced_configuration", + "ext": ".py", + "methods": 9, + "skip": "malformed_grammar" + }, + { + "package": "docs_src/path_operation_configuration", + "ext": ".py", + "methods": 12, + "sore": "return.item?", + "gbnf": "root ::= \"return\" \"item\"?", + "gbnf_ok": true + }, + { + "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 + }, + { + "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 + }, + { + "package": "docs_src/pydantic_v1_in_v2", + "ext": ".py", + "methods": 3, + "sore": "return.item", + "gbnf": "root ::= \"return\" \"item\"", + "gbnf_ok": true + }, + { + "package": "docs_src/python_types", + "ext": ".py", + "methods": 13, + "skip": "too_diverse" + }, + { + "package": "docs_src/query_param_models", + "ext": ".py", + "methods": 4, + "sore": "return.filter_query", + "gbnf": "root ::= \"return\" \"filter_query\"", + "gbnf_ok": true + }, + { + "package": "docs_src/query_params", + "ext": ".py", + "methods": 6, + "skip": "too_diverse" + }, + { + "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 + }, + { + "package": "docs_src/request_files", + "ext": ".py", + "methods": 24, + "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 + }, + { + "package": "docs_src/request_form_models", + "ext": ".py", + "methods": 4, + "sore": "return.data", + "gbnf": "root ::= \"return\" \"data\"", + "gbnf_ok": true + }, + { + "package": "docs_src/response_model", + "ext": ".py", + "methods": 16, + "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 + }, + { + "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 + }, + { + "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 + }, + { + "package": "docs_src/separate_openapi_schemas", + "ext": ".py", + "methods": 4, + "sore": "return.item?.(Item+description+name)+?", + "gbnf": "root ::= \"return\" \"item\"? (\"Item\" | \"description\" | \"name\")*", + "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 + }, + { + "package": "docs_src/settings", + "ext": ".py", + "methods": 5, + "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 + }, + { + "package": "docs_src/settings/app02_an_py310", + "ext": ".py", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "docs_src/settings/app02_py310", + "ext": ".py", + "methods": 4, + "skip": "too_diverse" + }, + { + "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 + }, + { + "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\"?", + "gbnf_ok": true + }, + { + "package": "docs_src/stream_json_lines", + "ext": ".py", + "methods": 4, + "sore": "for.(in+item+items+yield)+", + "gbnf": "root ::= \"for\" (\"in\" | \"item\" | \"items\" | \"yield\")+", + "gbnf_ok": true + }, + { + "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 + }, + { + "package": "fastapi", + "ext": ".py", + "methods": 239, + "skip": "malformed_grammar" + }, + { + "package": "fastapi/_compat", + "ext": ".py", + "methods": 45, + "skip": "too_diverse" + }, + { + "package": "fastapi/dependencies", + "ext": ".py", + "methods": 38, + "skip": "too_diverse" + }, + { + "package": "fastapi/openapi", + "ext": ".py", + "methods": 19, + "skip": "too_diverse" + }, + { + "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 + }, + { + "package": "scripts", + "ext": ".py", + "methods": 132, + "skip": "malformed_grammar" + }, + { + "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 + }, + { + "package": "scripts/playwright/separate_openapi_schemas", + "ext": ".py", + "methods": 5, + "skip": "too_diverse" + }, + { + "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 + }, + { + "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 + }, + { + "package": "scripts/tests/test_translation_fixer/test_header_permalinks", + "ext": ".py", + "methods": 4, + "skip": "malformed_grammar" + }, + { + "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 + }, + { + "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\"?", + "gbnf_ok": true + }, + { + "package": "tests/test_modules_same_name_body", + "ext": ".py", + "methods": 5, + "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 + }, + { + "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\"*", + "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\"*", + "gbnf_ok": true + }, + { + "package": "tests/test_request_params/test_file", + "ext": ".py", + "methods": 97, + "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 + }, + { + "package": "tests/test_request_params/test_form", + "ext": ".py", + "methods": 97, + "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 + }, + { + "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\"*", + "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\"?", + "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\"*", + "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 + }, + { + "package": "tests/test_tutorial/test_additional_responses", + "ext": ".py", + "methods": 14, + "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 + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_advanced_middleware", + "ext": ".py", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "tests/test_tutorial/test_authentication_error_status_code", + "ext": ".py", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "tests/test_tutorial/test_background_tasks", + "ext": ".py", + "methods": 3, + "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 + }, + { + "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\"*", + "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 + }, + { + "package": "tests/test_tutorial/test_body", + "ext": ".py", + "methods": 32, + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_conditional_openapi", + "ext": ".py", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "tests/test_tutorial/test_configure_swagger_ui", + "ext": ".py", + "methods": 6, + "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 + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_cookie_params", + "ext": ".py", + "methods": 3, + "skip": "too_diverse" + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_debugging", + "ext": ".py", + "methods": 5, + "skip": "too_diverse" + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_encoder", + "ext": ".py", + "methods": 5, + "skip": "too_diverse" + }, + { + "package": "tests/test_tutorial/test_events", + "ext": ".py", + "methods": 8, + "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 + }, + { + "package": "tests/test_tutorial/test_extra_data_types", + "ext": ".py", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "tests/test_tutorial/test_extra_models", + "ext": ".py", + "methods": 13, + "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 + }, + { + "package": "tests/test_tutorial/test_first_steps", + "ext": ".py", + "methods": 3, + "skip": "too_diverse" + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_graphql", + "ext": ".py", + "methods": 3, + "skip": "too_diverse" + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_header_param_models", + "ext": ".py", + "methods": 19, + "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 + }, + { + "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 + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_metadata", + "ext": ".py", + "methods": 14, + "sore": "(client+get+in+response+status_code+text)+.json+?.snapshot+?", + "gbnf": "root ::= (\"client\" | \"get\" | \"in\" | \"response\" | \"status_code\" | \"text\")+ \"json\"* \"snapshot\"*", + "gbnf_ok": true + }, + { + "package": "tests/test_tutorial/test_openapi_callbacks", + "ext": ".py", + "methods": 5, + "skip": "too_diverse" + }, + { + "package": "tests/test_tutorial/test_openapi_webhooks", + "ext": ".py", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "tests/test_tutorial/test_path_operation_advanced_configurations", + "ext": ".py", + "methods": 18, + "skip": "malformed_grammar" + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_path_params", + "ext": ".py", + "methods": 18, + "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 + }, + { + "package": "tests/test_tutorial/test_path_params_numeric_validations", + "ext": ".py", + "methods": 29, + "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 + }, + { + "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\"*", + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_request_forms_and_files", + "ext": ".py", + "methods": 8, + "skip": "too_diverse" + }, + { + "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 + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_response_status_code", + "ext": ".py", + "methods": 3, + "skip": "too_diverse" + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_static_files", + "ext": ".py", + "methods": 4, + "skip": "too_diverse" + }, + { + "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 + }, + { + "package": "tests/test_tutorial/test_stream_json_lines", + "ext": ".py", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "tests/test_tutorial/test_strict_content_type", + "ext": ".py", + "methods": 4, + "skip": "too_diverse" + }, + { + "package": "tests/test_tutorial/test_sub_applications", + "ext": ".py", + "methods": 4, + "sore": "(client+get+response+status_code+text)+.json+.snapshot+?", + "gbnf": "root ::= (\"client\" | \"get\" | \"response\" | \"status_code\" | \"text\")+ \"json\"+ \"snapshot\"*", + "gbnf_ok": true + }, + { + "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\"*", + "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 + }, + { + "package": "tests/test_tutorial/test_websockets", + "ext": ".py", + "methods": 14, + "skip": "too_diverse" + }, + { + "package": "tests/test_validate_response_recursive", + "ext": ".py", + "methods": 3, + "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 + } +] \ No newline at end of file diff --git a/experiments/results/flask_gbnf.json b/experiments/results/flask_gbnf.json new file mode 100644 index 0000000..c076849 --- /dev/null +++ b/experiments/results/flask_gbnf.json @@ -0,0 +1,83 @@ +[ + { + "package": "examples/celery/src/task_app", + "ext": ".py", + "methods": 11, + "skip": "too_diverse" + }, + { + "package": "examples/javascript/tests", + "ext": ".py", + "methods": 5, + "skip": "too_diverse" + }, + { + "package": "examples/tutorial/flaskr", + "ext": ".py", + "methods": 18, + "skip": "too_diverse" + }, + { + "package": "examples/tutorial/tests", + "ext": ".py", + "methods": 25, + "skip": "too_diverse" + }, + { + "package": "src/flask", + "ext": ".py", + "methods": 216, + "skip": "too_diverse" + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "package": "tests/test_apps", + "ext": ".py", + "methods": 3, + "skip": "too_diverse" + }, + { + "package": "tests/test_apps/blueprintapp/apps", + "ext": ".py", + "methods": 4, + "sore": "return.render_template+", + "gbnf": "root ::= \"return\" \"render_template\"+", + "gbnf_ok": true + }, + { + "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\"*", + "gbnf_ok": true + }, + { + "package": "(other)", + "ext": ".py", + "methods": 4 + } +] \ No newline at end of file diff --git a/experiments/results/ragsak_gbnf.json b/experiments/results/ragsak_gbnf.json index 9e52e4e..4247073 100644 --- a/experiments/results/ragsak_gbnf.json +++ b/experiments/results/ragsak_gbnf.json @@ -11,9 +11,7 @@ "package": "agents/capability/ports/src/main/kotlin/eu/corentic/springrag/agent/capability", "ext": ".kt", "methods": 5, - "sore": "listCapabilities?.AgentExecutionContext?.DescribedAgentCapability?.firstOrNull+?.TransportExposedAgentCapability?.id?.return AgentCapabilityDescriptor(\n id = id,\n capabilityType = capabilityType,\n displayName = describedCapability?.displayName ?: id,\n description = describedCapability?.description,\n exposedOverHttp = exposedCapability?.exposedOverHttp ?: false,\n exposedOverMcp = exposedCapability?.exposedOverMcp ?: false\n )?.AgentCapabilityDescriptor?.displayName?.description?.exposedOverHttp?.exposedOverMcp?", - "gbnf_error": "Expected RPAREN, got ('LITERAL', ': id, description = describedCapability')", - "gbnf_ok": false + "skip": "malformed_grammar" }, { "package": "agents/capability/support/src/main/kotlin/eu/corentic/springrag/agent/capability/support", @@ -45,8 +43,8 @@ "package": "agents/rag/embabel/src/main/kotlin/eu/corentic/springrag/agent/rag/embabel", "ext": ".kt", "methods": 58, - "sore": "shouldRetrieve?.buildObservationContext?.(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 ::= \"shouldRetrieve\"? \"buildObservationContext\"? (\"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\"*", + "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 }, { @@ -59,9 +57,7 @@ "package": "agents/rag/embabel/src/test/kotlin/eu/corentic/springrag/agent/rag/embabel", "ext": ".kt", "methods": 36, - "sore": "very?.messageWindowMemory?.removeFirst+?.ery {?.unmockkAll?.(mockkObject+runTest)?.istKnowledgeBases(+?.add+?.return ChatResponse(listOf(Generation(AssistantMessage(content))))?.stKnowledgeBases()+?.(agRequest(+equest.+f(+heckKnowledgeBase(+nowledgeBaseId)+ssertEquals(+ssertNull()+?.(ASSISTANT+Agent+AgentProcess+AssistantMessage+ChatGraphLookupPort+ChatResponse+Companion+ConversationMemoryContext+DEFAULT_CONVERSATION_ID+DefaultEmbabelRagResponseInvoker+DirectAnswerDecision+EmbabelJudgeDecision+EmbabelLibreChatRetrievalAgent+EmbabelPlatformRagAgent+EmbabelRagDecisionPolicy+EmbabelRagWorkflowAgentProperties+EmbabelWorkflowObservationContext+EmbabelWorkflowObservationConvention+EmbabelWorkflowPromptService+Generation+InMemoryChatMemoryRepository+JudgeOutcome+LibreChatRetrievalRequest+NOOP+NoOpCircuitBreakerFactory+PageTextElement+ProcessOptions+Prompt+RagDecisionState+RagInvocation+RagRequest+RecordingChatModel+RetrievalPort+RetrievalQueryDraft+RetrievedEvidence+SpringAiEmbabelWorkflowPromptService+USER+UserMessage+VectorChunk+VectorDocumentPort+WORKFLOW_ORIGIN_CAPABILITY_KEY+WORKFLOW_STEP_KEY+WORKFLOW_TRANSPORT_KEY+advisors+agents+answer+any+anyMatch+applyRetrieveCost+asKnowledgeBaseId+assertEquals+assertNull+assertTrue+blackboard+build+builder+capture+captured+chatMemoryRepository+contains+context+contextId+conversationId+copy+createAgentProcessFrom+decision+decisionState+docs+draftAnswer+draftClarification+emptyList+enoughEvidence+every+executionContext+findExpandedTableMarkdown+findTextOnSamePage+first+get+getLowCardinalityKeyValues+http+invoke+isEmpty+java+judgeDecision+judgeEvidence+key+knowledgeBaseId+last+listOf+mapOf+maxMessages+message+messageType+mockk+name+nextAction+normalize+of+options+orEmpty+outcome+prompt+prompts+query+request+requireNotNull+resultOfType+retrievalRounds+retrieveInitialEvidence+retrieveMoreEvidence+run+searchByJobIds+searchSimilar+single+size+slot+stream+systemMessage+text+userMessage+value+verify)+?.ptyList()+?.vailableKnowledgeBases.?.gRequest(m?.ize)?.eckKnowledgeBase(r+?.ckKnowledgeBase(re+?.(sertEquals(f+sertNull(o)?.sertEquals(K?.ertEquals(Kn?.(\"+?.\"k+?.(owledgeBaseId =+quest.k+sDefaultKb)+sertEquals(t)+?.uest.kn?.owledgeBaseId)?.wledgeBaseId)?", - "gbnf_error": "Unexpected token: ('PLUS', '+')", - "gbnf_ok": false + "skip": "malformed_grammar" }, { "package": "agents/rag/embabel/src/test/kotlin/eu/corentic/springrag/testsupport", @@ -169,9 +165,7 @@ "package": "app/src/e2eTest/kotlin/eu/corentic/springrag/e2e/cucumber/steps", "ext": ".kt", "methods": 17, - "sore": "(File+absoluteFile+listOf)+?.@?.randomUUID+?.requireNotNull+?.createKnowledgeBase?.(pollJobToCompletion+reset)+?.for?.Suppress+?.toString+?.currentTimeMillis+?.if?.substring+?.exists+?.registerUser?.return f?.login?.(APPLICATION_JSON+Any+MULTIPART_FORM_DATA+Map+MultipartBodyBuilder+String+assertNotNull+atMost+await+blockFirst+body+bodyValue+build+contentType+currentJobId+else+error+exchange+expectBody+expectStatus+findTestFile+fromMultipartData+get+header+isAccepted+isCreated+isOk+java+knowledgeBaseId+mapOf+name+ofMinutes+ofSeconds+part+pollInterval+post+readBytes+responseBody+return body ?: error(\"Create KB response body was null\")+return response?.get(\"answer\") as? String ?: \"\"+return response?.get(\"token\") as? String\n ?: error(\"Login response missing token\")+return@until false+returnResult+secondKnowledgeBaseId+status+until+uri+value+when)+?.authToken?.lastChatResponse?.assertEquals?.chat?", - "gbnf_error": "Expected RPAREN, got ('LITERAL', ': error')", - "gbnf_ok": false + "skip": "malformed_grammar" }, { "package": "app/src/integrationTest/kotlin/eu/corentic/springrag/config", @@ -203,17 +197,13 @@ "package": "app/src/systemTest/kotlin/eu/corentic/springrag/system", "ext": ".kt", "methods": 46, - "sore": "queryForObject+?.session+?.MultipartBodyBuilder?.(createKnowledgeBase+newClient+runBlocking)+?.Long+?.use+?.part+?.run+?.readBytes+?.parameters+?.header+?.(COMPLETED+CallToolRequest+ClassPathResource+FAILED+IllegalStateException+JobStatus+List+MULTIPART_FORM_DATA+Map+McpSchema+PARTIAL_SUCCESS+String+TextContent+VectorChunk+absolutePath+add+adminClient+any+asJobId+assertEquals+assertNotEquals+assertNotNull+assertTrue+atMost+await+blockFirst+body+bodyValue+build+callTool+contains+content+contentType+copyTestDocument+count+countKnowledgeBaseNodes+countNodesByJobId+delete+documents+else+error+exchange+exists+expectBody+expectStatus+fail+fetchByJobId+file+filename+filter+first+fromMultipartData+get+getJobStatus+if+isAccepted+isCreated+isEmpty+isNoContent+isNotEmpty+isOk+java+length+listOf+map+mapNotNull+mapOf+metadata+mutate+name+ofMinutes+ofSeconds+path+pollInterval+post+queryParam+responseBody+responseTimeout+result+return response?.get(\"id\") as? String\n ?: error(\"Create knowledge base response missing id: $response\")+return response?.get(\"jobId\") as? String\n ?: error(\"Upload response missing jobId: $response\")+return terminalStatus ?: error(\"Job $jobId did not reach a terminal state in time\")+returnResult+searchSimilar+single+size+startJob+status+structuredContent+take+text+throw+try+until+uploadAsync+uploadAsyncMulti+uploadAsyncToKb+uri+value+waitForCompletedJob+waitForIndexedChunks+waitForTerminalStatus+waitUntil+when)+.finally?.asLong+?.toPath+?.closeGracefully+?.resolve+?.copy+?.REPLACE_EXISTING?.return target.toFile()?.toFile+?", - "gbnf_error": "Expected RPAREN, got ('LITERAL', 'as')", - "gbnf_ok": false + "skip": "malformed_grammar" }, { "package": "app/src/test/kotlin/eu/corentic/springrag/architecture", "ext": ".kt", "methods": 87, - "sore": "eFromProject()+?.(filesIn+productionClasses+scopeFromProject)+?.ses()+?.(any+assertTrue+containingFile+contains+endsWith+exists+fileName+filter+filterNot+flatMap+forEach+functions+hasImport+if+listOf+name+path+productionFiles+readString+resideInPackage+resolve+startsWith+text+toString)+?.(.con+==+rtTrue(+t { i)+?", - "gbnf_error": "Unexpected token: ('RPAREN', ')')", - "gbnf_ok": false + "skip": "malformed_grammar" }, { "package": "app/src/test/kotlin/eu/corentic/springrag/config", @@ -255,9 +245,7 @@ "package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/controller", "ext": ".kt", "methods": 58, - "sore": "getJobStatus+?.bindingResult?.return ResponseEntity.noContent().build()?.(mutableListOf+return ResponseEntity.ok(response))+?.return if (status != null) {\n ResponseEntity.ok(status)\n } else {\n ResponseEntity.notFound().build()\n }?.fieldErrors?.noContent+?.joinToString+?.field?.defaultMessage?.(BAD_REQUEST+CONFLICT+CREATED+DataBuffer+ErrorResponse+InvalidUploadRequestException+KnowledgeBaseNotFoundException+NOT_FOUND+PAYLOAD_TOO_LARGE+RuntimeException+TimeoutCancellationException+accepted+add+agentId+batchUploadRoot+body+buffer+catch+cleanupManagedUpload+content+conversationId+core+else+error+errorCode+filename+handle+headers+if+io+knowledgeBaseExists+knowledgeBaseId+map+mapOf+maxFileError+maxUploadBytes+message+name+next+of+ok+password+randomUUID+readableByteCount+registerBatch+release+return ResponseEntity.status(HttpStatus.BAD_REQUEST)\n .body(ErrorResponse(\"VALIDATION_ERROR\", \"Validation failed\", errors))+size+springframework+startBulkJob+startJob+status+throw+throw KnowledgeBaseNotFoundException(knowledgeBaseId)+throw e+toString+try+username+value+warn+withTimeout)+?.ChatResponse?.let+?.notFound+?.emptyList+?.write+?.build+?.then+?.awaitSingleOrNull+?", - "gbnf_error": "Unexpected token: ('RPAREN', ')')", - "gbnf_ok": false + "skip": "malformed_grammar" }, { "package": "entrypoints/web/src/main/kotlin/eu/corentic/springrag/controller/librechat", @@ -275,8 +263,8 @@ "package": "entrypoints/web/src/test/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 4, - "sore": "bindToWebHandler+?.webTestClient?.from+?.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\"* \"webTestClient\"? \"from\"* \"WebHandler\"? \"post\"* (\"OK\" | \"response\" | \"setStatusCode\")* \"setComplete\"* \"webFilter\"* \"build\"* (\"AtomicReference\" | \"String\")* \"WebFilterChain\"? (\"assertEquals\" | \"assertNull\" | \"block\" | \"empty\" | \"filter\" | \"get\" | \"set\")* \"uri\"* \"exchange\"* \"expectStatus\"* \"isOk\"?", + "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\"?", "gbnf_ok": true }, { @@ -329,16 +317,16 @@ "package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 6, - "sore": "assertThrows?.IllegalArgumentException?.java?.OllamaClientProperties?.EmbabelAiHttpClientProperties?.Timeout+?.(assertEquals+baseUrl+ofSeconds+readTimeout+writeTimeout)+.timeout?.connectTimeout?.read?", - "gbnf": "root ::= \"assertThrows\"? \"IllegalArgumentException\"? \"java\"? \"OllamaClientProperties\"? \"EmbabelAiHttpClientProperties\"? \"Timeout\"* (\"assertEquals\" | \"baseUrl\" | \"ofSeconds\" | \"readTimeout\" | \"writeTimeout\")+ \"timeout\"? \"connectTimeout\"? \"read\"?", + "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 }, { "package": "infrastructure/adapters/ai-provider/src/test/kotlin/eu/corentic/springrag/health", "ext": ".kt", "methods": 4, - "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\"", + "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\"", "gbnf_ok": true }, { @@ -387,8 +375,8 @@ "package": "infrastructure/adapters/doc-parser/src/test/kotlin/eu/corentic/springrag/config", "ext": ".kt", "methods": 12, - "sore": "DoclingConfig?.doclingServeApi+?.PipelineOptions?.trimIndent+?.baseUrl?.assertNotNull+?.(assertNull+concurrency+layoutBatchSize+ocrBatchSize+tableBatchSize)+?.lines+?.(imageExportMode+includeImages+options+useS3Target)+?.toString+?.documentTimeout?.(indexOfFirst+startsWith+trimStart)+?.s3Target?.(assertThat+contains+doesNotContain+isGreaterThan)+?.bucket?.assertThatThrownBy?.validateCriticalSettings+?.isInstanceOf+?.IllegalStateException?.java?.hasMessageContaining+?", - "gbnf": "root ::= \"DoclingConfig\"? \"doclingServeApi\"* \"PipelineOptions\"? \"trimIndent\"* \"baseUrl\"? \"assertNotNull\"* (\"assertNull\" | \"concurrency\" | \"layoutBatchSize\" | \"ocrBatchSize\" | \"tableBatchSize\")* \"lines\"* (\"imageExportMode\" | \"includeImages\" | \"options\" | \"useS3Target\")* \"toString\"* \"documentTimeout\"? (\"indexOfFirst\" | \"startsWith\" | \"trimStart\")* \"s3Target\"? (\"assertThat\" | \"contains\" | \"doesNotContain\" | \"isGreaterThan\")* \"bucket\"? \"assertThatThrownBy\"? \"validateCriticalSettings\"* \"isInstanceOf\"* \"IllegalStateException\"? \"java\"? \"hasMessageContaining\"*", + "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\"*", "gbnf_ok": true }, { @@ -425,9 +413,7 @@ "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/repository", "ext": ".kt", "methods": 24, - "sore": "n(+?.ace(\"\\\\+?.ithCircuitBreaker { v?.peFilterValue(val?.mutableListOf+?.Document?.debug+?.((+Empty()+stinct()+turn)+?.VectorChunk?.pplier {?.ace(\"'\"+?.te(fil+?.String+?.orEmpty+?.size?.turn emptyList()?.inToString(s+?.NotEmpty()+?.toMap+?.tion()?.toMutableMap+?.(add+build+builder+distinct+emptyList+escapeFilterValue+filterExpression+if+isEmpty+isNullOrEmpty+joinToString+query+return emptyList()+return runWithCircuitBreaker { vectorStore.similaritySearch(request).map { it.toVectorChunk() } }+runWithCircuitBreaker+topK+value)+?.ptyList()+?.legalStateException(\"?.apply+?.similaritySearch+?.inToString(\"+?.rn {+?.putIfAbsent?.map+?.capeFilterValue(i?.ssage}\"?.(toSpringDocument+toVectorChunk)+?.ilder()+?.w cause?.ery(\"+?.w cau?.pK(5+?.pK(1+?.ze)?.lterExpression(\"+?.lterExpression(f+?.lterExpression(+?.(capeFilterValue(j+capeFilterValue(k)?.capeFilterValue(d?.inToString(+?.capeFilterValue(l?.lue)}?.leteByFilter(f?.ild()+?.lterEquals(M?.turn runWithCircuitBreaker { vectorStore.similaritySearch(request).map { it.toVectorChunk() } }?.lue))?.nWithCircuitBreaker {?.milaritySearch(r+?.lete(i+?.p {+?.VectorChunk()+?", - "gbnf_error": "Unexpected token: ('PLUS', '+')", - "gbnf_ok": false + "skip": "malformed_grammar" }, { "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/agent", @@ -453,17 +439,13 @@ "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/port/adapter", "ext": ".kt", "methods": 45, - "sore": "(Regex+emptyList+if+isNullOrBlank+replace+return emptyList())+?.save+?.deleteByJobId+?.of+?.findById+?.toNode+?.value+?.map+?.orElse+?.text?.toDomain+?.let+?.storageUri?.(imageType+pageNo)+?", - "gbnf_error": "Unexpected token: ('RPAREN', ')')", - "gbnf_ok": false + "skip": "malformed_grammar" }, { "package": "infrastructure/adapters/search/src/main/kotlin/eu/corentic/springrag/service/storage", "ext": ".kt", "methods": 40, - "sore": "replace+?.loadObject?.when?.buildImageKey?.(listObjects+return parseStorageUri(storageUri)\n ?: S3Location(bucket = properties.bucket, key = storageUri.trimStart('/')))?.ifBlank+?.return storeObject(key, bytes, contentTypeFor(format))?.lowercase+?.storeObject?.return StorageUri.of(\"images/${jobId.value}/$sanitizedId.$extension\")?.contentTypeFor?.(BlobListOption+GcsLocation+NoSuchBucketException+ObjectIdentifier+S3Exception+S3Location+amazon+awssdk+bucket+build+builder+catch+chunked+contentType+contents+create+credentialsProvider+delete+deleteObject+deleteObjects+else+fromBytes+get+getObject+headObject+if+isBlank+isEmpty+iterateAll+key+list+listObjectsV2+map+mapNotNull+model+name+objects+of+parseS3Location+parseStorageUri+prefix+putObject+readAllBytes+region+resolveLocation+return 0+return StorageUri.of(\"s3://${location.bucket}/${location.key}\")+return false+return null+return parseS3Location(storageUri, properties.bucket)\n ?: run {\n if (storageUri.startsWith(\"s3://\")) {\n logger.warn { \"Invalid storage URI: $storageUri\" }\n }\n null\n }+return response.contents().map { obj -> StorageUri.of(\"s3://${location.bucket}/${obj.key()}\") }+return try {\n s3Client.deleteObject(\n DeleteObjectRequest.builder()\n .bucket(location.bucket)\n .key(location.key)\n .build()\n )\n true\n } catch (ex: S3Exception) {\n if (ex.statusCode() == 404) false else throw ex\n }+return try {\n s3Client.getObject({ builder ->\n builder.bucket(location.bucket).key(location.key)\n }).readAllBytes()\n } catch (ex: NoSuchBucketException) {\n logger.warn { \"S3 bucket missing for object retrieval: ${location.bucket}\" }\n null\n } catch (ex: S3Exception) {\n logger.warn(ex) { \"Failed to load object from S3: ${storageUri.value}\" }\n null\n }+return try {\n s3Client.headObject(\n HeadObjectRequest.builder()\n .bucket(location.bucket)\n .key(location.key)\n .build()\n )\n true\n } catch (_: NoSuchBucketException) {\n false\n } catch (ex: S3Exception) {\n if (ex.statusCode() == 404) false else throw ex\n }+run+s3+services+startsWith+statusCode+sumOf+toList+trimEnd+trimStart+try+value+warn)+?.size?.throw ex?.throw?", - "gbnf_error": "Expected RPAREN, got ('LITERAL', '')", - "gbnf_ok": false + "skip": "malformed_grammar" }, { "package": "infrastructure/adapters/search/src/systemTest/kotlin/eu/corentic/springrag/config", @@ -493,8 +475,8 @@ "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/health", "ext": ".kt", "methods": 6, - "sore": "(HealthCheckReply+`when`+collectionExistsAsync+getDefaultInstance+healthCheckAsync+immediateFuture+thenReturn+verifyConnectivityAsync)+.failedFuture+?.immediateFailedFuture+?.completedFuture+?.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\")+ \"failedFuture\"* \"immediateFailedFuture\"* \"completedFuture\"* \"IllegalStateException\"? (\"InterruptedException\" | \"TimeoutException\")? (\"Neo4jDriverHealthIndicator\" | \"QdrantVectorStoreHealthIndicator\" | \"assertEquals\" | \"assertTrue\" | \"block\" | \"code\" | \"currentThread\" | \"health\" | \"interrupted\" | \"isInterrupted\" | \"requireNotNull\" | \"status\")+", + "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 }, { @@ -521,8 +503,8 @@ "package": "infrastructure/adapters/search/src/test/kotlin/eu/corentic/springrag/service/graph", "ext": ".kt", "methods": 30, - "sore": "assertThrows?.GraphDocument?.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)+?.GraphIngestionOrchestrator?.captured?.NoOpCircuitBreakerFactory?.(assertEquals+assertNotNull+assertNull+doclingId+first+height+imageData+imageType+page+pageNo+pages+pictureElements+rendering+size+storageUri+textElements+width)+?.text?", - "gbnf": "root ::= \"assertThrows\"? \"GraphDocument\"? \"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\")* \"GraphIngestionOrchestrator\"? \"captured\"? \"NoOpCircuitBreakerFactory\"? (\"assertEquals\" | \"assertNotNull\" | \"assertNull\" | \"doclingId\" | \"first\" | \"height\" | \"imageData\" | \"imageType\" | \"page\" | \"pageNo\" | \"pages\" | \"pictureElements\" | \"rendering\" | \"size\" | \"storageUri\" | \"textElements\" | \"width\")* \"text\"?", + "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 }, { @@ -555,9 +537,7 @@ "package": "modules/chat/src/main/kotlin/eu/corentic/springrag/service/chat", "ext": ".kt", "methods": 6, - "sore": "let+?.info+?.KnowledgeBaseId?.defaultAgentId+?.(RagInvocation+RagRequest+invoke+return ragAgentInvocationGateway.invoke(\n RagInvocation(\n request = request,\n executionContext = AgentExecutionContext.http()\n )\n )+return ragAgentInvocationGateway.invoke(\n RagInvocation(\n request = request,\n executionContext = AgentExecutionContext.http(contextId = conversationId)\n )\n ))+?.listCapabilities+?.http+?.map+?.filter+?.id?.AgentCapabilityDescriptor?", - "gbnf_error": "Unexpected token: ('RPAREN', ')')", - "gbnf_ok": false + "skip": "malformed_grammar" }, { "package": "modules/chat/src/systemTest/kotlin/eu/corentic/springrag/config", @@ -587,8 +567,8 @@ "package": "modules/common/src/main/kotlin/eu/corentic/springrag/common/ids", "ext": ".kt", "methods": 18, - "sore": "of+?.(removeSuffix+trim)+?.requireNonBlankNoWhitespace?.(DocumentId+JobId+KnowledgeBaseId+LogicalDocumentId)?.trimStart+?.requireSafeId?.return StorageUri(\"$base/$relative\")?.StorageUri?.requireNonBlank?.(contains+isNotEmpty+require)+?.return Filename(normalized)?.any+?.matches+?.return BatchId(normalized)?.Filename?.isWhitespace+?.BatchId?.return normalized?", - "gbnf": "root ::= \"of\"* (\"removeSuffix\" | \"trim\")* \"requireNonBlankNoWhitespace\"? (\"DocumentId\" | \"JobId\" | \"KnowledgeBaseId\" | \"LogicalDocumentId\")? \"trimStart\"* \"requireSafeId\"? \"return StorageUri\" \"\\\"$base/$relative\\\"\"? \"StorageUri\"? \"requireNonBlank\"? (\"contains\" | \"isNotEmpty\" | \"require\")* \"return Filename\" \"normalized\"? \"any\"* \"matches\"* \"return BatchId\" \"normalized\"? \"Filename\"? \"isWhitespace\"* \"BatchId\"? \"return normalized\"?", + "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\"?", "gbnf_ok": true }, { @@ -759,8 +739,8 @@ "package": "modules/security/src/test/kotlin/eu/corentic/springrag/security/service", "ext": ".kt", "methods": 15, - "sore": "(encode+every+existsByUsername)+?.JwtService?.init+?.JwtProperties?.UserService?.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\")* \"JwtService\"? \"init\"* \"JwtProperties\"? \"UserService\"? \"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\")?", + "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\")?", "gbnf_ok": true }, { @@ -809,8 +789,6 @@ "package": "tools/setup-ui", "ext": ".go", "methods": 44, - "sore": "g)?.wStyle()+?.([]s+?.(ng{}+rr)+?.lor(\"+?.ng, 0,+?.i :?.m.s+?..s?.s[i].?.(\"BA+\"NE+\"SP+(cfg+Cmd+Index = i+Quit+StepModel()+String+Update+View+_,+al+case+cfg+edKeys(cfg+en+errMessage+fg+if+iles, \",+input+key+kind+lServices, \",+lServicesMode ==+ldRun(&m.+list+menu+mode+model+nd(cfg+optionItem+oyChoice !=+oyChoice ==+return+rn\n\t\t}+rn \"\"+rn tru+shouldStart+shouldWriteEnv+stepIndex+steps+switch+syncStepModel+te+tea+title+{)+?.ocalService(\"ol+?.map?.rn str?.turn s?.string+?.(lin+?.in([+?.ader(\"+?", - "gbnf": "root ::= \"g\"", - "gbnf_ok": true + "skip": "malformed_grammar" } ] \ No newline at end of file