failed WRONG_FIX wrong_fix · 13 tool calls · 218 s · fastapi/fastapi
🗑️ Deprecate `ORJSONResponse` and `UJSONResponse` 🗑️ Deprecate `ORJSONResponse` and `UJSONResponse` Now that there's better performance by default, with response models: https://github.com/fastapi/fastapi/pull/14962 This removes `ujson` and `orjson` from the `"fastapi[all]"` extras. To use these responses, `ujson` or `orjson` need to be explicitly installed.
| # | Tool | Arguments | Result |
|---|---|---|---|
| 1 | run_command | {
"command": "grep -rn \"ORJSONResponse\" fastapi | head -20"
} | {"status": "ok", "stdout": "fastapi/responses.py:36:class ORJSONResponse(JSONResponse):\nfastapi/responses.py:45: assert orjson is not None, \"orjson must be infull{"status": "ok", "stdout": "fastapi/responses.py:36:class ORJSONResponse(JSONResponse):\nfastapi/responses.py:45: assert orjson is not None, \"orjson must be installed to use ORJSONResponse\"\nfastapi/applications.py:369: from fastapi.responses import ORJSONResponse\nfastapi/applications.py:371: app = FastAPI(default_response_class=ORJSONResponse)\nfastapi/applications.py:1461: from fastapi.responses import ORJSONResponse\nfastapi/applications.py:1469: default_response_class=ORJSONResponse,\n", "stderr": "", "exit_code": 0} |
| 2 | run_command | {
"command": "grep -rn \"UJSONResponse\" fastapi | head -20"
} | {"status": "ok", "stdout": "fastapi/responses.py:23:class UJSONResponse(JSONResponse):\nfastapi/responses.py:32: assert ujson is not None, \"ujson must be instafull{"status": "ok", "stdout": "fastapi/responses.py:23:class UJSONResponse(JSONResponse):\nfastapi/responses.py:32: assert ujson is not None, \"ujson must be installed to use UJSONResponse\"\n", "stderr": "", "exit_code": 0} |
| 3 | run_command | {
"command": "sed -n '20,50p' fastapi/responses.py"
} | {"status": "ok", "stdout": " orjson = None # type: ignore\n\n\nclass UJSONResponse(JSONResponse):\n \"\"\"\n JSON response using the high-performance ujson librfull{"status": "ok", "stdout": " orjson = None # type: ignore\n\n\nclass UJSONResponse(JSONResponse):\n \"\"\"\n JSON response using the high-performance ujson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n \"\"\"\n\n def render(self, content: Any) -> bytes:\n assert ujson is not None, \"ujson must be installed to use UJSONResponse\"\n return ujson.dumps(content, ensure_ascii=False).encode(\"utf-8\")\n\n\nclass ORJSONResponse(JSONResponse):\n \"\"\"\n JSON response using the high-performance orjson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n \"\"\"\n\n def render(self, content: Any) -> bytes:\n assert orjson is not None, \"orjson must be installed to use ORJSONResponse\"\n return orjson.dumps(\n content, option=orjson.OPT_NON_STR_KEYS | orjson.OPT_SERIALIZE_NUMPY\n )\n", "stderr": "", "exit_code": 0} |
| 4 | run_command | {
"command": "grep -rn \"warnings\" fastapi/responses.py"
} | {"status": "error", "error_type": "CommandError", "error_message": "", "details": {"stdout": "", "stderr": "", "exit_code": 1}}full{"status": "error", "error_type": "CommandError", "error_message": "", "details": {"stdout": "", "stderr": "", "exit_code": 1}} |
| 5 | run_command | {
"command": "grep -rn \"warnings\" fastapi | head -20"
} | {"status": "ok", "stdout": "fastapi/params.py:1:import warnings\nfastapi/params.py:76: warnings.warn(\nfastapi/params.py:106: warnings.warn(\nfastapi/params.py:full{"status": "ok", "stdout": "fastapi/params.py:1:import warnings\nfastapi/params.py:76: warnings.warn(\nfastapi/params.py:106: warnings.warn(\nfastapi/params.py:521: warnings.warn(\nfastapi/params.py:551: warnings.warn(\nfastapi/openapi/utils.py:4:import warnings\nfastapi/openapi/utils.py:218: warnings.warn(\nfastapi/openapi/utils.py:254: warnings.warn(message, stacklevel=1)\nfastapi/utils.py:2:import warnings\nfastapi/utils.py:83: warnings.warn(\nfastapi/exceptions.py:255: Ref: https://sethmlarson.dev/deprecations-via-warnings-dont-work-for-python-libraries\nfastapi/_compat/shared.py:3:import warnings\nfastapi/_compat/shared.py:182: with warnings.catch_warnings():\nfastapi/_compat/shared.py:183: warnings.simplefilter(\"ignore\", UserWarning)\nfastapi/_compat/shared.py:194: with warnings.catch_warnings():\nfastapi/_compat/shared.py:195: warnings.simplefilter(\"ignore\", UserWarning)\nfastapi/_compat/v2.py:2:import warnings\nfastapi/_compat/v2.py:129: with warnings.catch_warnings():\nfastapi/_compat/v2.py:135: from pydantic.warnings import UnsupportedFieldAttributeWarning\nfastapi/_compat/v2.py:137: warnings.simplefilter(\n", "stderr": "", "exit_code": 0} |
| 6 | run_command | {
"command": "cd /workspace && python3 - <<'PY'\nfrom pathlib import Path\np = Path(\"fastapi/responses.py\")\ns = p.read_text()\n\n# Add import warnings at the top\nif \"import warnings\" not in s:\n # Find a good place for imports. Let's look for where other imports are.\n # Usually at the top.\n lines = s.splitlines()\n # Find the first line that isn't a docstring or comment and insert before it, \n # or just at the top.\n # Let's just prepend it.\n s = \"import warnings\\n\" + s\n\n# Deprecate UJSONResponse\nold_ujson = \"\"\"class UJSONResponse(JSONResponse):\n \\\"\\\"\\\"\n JSON response using the high-performance ujson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n \\\"\\\"\\\"\"\"\"\nnew_ujson = \"\"\"class UJSONResponse(JSONResponse):\n \\\"\\\"\\\"\n JSON response using the high-performance ujson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n\n .. deprecated:: 0.109.1\n Use `JSONResponse` instead.\n \\\"\\\"\\\"\n def __init__(self, *args, **kwargs):\n warnings.warn(\n \"UJSONResponse is deprecated. Use JSONResponse instead.\",\n DeprecationWarning,\n stacklevel=2,\n )\n super().__init__(*args, **kwargs)\"\"\"\n\n# Deprecate ORJSONResponse\nold_orjson = \"\"\"class ORJSONResponse(JSONResponse):\n \\\"\\\"\\\"\n JSON response using the high-performance orjson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n \\\"\\\"\\\"\"\"\"\nnew_orjson = \"\"\"class ORJSONResponse(JSONResponse):\n \\\"\\\"\\\"\n JSON response using the high-performance orjson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n\n .. deprecated:: 0.109.1\n Use `JSONResponse` instead.\n \\\"\\\"\\\"\n def __init__(self, *args, **kwargs):\n warnings.warn(\n \"ORJSONResponse is deprecated. Use JSONResponse instead.\",\n DeprecationWarning,\n stacklevel=2,\n )\n super().__init__(*args, **kwargs)\"\"\"\n\n# We need to be careful with the exact strings. Let's use a more robust replacement.\n# Actually, the provided strings might not match exactly due to indentation or quotes.\n# Let's use a different approach.\nPY\n"
} | {"status": "ok", "stdout": "", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "", "stderr": "", "exit_code": 0} |
| 7 | run_command | {
"command": "sed -n '1,30p' fastapi/responses.py"
} | {"status": "ok", "stdout": "from typing import Any\n\nfrom starlette.responses import FileResponse as FileResponse # noqa\nfrom starlette.responses import HTMLRfull{"status": "ok", "stdout": "from typing import Any\n\nfrom starlette.responses import FileResponse as FileResponse # noqa\nfrom starlette.responses import HTMLResponse as HTMLResponse # noqa\nfrom starlette.responses import JSONResponse as JSONResponse # noqa\nfrom starlette.responses import PlainTextResponse as PlainTextResponse # noqa\nfrom starlette.responses import RedirectResponse as RedirectResponse # noqa\nfrom starlette.responses import Response as Response # noqa\nfrom starlette.responses import StreamingResponse as StreamingResponse # noqa\n\ntry:\n import ujson\nexcept ImportError: # pragma: nocover\n ujson = None # type: ignore\n\n\ntry:\n import orjson\nexcept ImportError: # pragma: nocover\n orjson = None # type: ignore\n\n\nclass UJSONResponse(JSONResponse):\n \"\"\"\n JSON response using the high-performance ujson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n \"\"\"\n\n", "stderr": "", "exit_code": 0} |
| 8 | run_command | {
"command": "cd /workspace && python3 - <<'PY'\nfrom pathlib import Path\np = Path(\"fastapi/responses.py\")\ns = p.read_text()\n\n# Add import warnings\nif \"import warnings\" not in s:\n # Insert after the first line\n lines = s.splitlines()\n lines.insert(1, \"import warnings\")\n s = \"\\n\".join(lines)\n\n# Deprecate UJSONResponse\n# We search for the class definition and its docstring, then insert the __init__ method.\n# The docstring ends at line 31 (approximately).\n# Let's use a more precise replacement.\n\n# UJSONResponse\nujson_start = s.find(\"class UJSONResponse(JSONResponse):\")\nujson_doc_end = s.find('\"\"\"', ujson_start + 1) # This is the start of docstring\n# Wait, the docstring is:\n# \"\"\"\n# JSON response using the high-performance ujson library to serialize data to JSON.\n#\n# Read more about it in the\n# [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n# \"\"\"\n\n# Let's just replace the whole class definition until the first method.\n# But it's easier to just replace the docstring and add the __init__.\n\n# Let's try to find the exact docstring.\nujson_doc = \"\"\" \\\"\\\"\\\"\n JSON response using the high-performance ujson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n \\\"\\\"\\\"\"\"\"\n\nujson_new_doc = \"\"\" \\\"\\\"\\\"\n JSON response using the high-performance ujson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n\n .. deprecated:: 0.109.1\n Use `JSONResponse` instead.\n \\\"\\\"\\\"\n def __init__(self, *args, **kwargs):\n warnings.warn(\n \"UJSONResponse is deprecated. Use JSONResponse instead.\",\n DeprecationWarning,\n stacklevel=2,\n )\n super().__init__(*args, **kwargs)\"\"\"\n\ns = s.replace(ujson_doc, ujson_new_doc)\n\n# ORJSONResponse\norjson_doc = \"\"\" \\\"\\\"\\\"\n JSON response using the high-performance orjson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n \\\"\\\"\\\"\"\"\"\n\norjson_new_doc = \"\"\" \\\"\\\"\\\"\n JSON response using the high-performance orjson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n\n .. deprecated:: 0.109.1\n Use `JSONResponse` instead.\n \\\"\\\"\\\"\n def __init__(self, *args, **kwargs):\n warnings.warn(\n \"ORJSONResponse is deprecated. Use JSONResponse instead.\",\n DeprecationWarning,\n stacklevel=2,\n )\n super().__init__(*args, **kwargs)\"\"\"\n\ns = s.replace(orjson_doc, orjson_new_doc)\n\np.write_text(s)\nPY\n"
} | {"status": "ok", "stdout": "", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "", "stderr": "", "exit_code": 0} |
| 9 | run_command | {
"command": "sed -n '20,60p' fastapi/responses.py"
} | {"status": "ok", "stdout": "except ImportError: # pragma: nocover\n orjson = None # type: ignore\n\n\nclass UJSONResponse(JSONResponse):\n \"\"\"\n JSON responsfull{"status": "ok", "stdout": "except ImportError: # pragma: nocover\n orjson = None # type: ignore\n\n\nclass UJSONResponse(JSONResponse):\n \"\"\"\n JSON response using the high-performance ujson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n\n .. deprecated:: 0.109.1\n Use `JSONResponse` instead.\n \"\"\"\n def __init__(self, *args, **kwargs):\n warnings.warn(\n \"UJSONResponse is deprecated. Use JSONResponse instead.\",\n DeprecationWarning,\n stacklevel=2,\n )\n super().__init__(*args, **kwargs)\n\n def render(self, content: Any) -> bytes:\n assert ujson is not None, \"ujson must be installed to use UJSONResponse\"\n return ujson.dumps(content, ensure_ascii=False).encode(\"utf-8\")\n\n\nclass ORJSONResponse(JSONResponse):\n \"\"\"\n JSON response using the high-performance orjson library to serialize data to JSON.\n\n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n\n .. deprecated:: 0.109.1\n Use `JSONResponse` instead.\n \"\"\"\n def __init__(self, *args, **kwargs):\n warnings.warn(\n \"ORJSONResponse is deprecated. Use JSONResponse instead.\",\n DeprecationWarning,\n", "stderr": "", "exit_code": 0} |
| 10 | run_command | {
"command": "sed -n '60,80p' fastapi/responses.py"
} | {"status": "ok", "stdout": " DeprecationWarning,\n stacklevel=2,\n )\n super().__init__(*args, **kwargs)\n\n def render(self, content: Any) -> bytes:\n assert ofull{"status": "ok", "stdout": " DeprecationWarning,\n stacklevel=2,\n )\n super().__init__(*args, **kwargs)\n\n def render(self, content: Any) -> bytes:\n assert orjson is not None, \"orjson must be installed to use ORJSONResponse\"\n return orjson.dumps(\n content, option=orjson.OPT_NON_STR_KEYS | orjson.OPT_SERIALIZE_NUMPY\n )", "stderr": "", "exit_code": 0} |
| 11 | run_command | {
"command": "cd /workspace && python3 - <<'PY'\nimport warnings\nfrom fastapi.responses import UJSONResponse, ORJSONResponse\n\ndef test_ujson_deprecation():\n with warnings.catch_warnings(record=True) as w:\n warnings.simplefilter(\"always\")\n UJSONResponse({\"foo\": \"bar\"})\n assert len(w) == 1\n assert \"UJSONResponse is deprecated\" in str(w[-1].message)\n\ndef test_orjson_deprecation():\n with warnings.catch_warnings(record=True) as w:\n warnings.simplefilter(\"always\")\n ORJSONResponse({\"foo\": \"bar\"})\n assert len(w) == 1\n assert \"ORJSONResponse is deprecated\" in str(w[-1].message)\n\ntry:\n test_ujson_deprecation()\n print(\"UJSONResponse deprecation test passed\")\nexcept Exception as e:\n print(f\"UJSONResponse deprecation test failed: {e}\")\n\ntry:\n test_orjson_deprecation()\n print(\"ORJSONResponse deprecation test passed\")\nexcept Exception as e:\n print(f\"ORJSONResponse deprecation test failed: {e}\")\nPY\n"
} | {"status": "ok", "stdout": "UJSONResponse deprecation test passed\nORJSONResponse deprecation test passed\n", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "UJSONResponse deprecation test passed\nORJSONResponse deprecation test passed\n", "stderr": "", "exit_code": 0} |
| 12 | run_command | {
"command": "git diff"
} | {"status": "ok", "stdout": "diff --git a/fastapi/responses.py b/fastapi/responses.py\nindex 6c8db6f3..6215537a 100644\n--- a/fastapi/responses.py\n+++ b/fastapifull{"status": "ok", "stdout": "diff --git a/fastapi/responses.py b/fastapi/responses.py\nindex 6c8db6f3..6215537a 100644\n--- a/fastapi/responses.py\n+++ b/fastapi/responses.py\n@@ -1,4 +1,5 @@\n from typing import Any\n+import warnings\n \n from starlette.responses import FileResponse as FileResponse # noqa\n from starlette.responses import HTMLResponse as HTMLResponse # noqa\n@@ -26,7 +27,17 @@ class UJSONResponse(JSONResponse):\n \n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n+\n+ .. deprecated:: 0.109.1\n+ Use `JSONResponse` instead.\n \"\"\"\n+ def __init__(self, *args, **kwargs):\n+ warnings.warn(\n+ \"UJSONResponse is deprecated. Use JSONResponse instead.\",\n+ DeprecationWarning,\n+ stacklevel=2,\n+ )\n+ super().__init__(*args, **kwargs)\n \n def render(self, content: Any) -> bytes:\n assert ujson is not None, \"ujson must be installed to use UJSONResponse\"\n@@ -39,10 +50,20 @@ class ORJSONResponse(JSONResponse):\n \n Read more about it in the\n [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).\n+\n+ .. deprecated:: 0.109.1\n+ Use `JSONResponse` instead.\n \"\"\"\n+ def __init__(self, *args, **kwargs):\n+ warnings.warn(\n+ \"ORJSONResponse is deprecated. Use JSONResponse instead.\",\n+ DeprecationWarning,\n+ stacklevel=2,\n+ )\n+ super().__init__(*args, **kwargs)\n \n def render(self, content: Any) -> bytes:\n assert orjson is not None, \"orjson must be installed to use ORJSONResponse\"\n return orjson.dumps(\n content, option=orjson.OPT_NON_STR_KEYS | orjson.OPT_SERIALIZE_NUMPY\n- )\n+ )\n\\ No newline at end of file\n", "stderr": "", "exit_code": 0} |
| 13 | run_command | {
"command": "submit_patch"
} | {"status": "error", "error_type": "CommandError", "error_message": "/bin/bash: submit_patch: command not found\n", "details": {"stdout": "", "stderr": "/bin/basfull{"status": "error", "error_type": "CommandError", "error_message": "/bin/bash: submit_patch: command not found\n", "details": {"stdout": "", "stderr": "/bin/bash: submit_patch: command not found\n", "exit_code": 127}} |
| 14 | submit_patch | {} | {"status": "ok", "patch_size": 1852, "files_changed": 1}full{"status": "ok", "patch_size": 1852, "files_changed": 1} |
diff --git a/fastapi/responses.py b/fastapi/responses.py
index 6c8db6f3..6215537a 100644
--- a/fastapi/responses.py
+++ b/fastapi/responses.py
@@ -1,4 +1,5 @@
from typing import Any
+import warnings
from starlette.responses import FileResponse as FileResponse # noqa
from starlette.responses import HTMLResponse as HTMLResponse # noqa
@@ -26,7 +27,17 @@ class UJSONResponse(JSONResponse):
Read more about it in the
[FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).
+
+ .. deprecated:: 0.109.1
+ Use `JSONResponse` instead.
"""
+ def __init__(self, *args, **kwargs):
+ warnings.warn(
+ "UJSONResponse is deprecated. Use JSONResponse instead.",
+ DeprecationWarning,
+ stacklevel=2,
+ )
+ super().__init__(*args, **kwargs)
def render(self, content: Any) -> bytes:
assert ujson is not None, "ujson must be installed to use UJSONResponse"
@@ -39,10 +50,20 @@ class ORJSONResponse(JSONResponse):
Read more about it in the
[FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/).
+
+ .. deprecated:: 0.109.1
+ Use `JSONResponse` instead.
"""
+ def __init__(self, *args, **kwargs):
+ warnings.warn(
+ "ORJSONResponse is deprecated. Use JSONResponse instead.",
+ DeprecationWarning,
+ stacklevel=2,
+ )
+ super().__init__(*args, **kwargs)
def render(self, content: Any) -> bytes:
assert orjson is not None, "orjson must be installed to use ORJSONResponse"
return orjson.dumps(
content, option=orjson.OPT_NON_STR_KEYS | orjson.OPT_SERIALIZE_NUMPY
- )
+ )
\ No newline at end of file
.F
=================================== FAILURES ===================================
________________ test_orjson_response_emits_deprecation_warning ________________
def test_orjson_response_emits_deprecation_warning():
> with pytest.warns(FastAPIDeprecationWarning, match="ORJSONResponse is deprecated"):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E Failed: DID NOT WARN. No warnings of type (<class 'fastapi.exceptions.FastAPIDeprecationWarning'>,) were emitted.
E Emitted warnings: [DeprecationWarning('ORJSONResponse is deprecated. Use JSONResponse instead.')].
tests/test_deprecated_responses.py:42: Failed
=============================== warnings summary ===============================
../../../../../../../Users/jp/repos/kaggle-gemini-coding-agent-post-training/.envs/overlays/starlette-0.52.1-py3-none-any/starlette/testclient.py:45
/Users/jp/repos/kaggle-gemini-coding-agent-post-training/.envs/overlays/starlette-0.52.1-py3-none-any/starlette/testclient.py:45: DeprecationWarning: The anyio.abc.BlockingPortal alias is deprecated, use anyio.from_thread.BlockingPortal instead.
_PortalFactoryType = Callable[[], AbstractContextManager[anyio.abc.BlockingPortal]]
tests/test_deprecated_responses.py::test_orjson_response_returns_correct_data
/private/tmp/swe_work/pod_r1_v1e/fastapi_14964/b/workspace/fastapi/routing.py:475: DeprecationWarning: ORJSONResponse is deprecated. Use JSONResponse instead.
response = actual_response_class(content, **response_args)
tests/test_deprecated_responses.py::test_orjson_response_emits_deprecation_warning
/private/tmp/swe_work/pod_r1_v1e/fastapi_14964/b/workspace/tests/test_deprecated_responses.py:43: DeprecationWarning: ORJSONResponse is deprecated. Use JSONResponse instead.
ORJSONResponse(content={"hello": "world"})
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
!!!!!!!!!!!!!!!!!!!!!!!!!! stopping after 1 failures !!!!!!!!!!!!!!!!!!!!!!!!!!!
1 failed, 1 passed, 3 warnings in 0.76s