|
132 | 132 | { |
133 | 133 | "data": { |
134 | 134 | "text/plain": [ |
135 | | - "datetime.datetime(2026, 3, 24, 14, 0)" |
| 135 | + "datetime.datetime(2026, 3, 27, 14, 0)" |
136 | 136 | ] |
137 | 137 | }, |
138 | | - "execution_count": null, |
| 138 | + "execution_count": 13, |
139 | 139 | "metadata": {}, |
140 | 140 | "output_type": "execute_result" |
141 | 141 | } |
|
156 | 156 | "True" |
157 | 157 | ] |
158 | 158 | }, |
159 | | - "execution_count": null, |
| 159 | + "execution_count": 14, |
160 | 160 | "metadata": {}, |
161 | 161 | "output_type": "execute_result" |
162 | 162 | } |
|
191 | 191 | "'Snake-Case'" |
192 | 192 | ] |
193 | 193 | }, |
194 | | - "execution_count": null, |
| 194 | + "execution_count": 16, |
195 | 195 | "metadata": {}, |
196 | 196 | "output_type": "execute_result" |
197 | 197 | } |
|
261 | 261 | "HtmxHeaders(boosted=None, current_url=None, history_restore_request=None, prompt=None, request='1', target=None, trigger_name=None, trigger=None)" |
262 | 262 | ] |
263 | 263 | }, |
264 | | - "execution_count": null, |
| 264 | + "execution_count": 19, |
265 | 265 | "metadata": {}, |
266 | 266 | "output_type": "execute_result" |
267 | 267 | } |
|
428 | 428 | "'HX-Trigger-After-Settle'" |
429 | 429 | ] |
430 | 430 | }, |
431 | | - "execution_count": null, |
| 431 | + "execution_count": 29, |
432 | 432 | "metadata": {}, |
433 | 433 | "output_type": "execute_result" |
434 | 434 | } |
|
464 | 464 | "HttpHeader(k='HX-Trigger-After-Settle', v='hi')" |
465 | 465 | ] |
466 | 466 | }, |
467 | | - "execution_count": null, |
| 467 | + "execution_count": 31, |
468 | 468 | "metadata": {}, |
469 | 469 | "output_type": "execute_result" |
470 | 470 | } |
|
499 | 499 | "{'a': int, 'b': str}" |
500 | 500 | ] |
501 | 501 | }, |
502 | | - "execution_count": null, |
| 502 | + "execution_count": 33, |
503 | 503 | "metadata": {}, |
504 | 504 | "output_type": "execute_result" |
505 | 505 | } |
|
522 | 522 | "{'x': str, 'y': str}" |
523 | 523 | ] |
524 | 524 | }, |
525 | | - "execution_count": null, |
| 525 | + "execution_count": 34, |
526 | 526 | "metadata": {}, |
527 | 527 | "output_type": "execute_result" |
528 | 528 | } |
|
672 | 672 | "Foo(d={'a': 1})" |
673 | 673 | ] |
674 | 674 | }, |
675 | | - "execution_count": null, |
| 675 | + "execution_count": 43, |
676 | 676 | "metadata": {}, |
677 | 677 | "output_type": "execute_result" |
678 | 678 | } |
|
762 | 762 | "\"['1', '2']\"" |
763 | 763 | ] |
764 | 764 | }, |
765 | | - "execution_count": null, |
| 765 | + "execution_count": 47, |
766 | 766 | "metadata": {}, |
767 | 767 | "output_type": "execute_result" |
768 | 768 | } |
|
894 | 894 | "name": "stdout", |
895 | 895 | "output_type": "stream", |
896 | 896 | "text": [ |
897 | | - "{'req': <starlette.requests.Request object>, 'this': <starlette.applications.Starlette object>, 'a': '1', 'b': HttpHeader(k='value1', v='value3'), 'state': <starlette.datastructures.State object>}\n" |
| 897 | + "{'req': <starlette.requests.Request object at 0x78026faa9ee0>, 'this': <starlette.applications.Starlette object at 0x78026fa67170>, 'a': '1', 'b': HttpHeader(k='value1', v='value3'), 'state': <starlette.datastructures.State object at 0x78026faa8ad0>}\n" |
898 | 898 | ] |
899 | 899 | } |
900 | 900 | ], |
|
920 | 920 | "name": "stdout", |
921 | 921 | "output_type": "stream", |
922 | 922 | "text": [ |
923 | | - "{'req': <starlette.requests.Request object>, 'this': <starlette.applications.Starlette object>, 'a': '1', 'b': HttpHeader(k='value1', v='value3')}\n" |
| 923 | + "{'req': <starlette.requests.Request object at 0x78026faaaff0>, 'this': <starlette.applications.Starlette object at 0x78026faa95e0>, 'a': '1', 'b': HttpHeader(k='value1', v='value3')}\n" |
924 | 924 | ] |
925 | 925 | } |
926 | 926 | ], |
|
962 | 962 | "name": "stdout", |
963 | 963 | "output_type": "stream", |
964 | 964 | "text": [ |
965 | | - "{'req': <starlette.requests.Request object>, 'this': <starlette.applications.Starlette object>, 'a': ''}\n" |
| 965 | + "{'req': <starlette.requests.Request object at 0x78026faabad0>, 'this': <starlette.applications.Starlette object at 0x78026faaaae0>, 'a': ''}\n" |
966 | 966 | ] |
967 | 967 | } |
968 | 968 | ], |
|
1083 | 1083 | "source": [ |
1084 | 1084 | "#| export\n", |
1085 | 1085 | "async def _wrap_ws(ws, data, params):\n", |
1086 | | - " hdrs = {k.lower().replace('-','_'):v for k,v in data.pop('HEADERS', {}).items()}\n", |
| 1086 | + " hdrs = Headers({k.lower():v for k,v in data.pop('HEADERS', {}).items()})\n", |
1087 | 1087 | " return await _find_ps(ws, data, hdrs, params)" |
1088 | 1088 | ] |
1089 | 1089 | }, |
|
1139 | 1139 | " assert data == 'Message text was: Hi!', data" |
1140 | 1140 | ] |
1141 | 1141 | }, |
| 1142 | + { |
| 1143 | + "cell_type": "code", |
| 1144 | + "execution_count": null, |
| 1145 | + "id": "bda2e425", |
| 1146 | + "metadata": {}, |
| 1147 | + "outputs": [], |
| 1148 | + "source": [ |
| 1149 | + "def on_receive(hx_trigger:str): return f\"trigger: {hx_trigger}\"\n", |
| 1150 | + "cli = TestClient(Starlette(routes=[WebSocketRoute('/', _ws_endp(on_receive))]))\n", |
| 1151 | + "with cli.websocket_connect('/') as ws:\n", |
| 1152 | + " ws.send_text(json.dumps({\"HEADERS\": {\"Hx-Trigger\": \"my-btn\"}}))\n", |
| 1153 | + " data = ws.receive_text()\n", |
| 1154 | + " assert data == 'trigger: my-btn', data\n" |
| 1155 | + ] |
| 1156 | + }, |
1142 | 1157 | { |
1143 | 1158 | "cell_type": "code", |
1144 | 1159 | "execution_count": null, |
|
4296 | 4311 | ] |
4297 | 4312 | } |
4298 | 4313 | ], |
4299 | | - "metadata": {}, |
| 4314 | + "metadata": { |
| 4315 | + "solveit_dialog_mode": "learning", |
| 4316 | + "solveit_ver": 2 |
| 4317 | + }, |
4300 | 4318 | "nbformat": 4, |
4301 | 4319 | "nbformat_minor": 5 |
4302 | 4320 | } |
0 commit comments