From 256a84dc95f9d0abd8cd14d5f54ab4c81b315520 Mon Sep 17 00:00:00 2001 From: Kerem Turgutlu Date: Thu, 4 Jun 2026 18:30:45 +0300 Subject: [PATCH] fastspec dict2obj --- fastcflare/_modidx.py | 1 - fastcflare/core.py | 14 ------ nbs/00_core.ipynb | 110 ++++++++++++++---------------------------- 3 files changed, 36 insertions(+), 89 deletions(-) diff --git a/fastcflare/_modidx.py b/fastcflare/_modidx.py index 22e578f..449af1c 100644 --- a/fastcflare/_modidx.py +++ b/fastcflare/_modidx.py @@ -14,7 +14,6 @@ 'fastcflare.core.CloudflareApi.create_token': ( 'core.html#cloudflareapi.create_token', 'fastcflare/core.py'), 'fastcflare.core.CloudflareApi.verify': ('core.html#cloudflareapi.verify', 'fastcflare/core.py'), - 'fastcflare.core.OpFunc.__call__': ('core.html#opfunc.__call__', 'fastcflare/core.py'), 'fastcflare.core._cf_spec': ('core.html#_cf_spec', 'fastcflare/core.py'), 'fastcflare.core._op2name': ('core.html#_op2name', 'fastcflare/core.py'), 'fastcflare.core._tag2res': ('core.html#_tag2res', 'fastcflare/core.py'), diff --git a/fastcflare/core.py b/fastcflare/core.py index 37c27d4..a35efe6 100644 --- a/fastcflare/core.py +++ b/fastcflare/core.py @@ -61,20 +61,6 @@ def __dir__(self): return super().__dir__() + list(self.groups) def _repr_markdown_(self): return "\n".join(f"- {o}" for o in sorted(self.groups)) def __getattr__(self, k): return self.groups[k] if 'groups' in vars(self) and k in self.groups else stop(AttributeError(k)) -# %% ../nbs/00_core.ipynb #0951a9c6 -from fastspec.oapi import OpFunc, _join_url, _path - -# %% ../nbs/00_core.ipynb #3d08fed8 -@patch -async def __call__(self:OpFunc, *args, **kwargs): - stream, headers, route, query, body, files = self._split(self._bind(args, kwargs)) - url = _join_url(self.base_url, _path(self.path, route_params=route)) - if files: kw = dict(body=None, files=files, data=self.form_encoder(body) or None) - elif self.request_content_type == "application/x-www-form-urlencoded": kw = dict(body=None, data=self.form_encoder(body)) - else: kw = dict(body=body) - if stream: return self._stream(url, headers=headers, query=query, route=route, **kw) - return dict2obj(await self._request(url, headers=headers, query=query, route=route, **kw)) - # %% ../nbs/00_core.ipynb #de443569 @patch async def create_token(self:CloudflareApi, doms, perm_names, name, grp='account.zone.'): diff --git a/nbs/00_core.ipynb b/nbs/00_core.ipynb index e74a91d..cb09ea6 100644 --- a/nbs/00_core.ipynb +++ b/nbs/00_core.ipynb @@ -43,14 +43,14 @@ { "cell_type": "code", "execution_count": null, - "id": "202e6227", + "id": "4995c29c", "metadata": {}, "outputs": [], "source": [ - "# acctok = os.environ['CLOUDFLARE_ACC_TOK']\n", + "acctok = os.getenv('CLOUDFLARE_ACC_TOK')\n", "usrtok = os.environ['CLOUDFLARE_USR_TOK']\n", - "# acctid = os.environ['CLOUDFLARE_ACCT_ID']\n", - "# acceml = os.environ['CLOUDFLARE_EML_ADD']" + "acctid = os.getenv('CLOUDFLARE_ACCT_ID')\n", + "acceml = os.getenv('CLOUDFLARE_EML_ADD')" ] }, { @@ -93,9 +93,10 @@ "metadata": {}, "outputs": [], "source": [ - "# ahdrs = {'Authorization': f'Bearer {acctok}'}\n", - "# r = httpx.get(f'{base}/accounts/{acctid}/tokens/verify', headers=ahdrs)\n", - "# r.json()['success']" + "if acctok and acctid:\n", + " ahdrs = {'Authorization': f'Bearer {acctok}'}\n", + " r = httpx.get(f'{base}/accounts/{acctid}/tokens/verify', headers=ahdrs)\n", + " print(r.json()['success'])" ] }, { @@ -105,11 +106,11 @@ "metadata": {}, "outputs": [], "source": [ - "# glbtok = os.environ['CLOUDFLARE_API_KEY']\n", - "# \n", - "# ghdrs = {'X-Auth-Email': acceml, 'X-Auth-Key': glbtok, 'Content-Type': 'application/json'}\n", - "# r = httpx.get(f'{base}/user', headers=ghdrs)\n", - "# r.json()['success']" + "glbtok = os.getenv('CLOUDFLARE_API_KEY')\n", + "if acceml and glbtok:\n", + " ghdrs = {'X-Auth-Email': acceml, 'X-Auth-Key': glbtok, 'Content-Type': 'application/json'}\n", + " r = httpx.get(f'{base}/user', headers=ghdrs)\n", + " print(r.json()['success'])" ] }, { @@ -141,8 +142,9 @@ "metadata": {}, "outputs": [], "source": [ - "# r = httpx.get(f'{base}/zones', headers=ahdrs, params={'account.id': acctid})\n", - "# [(z['name'], z['id'][:8]) for z in r.json()['result'][:1]]" + "if acctok and acctid:\n", + " r = httpx.get(f'{base}/zones', headers=ahdrs, params={'account.id': acctid})\n", + " print([(z['name'], z['id'][:8]) for z in r.json()['result'][:1]])" ] }, { @@ -278,44 +280,6 @@ " def __getattr__(self, k): return self.groups[k] if 'groups' in vars(self) and k in self.groups else stop(AttributeError(k))" ] }, - { - "cell_type": "markdown", - "id": "d49e249d", - "metadata": {}, - "source": [ - "patch `OpFunc.__call__` to return `dict2obj`" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0951a9c6", - "metadata": {}, - "outputs": [], - "source": [ - "#| export\n", - "from fastspec.oapi import OpFunc, _join_url, _path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3d08fed8", - "metadata": {}, - "outputs": [], - "source": [ - "#| export\n", - "@patch\n", - "async def __call__(self:OpFunc, *args, **kwargs):\n", - " stream, headers, route, query, body, files = self._split(self._bind(args, kwargs))\n", - " url = _join_url(self.base_url, _path(self.path, route_params=route))\n", - " if files: kw = dict(body=None, files=files, data=self.form_encoder(body) or None)\n", - " elif self.request_content_type == \"application/x-www-form-urlencoded\": kw = dict(body=None, data=self.form_encoder(body))\n", - " else: kw = dict(body=body)\n", - " if stream: return self._stream(url, headers=headers, query=query, route=route, **kw)\n", - " return dict2obj(await self._request(url, headers=headers, query=query, route=route, **kw))" - ] - }, { "cell_type": "code", "execution_count": null, @@ -345,8 +309,9 @@ "metadata": {}, "outputs": [], "source": [ - "# acf = CloudflareApi(token=acctok, account_id=acctid)\n", - "# acf.verify().result.status" + "if acctok and acctid:\n", + " acf = CloudflareApi(token=acctok, account_id=acctid)\n", + " print(acf.verify().result.status)" ] }, { @@ -438,7 +403,8 @@ "metadata": {}, "outputs": [], "source": [ - "# (await acf.dns_records_zone.list_dns_records(zone_id=zid)).result[0].name" + "if acctok and acctid:\n", + " print((await acf.dns_records_zone.list_dns_records(zone_id=zid)).result[0].name)" ] }, { @@ -474,7 +440,7 @@ "\u001b[31mHTTPStatusError\u001b[39m Traceback (most recent call last)", "\u001b[36mFile \u001b[39m\u001b[32m~/aai-ws/fastspec/fastspec/oapi.py:171\u001b[39m, in \u001b[36m_request\u001b[39m\u001b[34m(self, url, headers, query, body, route, **kwargs)\u001b[39m", "\u001b[32m 170\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mExecute an HTTP request and return decoded response.\u001b[39m\u001b[33m\"\u001b[39m", - "\u001b[32m--> \u001b[39m\u001b[32m171\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m: \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m.client.request(\u001b[38;5;28mself\u001b[39m.verb, url, headers=headers, params=query, json_data=body, **kwargs)", + "\u001b[32m--> \u001b[39m\u001b[32m171\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m: \u001b[38;5;28;01mreturn\u001b[39;00m dict2obj(\u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m.client.request(\u001b[38;5;28mself\u001b[39m.verb, url, headers=headers, params=query, json_data=body, **kwargs))", "\u001b[32m 172\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e: \u001b[38;5;28mself\u001b[39m._raise_with_context(e, endpoint=\u001b[33m'\u001b[39m\u001b[33m'\u001b[39m, route=route, query=query, body=body)", "", "\u001b[36mFile \u001b[39m\u001b[32m~/aai-ws/fastspec/fastspec/transport.py:52\u001b[39m, in \u001b[36mAsyncTransport.request\u001b[39m\u001b[34m(self, method, url, headers, params, json_data, data, files, raw)\u001b[39m", @@ -494,20 +460,18 @@ "The above exception was the direct cause of the following exception:", "", "\u001b[31mAPIError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[70]\u001b[39m\u001b[32m, line 1\u001b[39m", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[37]\u001b[39m\u001b[32m, line 1\u001b[39m", "\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m pgs = (\u001b[38;5;28;01mawait\u001b[39;00m ucf.user_api_tokens.permission_groups_list_permission_groups()).result", "\u001b[32m 2\u001b[39m [p.name \u001b[38;5;28;01mfor\u001b[39;00m p \u001b[38;5;28;01min\u001b[39;00m pgs \u001b[38;5;28;01mif\u001b[39;00m \u001b[33m'DNS'\u001b[39m \u001b[38;5;28;01min\u001b[39;00m p.name \u001b[38;5;28;01mor\u001b[39;00m \u001b[33m'Zone'\u001b[39m \u001b[38;5;28;01min\u001b[39;00m p.name][:\u001b[32m20\u001b[39m]", "", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[62]\u001b[39m\u001b[32m, line 9\u001b[39m, in \u001b[36mOpFunc.__call__\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m", - "\u001b[32m 5\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m files: kw = dict(body=\u001b[38;5;28;01mNone\u001b[39;00m, files=files, data=self.form_encoder(body) \u001b[38;5;28;01mor\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m)", - "\u001b[32m 6\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m self.request_content_type == \u001b[33m\"application/x-www-form-urlencoded\"\u001b[39m: kw = dict(body=\u001b[38;5;28;01mNone\u001b[39;00m, data=self.form_encoder(body))", - "\u001b[32m 7\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m: kw = dict(body=body)", - "\u001b[32m 8\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m stream: \u001b[38;5;28;01mreturn\u001b[39;00m self._stream(url, headers=headers, query=query, route=route, **kw)", - "\u001b[32m----> \u001b[39m\u001b[32m9\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m dict2obj(\u001b[38;5;28;01mawait\u001b[39;00m self._request(url, headers=headers, query=query, route=route, **kw))", + "\u001b[36mFile \u001b[39m\u001b[32m~/aai-ws/fastspec/fastspec/oapi.py:193\u001b[39m, in \u001b[36m__call__\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m", + "\u001b[32m 191\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m: kw = \u001b[38;5;28mdict\u001b[39m(body=body)", + "\u001b[32m 192\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m stream: \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._stream(url, headers=headers, query=query, route=route, **kw)", + "\u001b[32m--> \u001b[39m\u001b[32m193\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m._request(url, headers=headers, query=query, route=route, **kw)", "", "\u001b[36mFile \u001b[39m\u001b[32m~/aai-ws/fastspec/fastspec/oapi.py:172\u001b[39m, in \u001b[36m_request\u001b[39m\u001b[34m(self, url, headers, query, body, route, **kwargs)\u001b[39m", "\u001b[32m 170\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mExecute an HTTP request and return decoded response.\u001b[39m\u001b[33m\"\u001b[39m", - "\u001b[32m 171\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m: \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m.client.request(\u001b[38;5;28mself\u001b[39m.verb, url, headers=headers, params=query, json_data=body, **kwargs)", + "\u001b[32m 171\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m: \u001b[38;5;28;01mreturn\u001b[39;00m dict2obj(\u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m.client.request(\u001b[38;5;28mself\u001b[39m.verb, url, headers=headers, params=query, json_data=body, **kwargs))", "\u001b[32m--> \u001b[39m\u001b[32m172\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e: \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_raise_with_context\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43me\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mendpoint\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43m'\u001b[39;49m\u001b[30;43m'\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mroute\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mroute\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mquery\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mquery\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mbody\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mbody\u001b[39;49m\u001b[30;43m)\u001b[39;49m", "", "\u001b[36mFile \u001b[39m\u001b[32m~/aai-ws/fastspec/fastspec/oapi.py:162\u001b[39m, in \u001b[36m_raise_with_context\u001b[39m\u001b[34m(self, exc, endpoint, route, query, body)\u001b[39m", @@ -540,7 +504,7 @@ "\u001b[31mHTTPStatusError\u001b[39m Traceback (most recent call last)", "\u001b[36mFile \u001b[39m\u001b[32m~/aai-ws/fastspec/fastspec/oapi.py:171\u001b[39m, in \u001b[36m_request\u001b[39m\u001b[34m(self, url, headers, query, body, route, **kwargs)\u001b[39m", "\u001b[32m 170\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mExecute an HTTP request and return decoded response.\u001b[39m\u001b[33m\"\u001b[39m", - "\u001b[32m--> \u001b[39m\u001b[32m171\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m: \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m.client.request(\u001b[38;5;28mself\u001b[39m.verb, url, headers=headers, params=query, json_data=body, **kwargs)", + "\u001b[32m--> \u001b[39m\u001b[32m171\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m: \u001b[38;5;28;01mreturn\u001b[39;00m dict2obj(\u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m.client.request(\u001b[38;5;28mself\u001b[39m.verb, url, headers=headers, params=query, json_data=body, **kwargs))", "\u001b[32m 172\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e: \u001b[38;5;28mself\u001b[39m._raise_with_context(e, endpoint=\u001b[33m'\u001b[39m\u001b[33m'\u001b[39m, route=route, query=query, body=body)", "", "\u001b[36mFile \u001b[39m\u001b[32m~/aai-ws/fastspec/fastspec/transport.py:52\u001b[39m, in \u001b[36mAsyncTransport.request\u001b[39m\u001b[34m(self, method, url, headers, params, json_data, data, files, raw)\u001b[39m", @@ -560,11 +524,11 @@ "The above exception was the direct cause of the following exception:", "", "\u001b[31mAPIError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[71]\u001b[39m\u001b[32m, line 1\u001b[39m", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[38]\u001b[39m\u001b[32m, line 1\u001b[39m", "\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m tok = \u001b[38;5;28;01mawait\u001b[39;00m ucf.create_token([\u001b[33m'answer.ai'\u001b[39m], [\u001b[33m'Zone Read'\u001b[39m], \u001b[33m'fastcflare-test-token'\u001b[39m)", "\u001b[32m 2\u001b[39m tok.success, tok.result.name", "", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[69]\u001b[39m\u001b[32m, line 5\u001b[39m, in \u001b[36mCloudflareApi.create_token\u001b[39m\u001b[34m(self, doms, perm_names, name, grp)\u001b[39m", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[36]\u001b[39m\u001b[32m, line 5\u001b[39m, in \u001b[36mCloudflareApi.create_token\u001b[39m\u001b[34m(self, doms, perm_names, name, grp)\u001b[39m", "\u001b[32m 1\u001b[39m @patch", "\u001b[32m 2\u001b[39m \u001b[38;5;28;01masync\u001b[39;00m \u001b[38;5;28;01mdef\u001b[39;00m create_token(self:CloudflareApi, doms, perm_names, name, grp=\u001b[33m'account.zone.'\u001b[39m):", "\u001b[32m 3\u001b[39m \u001b[33m\"Create a scoped Cloudflare API token for given domains and permission names\"\u001b[39m", @@ -574,16 +538,14 @@ "\u001b[32m 7\u001b[39m zids = {f'{pref}{(\u001b[38;5;28;01mawait\u001b[39;00m self.zone.get(name=d)).result[\u001b[32m0\u001b[39m].id}':\u001b[33m'*'\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m d \u001b[38;5;28;01min\u001b[39;00m doms}", "\u001b[32m 8\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m self.user_api_tokens.create_token(name=name, policies=[dict(effect=\u001b[33m'allow'\u001b[39m, resources=zids, permission_groups=perms)])", "", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[62]\u001b[39m\u001b[32m, line 9\u001b[39m, in \u001b[36mOpFunc.__call__\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m", - "\u001b[32m 5\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m files: kw = dict(body=\u001b[38;5;28;01mNone\u001b[39;00m, files=files, data=self.form_encoder(body) \u001b[38;5;28;01mor\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m)", - "\u001b[32m 6\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m self.request_content_type == \u001b[33m\"application/x-www-form-urlencoded\"\u001b[39m: kw = dict(body=\u001b[38;5;28;01mNone\u001b[39;00m, data=self.form_encoder(body))", - "\u001b[32m 7\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m: kw = dict(body=body)", - "\u001b[32m 8\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m stream: \u001b[38;5;28;01mreturn\u001b[39;00m self._stream(url, headers=headers, query=query, route=route, **kw)", - "\u001b[32m----> \u001b[39m\u001b[32m9\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m dict2obj(\u001b[38;5;28;01mawait\u001b[39;00m self._request(url, headers=headers, query=query, route=route, **kw))", + "\u001b[36mFile \u001b[39m\u001b[32m~/aai-ws/fastspec/fastspec/oapi.py:193\u001b[39m, in \u001b[36m__call__\u001b[39m\u001b[34m(self, *args, **kwargs)\u001b[39m", + "\u001b[32m 191\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m: kw = \u001b[38;5;28mdict\u001b[39m(body=body)", + "\u001b[32m 192\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m stream: \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m._stream(url, headers=headers, query=query, route=route, **kw)", + "\u001b[32m--> \u001b[39m\u001b[32m193\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m._request(url, headers=headers, query=query, route=route, **kw)", "", "\u001b[36mFile \u001b[39m\u001b[32m~/aai-ws/fastspec/fastspec/oapi.py:172\u001b[39m, in \u001b[36m_request\u001b[39m\u001b[34m(self, url, headers, query, body, route, **kwargs)\u001b[39m", "\u001b[32m 170\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mExecute an HTTP request and return decoded response.\u001b[39m\u001b[33m\"\u001b[39m", - "\u001b[32m 171\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m: \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m.client.request(\u001b[38;5;28mself\u001b[39m.verb, url, headers=headers, params=query, json_data=body, **kwargs)", + "\u001b[32m 171\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m: \u001b[38;5;28;01mreturn\u001b[39;00m dict2obj(\u001b[38;5;28;01mawait\u001b[39;00m \u001b[38;5;28mself\u001b[39m.client.request(\u001b[38;5;28mself\u001b[39m.verb, url, headers=headers, params=query, json_data=body, **kwargs))", "\u001b[32m--> \u001b[39m\u001b[32m172\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m e: \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_raise_with_context\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43me\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mendpoint\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43m'\u001b[39;49m\u001b[30;43m'\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mroute\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mroute\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mquery\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mquery\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mbody\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mbody\u001b[39;49m\u001b[30;43m)\u001b[39;49m", "", "\u001b[36mFile \u001b[39m\u001b[32m~/aai-ws/fastspec/fastspec/oapi.py:162\u001b[39m, in \u001b[36m_raise_with_context\u001b[39m\u001b[34m(self, exc, endpoint, route, query, body)\u001b[39m",