From 58b3a10fc01a8e2d33907591d74a2f3758903b96 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Thu, 19 Sep 2024 21:07:45 +0100 Subject: [PATCH 01/70] Fetching associated script --- docs/roadmap.md | 1 + src/posting/scripts.py | 83 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/posting/scripts.py diff --git a/docs/roadmap.md b/docs/roadmap.md index b3448d04..1253cea1 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -13,6 +13,7 @@ If you have any feedback or suggestions, please open a new discussion on GitHub. - Parse cURL commands. - Watching environment files for changes & updating the UI. ✅ - Editing key/value editor rows without having to delete/re-add them. +- Quickly open MDN links for headers. - Saving recently used environments to a file. - Saving recently used collections to a file. - Viewing the currently loaded environment keys/values in a popup. diff --git a/src/posting/scripts.py b/src/posting/scripts.py new file mode 100644 index 00000000..0c2aed28 --- /dev/null +++ b/src/posting/scripts.py @@ -0,0 +1,83 @@ +"""Deals with running scripts that can be saved alongside a collection. + +These could be pre-request, post-response. +""" + +from __future__ import annotations + +import sys +from pathlib import Path +from types import ModuleType +from typing import Callable, NamedTuple + +import httpx + + +class ScriptFunctions(NamedTuple): + on_request: Callable[[httpx.Request], None] | None + on_response: Callable[[httpx.Response], None] | None + + +def execute_script(script_path: Path) -> ScriptFunctions: + """ + Execute a Python script from the given path and extract on_request and on_response functions. + + Args: + script_path: Path to the Python script. + + Returns: + ScriptFunctions: A named tuple containing the extracted functions. + + Raises: + FileNotFoundError: If the script file does not exist. + Exception: If there's an error during script execution. + """ + if not script_path.is_file(): + raise FileNotFoundError(f"Script not found: {script_path}") + + script_dir = script_path.parent.resolve() + module_name = script_path.stem + + try: + sys.path.insert(0, str(script_dir)) + module = _import_script_as_module(script_path, module_name) + on_request = getattr(module, "on_request", None) + on_response = getattr(module, "on_response", None) + return ScriptFunctions(on_request=on_request, on_response=on_response) + finally: + sys.path.remove(str(script_dir)) + + +def _import_script_as_module(script_path: Path, module_name: str) -> ModuleType: + """ + Import the script file as a module. + + Args: + script_path (Path): Path to the script file. + module_name (str): Name to use for the module. + + Returns: + ModuleType: The imported module. + + Raises: + ImportError: If there's an error importing the module. + """ + import importlib.util + + spec = importlib.util.spec_from_file_location(module_name, script_path) + if spec is None: + raise ImportError( + f"Could not load spec for module {module_name} from {script_path}" + ) + + module = importlib.util.module_from_spec(spec) + if spec.loader is None: + raise ImportError(f"Could not load module {module_name} from {script_path}") + + spec.loader.exec_module(module) + return module + + +# Usage example +if __name__ == "__main__": + script_path = Path("path/to/your/script.py") From 7facbe1eddeb8d0f4a8b58811f19b7fc6365e50b Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 21 Sep 2024 19:04:25 +0100 Subject: [PATCH 02/70] Add scripts tab and Scripts basemodel --- src/posting/app.py | 3 ++- src/posting/collection.py | 11 +++++++++++ src/posting/widgets/collection/browser.py | 2 +- src/posting/widgets/request/request_editor.py | 3 +++ src/posting/widgets/request/request_scripts.py | 5 +++++ 5 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 src/posting/widgets/request/request_scripts.py diff --git a/src/posting/app.py b/src/posting/app.py index 470569af..db1882d6 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -663,7 +663,8 @@ def on_mount(self) -> None: "--content-tab-query-pane": "e", "--content-tab-auth-pane": "r", "--content-tab-info-pane": "t", - "--content-tab-options-pane": "y", + "--content-tab-scripts-pane": "y", + "--content-tab-options-pane": "u", "--content-tab-response-body-pane": "a", "--content-tab-response-headers-pane": "s", "--content-tab-response-cookies-pane": "d", diff --git a/src/posting/collection.py b/src/posting/collection.py index 5230715e..d43a7499 100644 --- a/src/posting/collection.py +++ b/src/posting/collection.py @@ -115,6 +115,14 @@ def request_sort_key(request: RequestModel) -> tuple[int, str]: return (method_order.get(request.method.upper(), 5), request.name) +class Scripts(BaseModel): + pre_request: str | None = Field(default=None) + """A relative path to a script that will be run before the request is sent.""" + + post_response: str | None = Field(default=None) + """A relative path to a script that will be run after the response is received.""" + + @total_ordering class RequestModel(BaseModel): name: str = Field(default="") @@ -160,6 +168,9 @@ class RequestModel(BaseModel): posting_version: str = Field(default=VERSION) """The version of Posting.""" + scripts: Scripts = Field(default_factory=Scripts) + """The scripts associated with the request.""" + options: Options = Field(default_factory=Options) """The options for the request.""" diff --git a/src/posting/widgets/collection/browser.py b/src/posting/widgets/collection/browser.py index b1bff78a..6f7b0583 100644 --- a/src/posting/widgets/collection/browser.py +++ b/src/posting/widgets/collection/browser.py @@ -3,7 +3,7 @@ from functools import partial import os from pathlib import Path -from typing import Any, Union +from typing import Union from urllib.parse import urlparse from rich.style import Style from rich.text import Text, TextType diff --git a/src/posting/widgets/request/request_editor.py b/src/posting/widgets/request/request_editor.py index bc3e77f9..a3b00928 100644 --- a/src/posting/widgets/request/request_editor.py +++ b/src/posting/widgets/request/request_editor.py @@ -13,6 +13,7 @@ from posting.widgets.request.request_body import RequestBodyTextArea from posting.widgets.request.request_metadata import RequestMetadata from posting.widgets.request.request_options import RequestOptions +from posting.widgets.request.request_scripts import RequestScripts from posting.widgets.select import PostingSelect from posting.widgets.tabbed_content import PostingTabbedContent from posting.widgets.text_area import TextAreaFooter, TextEditor @@ -86,6 +87,8 @@ def compose(self) -> ComposeResult: yield RequestAuth() with TabPane("Info", id="info-pane"): yield RequestMetadata() + with TabPane("Scripts", id="scripts-pane"): + yield RequestScripts() with TabPane("Options", id="options-pane"): yield RequestOptions() diff --git a/src/posting/widgets/request/request_scripts.py b/src/posting/widgets/request/request_scripts.py new file mode 100644 index 00000000..97335fbb --- /dev/null +++ b/src/posting/widgets/request/request_scripts.py @@ -0,0 +1,5 @@ +from textual.containers import VerticalScroll + + +class RequestScripts(VerticalScroll): + pass From 0cdf080cc1ea9190ffd22f3dc621438ca015c861 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 21 Sep 2024 19:25:47 +0100 Subject: [PATCH 03/70] Initial request scripts panel --- .../widgets/request/request_scripts.py | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/src/posting/widgets/request/request_scripts.py b/src/posting/widgets/request/request_scripts.py index 97335fbb..c9abb109 100644 --- a/src/posting/widgets/request/request_scripts.py +++ b/src/posting/widgets/request/request_scripts.py @@ -1,5 +1,57 @@ -from textual.containers import VerticalScroll +from textual.app import ComposeResult +from textual.containers import Vertical, VerticalScroll +from textual.widgets import Input class RequestScripts(VerticalScroll): - pass + """Collections can contain a scripts folder. + + This widget is about linking scripts to requests. + + A script is a Python file which may contain functions + named `pre_request` and/or `post_response`. + + Neither function is required, but if present and the path + is supplied, Posting will automatically fetch the function + from the file and execute it at the appropriate time. + + You can also specify the name of the function as a suffix + after the path, separated by a colon. + + Example: + ``` + scripts/pre_request.py:prepare_auth + scripts/post_response.py:log_response + ``` + + The API for scripts is under development and will likely change. + + The goal is to allow developers to attach scripts to requests, + which will then be executed when the request is made, and when the + response is received. This includes performing assertions, using + plain assert statements, and hooks for deeper integration with Posting. + For example, sending a notification when a request fails, or logging + the response to a file. + """ + + PRE_REQUEST_SCRIPT_PLACEHOLDER = "Pre-request Script" + POST_RESPONSE_SCRIPT_PLACEHOLDER = "Post-response Script" + + DEFAULT_CSS = """ + RequestScripts { + & > #pre-request-script { + background: $panel; + } + + & > #post-response-script { + background: $panel; + } + } + """ + + def compose(self) -> ComposeResult: + with Vertical(classes="section"): + yield Input(placeholder="Pre-request Script") + + with Vertical(classes="section"): + yield Input(placeholder="Post-response Script") From 55c998d778271866c35bef9021420ad06e2b7357 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 21 Sep 2024 19:26:00 +0100 Subject: [PATCH 04/70] Redundant --- src/posting/widgets/request/request_scripts.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/posting/widgets/request/request_scripts.py b/src/posting/widgets/request/request_scripts.py index c9abb109..f0d5c750 100644 --- a/src/posting/widgets/request/request_scripts.py +++ b/src/posting/widgets/request/request_scripts.py @@ -34,9 +34,6 @@ class RequestScripts(VerticalScroll): the response to a file. """ - PRE_REQUEST_SCRIPT_PLACEHOLDER = "Pre-request Script" - POST_RESPONSE_SCRIPT_PLACEHOLDER = "Post-response Script" - DEFAULT_CSS = """ RequestScripts { & > #pre-request-script { From 7c6179c0b23b0af5ac5c82114a62384564192278 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 21 Sep 2024 20:47:47 +0100 Subject: [PATCH 05/70] Skeleton scripts tab --- src/posting/widgets/request/request_editor.py | 9 +- .../widgets/request/request_scripts.py | 87 ++++++++++++++++--- 2 files changed, 83 insertions(+), 13 deletions(-) diff --git a/src/posting/widgets/request/request_editor.py b/src/posting/widgets/request/request_editor.py index a3b00928..b7b8f56a 100644 --- a/src/posting/widgets/request/request_editor.py +++ b/src/posting/widgets/request/request_editor.py @@ -1,4 +1,4 @@ -from typing import Any +from typing import TYPE_CHECKING, Any, cast from textual import on from textual.app import ComposeResult from textual.containers import Horizontal, Vertical @@ -19,6 +19,10 @@ from posting.widgets.text_area import TextAreaFooter, TextEditor +if TYPE_CHECKING: + from posting.app import Posting + + class RequestEditorTabbedContent(PostingTabbedContent): pass @@ -45,6 +49,7 @@ class RequestEditor(Vertical): """ def compose(self) -> ComposeResult: + app = cast("Posting", self.app) with Vertical() as vertical: vertical.border_title = "Request" with RequestEditorTabbedContent(): @@ -88,7 +93,7 @@ def compose(self) -> ComposeResult: with TabPane("Info", id="info-pane"): yield RequestMetadata() with TabPane("Scripts", id="scripts-pane"): - yield RequestScripts() + yield RequestScripts(collection_root=app.collection.path) with TabPane("Options", id="options-pane"): yield RequestOptions() diff --git a/src/posting/widgets/request/request_scripts.py b/src/posting/widgets/request/request_scripts.py index f0d5c750..40786dda 100644 --- a/src/posting/widgets/request/request_scripts.py +++ b/src/posting/widgets/request/request_scripts.py @@ -1,6 +1,9 @@ +from pathlib import Path from textual.app import ComposeResult -from textual.containers import Vertical, VerticalScroll -from textual.widgets import Input +from textual.containers import Horizontal, Vertical, VerticalScroll +from textual.widget import Widget +from textual.widgets import Button, Input, Label, Static +from textual_autocomplete import AutoComplete, DropdownItem, TargetState class RequestScripts(VerticalScroll): @@ -36,19 +39,81 @@ class RequestScripts(VerticalScroll): DEFAULT_CSS = """ RequestScripts { - & > #pre-request-script { - background: $panel; + padding: 0 2; + & Input { + margin-bottom: 1; } - - & > #post-response-script { - background: $panel; + + & #scripts-path-header-container { + height: 1; + } + + & #scripts-path-title { + width: 13; + } + + & #scripts-path { + color: $text-muted; + width: 1fr; + } + + & #copy-scripts-path { + width: 6; } } """ + def __init__( + self, + *children: Widget, + collection_root: Path, + name: str | None = None, + id: str | None = None, + classes: str | None = None, + disabled: bool = False, + ) -> None: + super().__init__( + *children, name=name, id=id, classes=classes, disabled=disabled + ) + self.collection_root = collection_root + self.scripts_path = collection_root / "scripts" + def compose(self) -> ComposeResult: - with Vertical(classes="section"): - yield Input(placeholder="Pre-request Script") + self.can_focus = False + + yield Label("Pre-request script [dim]optional[/dim]") + yield Input( + placeholder="Collection-relative path to pre-request script", + id="pre-request-script", + ) + + yield Label("Post-response script [dim]optional[/dim]") + yield Input( + placeholder="Collection-relative path to post-response script", + id="post-response-script", + ) + + with Vertical(): + with Horizontal(id="scripts-path-header-container"): + yield Static("Scripts path", id="scripts-path-title") + yield Button("Copy", id="copy-scripts-path") + yield Static(str(self.scripts_path), id="scripts-path") + + def on_mount(self) -> None: + auto_complete_pre_request = AutoComplete( + candidates=self.get_script_candidates, + target=self.query_one("#pre-request-script", Input), + ) + auto_complete_post_response = AutoComplete( + candidates=self.get_script_candidates, + target=self.query_one("#post-response-script", Input), + ) + + self.mount(auto_complete_pre_request) + self.mount(auto_complete_post_response) - with Vertical(classes="section"): - yield Input(placeholder="Post-response Script") + def get_script_candidates(self, state: TargetState) -> list[DropdownItem]: + scripts: list[DropdownItem] = [] + for script in self.scripts_path.glob("**/*.py"): + scripts.append(DropdownItem(str(script.relative_to(self.scripts_path)))) + return scripts From 92a00144ab9b6b6daa2153f4f7290ab7498a092c Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 21 Sep 2024 21:07:55 +0100 Subject: [PATCH 06/70] Associating scripts --- src/posting/app.py | 7 +++++ .../widgets/request/request_scripts.py | 29 ++++++++++++------- tests/sample-collections/echo.posting.yaml | 2 ++ tests/sample-collections/scripts/my_script.py | 6 ++++ 4 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 tests/sample-collections/scripts/my_script.py diff --git a/src/posting/app.py b/src/posting/app.py index db1882d6..30bf221a 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -59,6 +59,7 @@ from posting.widgets.request.request_editor import RequestEditor from posting.widgets.request.request_metadata import RequestMetadata from posting.widgets.request.request_options import RequestOptions +from posting.widgets.request.request_scripts import RequestScripts from posting.widgets.request.url_bar import UrlInput, UrlBar from posting.widgets.response.response_area import ResponseArea from posting.widgets.response.response_trace import Event, ResponseTrace @@ -478,6 +479,7 @@ def build_request_model(self, request_options: Options) -> RequestModel: if request_options.attach_cookies else [] ), + scripts=self.request_scripts.to_model(), **self.request_editor.to_request_model_args(), ) @@ -513,6 +515,7 @@ def load_request_model(self, request_model: RequestModel) -> None: self.request_metadata.request = request_model self.request_options.load_options(request_model.options) self.request_auth.load_auth(request_model.auth) + self.request_scripts.load_scripts(request_model.scripts) @property def url_bar(self) -> UrlBar: @@ -566,6 +569,10 @@ def collection_browser(self) -> CollectionBrowser: def request_auth(self) -> RequestAuth: return self.query_one(RequestAuth) + @property + def request_scripts(self) -> RequestScripts: + return self.query_one(RequestScripts) + @property def collection_tree(self) -> CollectionTree: return self.query_one(CollectionTree) diff --git a/src/posting/widgets/request/request_scripts.py b/src/posting/widgets/request/request_scripts.py index 40786dda..0e2a67f7 100644 --- a/src/posting/widgets/request/request_scripts.py +++ b/src/posting/widgets/request/request_scripts.py @@ -5,6 +5,8 @@ from textual.widgets import Button, Input, Label, Static from textual_autocomplete import AutoComplete, DropdownItem, TargetState +from posting.collection import Scripts + class RequestScripts(VerticalScroll): """Collections can contain a scripts folder. @@ -76,7 +78,6 @@ def __init__( *children, name=name, id=id, classes=classes, disabled=disabled ) self.collection_root = collection_root - self.scripts_path = collection_root / "scripts" def compose(self) -> ComposeResult: self.can_focus = False @@ -93,12 +94,6 @@ def compose(self) -> ComposeResult: id="post-response-script", ) - with Vertical(): - with Horizontal(id="scripts-path-header-container"): - yield Static("Scripts path", id="scripts-path-title") - yield Button("Copy", id="copy-scripts-path") - yield Static(str(self.scripts_path), id="scripts-path") - def on_mount(self) -> None: auto_complete_pre_request = AutoComplete( candidates=self.get_script_candidates, @@ -109,11 +104,23 @@ def on_mount(self) -> None: target=self.query_one("#post-response-script", Input), ) - self.mount(auto_complete_pre_request) - self.mount(auto_complete_post_response) + self.screen.mount(auto_complete_pre_request) + self.screen.mount(auto_complete_post_response) def get_script_candidates(self, state: TargetState) -> list[DropdownItem]: scripts: list[DropdownItem] = [] - for script in self.scripts_path.glob("**/*.py"): - scripts.append(DropdownItem(str(script.relative_to(self.scripts_path)))) + for script in self.collection_root.glob("**/*.py"): + scripts.append(DropdownItem(str(script.relative_to(self.collection_root)))) return scripts + + def load_scripts(self, scripts: Scripts) -> None: + self.query_one("#pre-request-script", Input).value = scripts.pre_request or "" + self.query_one("#post-response-script", Input).value = ( + scripts.post_response or "" + ) + + def to_model(self) -> Scripts: + return Scripts( + pre_request=self.query_one("#pre-request-script", Input).value or None, + post_response=self.query_one("#post-response-script", Input).value or None, + ) diff --git a/tests/sample-collections/echo.posting.yaml b/tests/sample-collections/echo.posting.yaml index 17df62b4..bf8bd718 100644 --- a/tests/sample-collections/echo.posting.yaml +++ b/tests/sample-collections/echo.posting.yaml @@ -6,5 +6,7 @@ body: form_data: - name: something value: '123' +scripts: + pre_request: scripts/my_script.py options: follow_redirects: false diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py new file mode 100644 index 00000000..12e5e054 --- /dev/null +++ b/tests/sample-collections/scripts/my_script.py @@ -0,0 +1,6 @@ +def pre_request(): + pass + + +def post_response(): + pass From c6c267e608eff2dcff6ce6ca885fac11d70b71a9 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 21 Sep 2024 21:12:34 +0100 Subject: [PATCH 07/70] Updating snapshot tests --- .coverage | Bin 53248 -> 53248 bytes .../test_snapshots/TestConfig.test_config.svg | 238 +++++++-------- ...ghting_applied_from_custom_theme__json.svg | 238 +++++++-------- ...ighting_applied_from_custom_theme__url.svg | 210 ++++++------- ...ple.test_theme_sensible_defaults__json.svg | 236 +++++++-------- ...mple.test_theme_sensible_defaults__url.svg | 210 ++++++------- ...estHelpScreen.test_help_screen_appears.svg | 276 +++++++++--------- .../TestJumpMode.test_click_switch.svg | 178 ++++++----- .../TestJumpMode.test_focus_switch.svg | 180 ++++++------ .../TestJumpMode.test_loads.svg | 190 ++++++------ ...st.test_request_loaded_into_view__auth.svg | 266 ++++++++--------- ...st.test_request_loaded_into_view__body.svg | 240 +++++++-------- ...test_request_loaded_into_view__headers.svg | 220 +++++++------- ...test_request_loaded_into_view__options.svg | 264 ++++++++--------- ...request_loaded_into_view__query_params.svg | 236 +++++++-------- ...ethodSelection.test_select_post_method.svg | 180 ++++++------ ...uest.test_dialog_loads_and_can_be_used.svg | 196 ++++++------- ..._tree_correctly_and_notification_shown.svg | 176 +++++------ ...elected__dialog_is_prefilled_correctly.svg | 198 +++++++------ .../TestSendRequest.test_send_request.svg | 240 +++++++-------- ...UrlBar.test_dropdown_appears_on_typing.svg | 192 ++++++------ ...down_completion_selected_via_enter_key.svg | 190 ++++++------ ...opdown_completion_selected_via_tab_key.svg | 190 ++++++------ ...UrlBar.test_dropdown_filters_on_typing.svg | 190 ++++++------ ...eShortcuts.test_expand_request_section.svg | 160 +++++----- ...erfaceShortcuts.test_expand_then_reset.svg | 180 ++++++------ ...Shortcuts.test_hide_collection_browser.svg | 172 +++++------ ...solved_variables_highlight_and_preview.svg | 194 ++++++------ ....test_unresolved_variables_highlighted.svg | 230 +++++++-------- tests/test_snapshots.py | 2 +- 30 files changed, 2934 insertions(+), 2938 deletions(-) diff --git a/.coverage b/.coverage index 168997fb871f8c4be1c5755077b0dca5048beaac..380795feef4f46786f4721d4e9f92293d67ac454 100644 GIT binary patch delta 2205 zcmZveZBSI#8OP7vXW4uA?!D(MEAOz&f-JAHfFQCdg87gNmQklk28a>F6_FTV1r+gx zC5gG$L|)X>nwO3VlbOy~lSUJ!O-7>9iL}PI`lVB66ft81w!UDTDu`jXXAjcphn^4n z`#=BZ-shb2oSn1VJpkPUaKgA8JYo+Om%kFb$NZu>U3w&aD;<<-rA$c?$HfuxnAkHI zZncSq1P{HwBEcS81jy6Y>do=Bw6!-jH{`T=TN{1tZEjy@;!--Z!YLHe_%fHUgg#$p z7Yb-?S%EPhPy-bzA}A@h(Nkp-rDaKUyeyoKF#5~PN?mJx9V?KR3#f7aLAAZL&Rfsi zj2uAK+|6An(cR@1qZ?2qH$E=68MEi#VOi2zzja%ETYK%ZMGgMGywa5E5qlB&fgB*6 zWG((4|Akz{t>T|8?}`)HtWM%%mSsvZ`Aqy&?4^s=c1f~8%L&UAYHlb_%H{=u2xQiMkB-?rU(d7Y*Cvn*$xfY7lH@6hQxLnr^Xcy_E} zY`l9{$FmXGHTLf<)wjPAhJ*ei$B8Q)iV?~k_QREX%dVoU8zjx^HwtDOq#iLyIu1$q zc$zUnmzc~MX24wg%e4qW_0>F8fC z+@E-BY%0v9ZKp^2(u8evq;H)nYVGV1Ys6uar?pX6e|}0UixX_y-Pi6uTAd?VwXG~p z4iAi2D}vdt)|5>7V>BP#-5;Zvv=)}aL~v-$^u2yZoTxR0YN;zDW$ksQqLlM5K9^)n z(zei%{)H*8F)LTDd3FAvx{(v15dlnEW2lZ_{ZKYCBt&Z) zX;M$L%cgB$Wl|023-VdZr_QGd*NHhyt23I-ICKW<1@o#x`iq{V(z(F42CEHUY1(&>P7luOR9XOol3$^#x4LRSlT)FX5C=v%P6v#T#kXgaa3V=T}ydEZ@P*F{>=>sYIsSl*F(BUTvxX~TEZ7ONh{jAYm23lR8j z3!^8M%d;%ZE1NeR1OQy*Ka+};FSIHG} zjtrBp@!RZzI7$Y{`*;t#U-yx2vIB2pm&InXo>bu`vW8t5%SjQgC%Gh@I7tj%N3295 z2v6ge@dJDt-^5qhl=EXS!TLMZFS11%!qFgk519-Kj}-I|PEm;DGzdR8v9FB*>Ug*q z4sm8fFK0UJ<6H=DaXO%jGZs2IBcPpAhS%8CT$-VgQv&~HE<|YHG{Gj$FsSD=!bVO2 zFQ)-Ea2CR0&L!|`&I0%qXFgEQJUGai3kNuJpr6wXeVmJ+hcn9$`?<)3cR4fQ9nLh+ zIa5L7biv!4DX^C_8Q$bff;Tvw(9M|$a~-wA9v&yaZq9hv#Tf@XIb&c4=h|rK;35jP zb4J28&IQoMX@geIaM;Re1s^AY7ETP!oGLVND)2g|1-5)SV03~9-=gAhi;*4wE%uYz Th-L5qQi1)oPzUc_ULgDjPi{K{ delta 2136 zcmZvddr(tX9>?#^FUh^hP0k4jLXd=q5FXY51;i)dxLruAwTKmv_tRG(6i`HK0;N67 z2x6zF)7nn!IR3GJxZ76A+D@yL*j=Wr?z+tGcDGZ@!|7~wcPlC#1w@iPIS#Yi>E4;# z@9+0H-*fW&-QS(0`xJDag0t#;$dSIGQvS|xqAS-W%Maw=%dg3ma-M9KW~FbuA*KdN z6`ex|3!+sqtLWziv0^s8RgfrVQB-JAXM)g7#m!+9IYOn~jkOJpZS8chFp+L9)T!%S z4PDg75^rIMm`-a8Q|MHoET&P9!%R&Mv)T?q8Q-1$v`ifiMZFS)5)Pb>Q13ZMu{JqJ zx-Q^<;8$@ME=M=e=lBn(O`21V%27yXyo1gt8w~OIH_~-#e=fsZA&X=8YOzH#G=WGg{MS%r65|fDiOAd^xp+>nrsW?i8Q3ptj@}UX4+F0 z!KyR;x1G}eZKpIbq~7J)x2Lhax}&zv*=TR=%Ahr+sjM}LHF>TqifxWmr=>y}JIR9f zw>hipYTKC2o&qHdg;S>^#Cx`^$mY@iMab6o3i_-1Uc+jGRe4Ww=`Sl=lwaWQ@n`tF zvKGItWU$Vg@D3cWB%#mH+vpXPjuP}|l}H66qw%lC-zr+;uZ*u7J^DvRr?K3)&X}M- zVGK8d;XD03!+FDLL$Cg(p;JF*a2hrVKe@ayrq^_ymX|hZL|spX#vcGYn|Eo!D+t#b zdIB-S4<|038}2N5&^kL2SSEB&4c2~q|BPKNgqlpjbHZ15S5Dlk9NYVr-}UE@)=W;Z ztA%|Y&0PBD--kwB&>ir+`vFc&hV_Dw?u!vdZ*TZQ__{8XY*ULmo9aqdrYH!WnJY=+ zw^$cWx)^;T#lNuYmx9mp^4O92&O1}~TtxOVZjE|q7ET33m6$1!5(Z3Ci%LU^)H)qv zhX{H`GN-ZB2f;NSiNPpiT9U~T7KN_-K1nT+jv!39CTdA5i%{&4)2NJ63nHC9hLo}(U!KYwf7W*S;)&xoZ%jJZ zkltm3JrM6Q3!{sP$JjeQ{5<`exV3PPbjS=57A4xxRcxb=T9&`f_d@9yxjQ zoxI`S1)HhqzTpncKR2Yw?}irg{LiK{-uQo~bAwIieNE2a!e2eX4*BZBxyp(AKb;O6 z&d;VpJC2$lf^4Ui$0C-O3buDuwmuCDpUtLo$Cg{vL7Me`K-TrCSQz%C{X1bc zx=+H|^QFfxjGSR9|03xc3s__X?=WL!bq43*lcXV3-~@*?#OTGx`pjK!`PHw!}Q zw;x=%00wf1k*HMvnqgr+5yHqpmZm0uG5{xAHVVO~AqZiu7Sc(hj$1wC09&=%#?7Md zQQeobiizxJAU^TIRq%f~Ap|bYnL|lCL$>8s`D`E%ICRM^_~!Ow(#BwHyjz?eo11=P z;s>ijUSK3LuF5*u?_=e;ShhaK-^jl1?v}uvh57O7QOU=$g<;q1`cC zc#?g1;?B(cf;%saG&7!R@gK2HR=e{CK-E3>R1MaVJq(ALt8y=AZ6mwsqodo!U9_k_ zOl+b}{YhdY9qg}!3{p>L`!f^jm^V7~fc^Rp_qV3WCQ{4t_z?eyX>(v@MOE&MCz90A ztpkx6R#L^5a*_Y)h9srbXJFL@uM__9321c(E*#R63T9YpxKg|}P8~8}Tti#zF` z1|mFqX3R$GtcapwJd5w*TX+mTgTKOm#3T3o2wn%i=LHmgrg_mMXoF0FxM35TC^m?L5`B3 zldBC5a7}=YMayz%=O`Z9xW>T?Tw^@oTJ%_7mI<6+DS+roN<_JNRv?ciXjZn#f0_BSyJ?!L22W4DkDCMe! l9g7wXJkOCDwsQq29y+Ctg&cI7N - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -GEThttps://jsonplaceholder.typicode.com/posts                                        ■■■■■■■ Send  - -╭─ Collection ───────────────────────╮╭─────────────────────────── Request ─╮╭───────────────── Response  200 OK ─╮ -GET echo││HeadersBodyQueryAuthInfoOBodyHeadersCookiesTrace -GET get random user││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││ Content-Type     application/json   1  [ -▼ jsonplaceholder/││ Referer          https://example.c  2    {                           -▼ posts/││ Accept-Encoding  gzip               3  "userId"1,              -█ GET get all││ Cache-Control    no-cache           4  "id"1,                  -GET get one││  5  "title""sunt aut  -POS create││facere repellat provident  -DEL delete a post││occaecati excepturi optio  -▼ comments/││reprehenderit",               -GET get comments││  6  "body""quia et  -GET get comments (via param)││suscipit\nsuscipit  -PUT edit a comment││recusandae consequuntur  -▼ todos/││expedita et  -GET get all││cum\nreprehenderit  -GET get one││molestiae ut ut quas  -▼ users/││totam\nnostrum rerum est  -GET get a user││autem sunt rem eveniet  -GET get all users││architecto" -POS create a user││  7    },                          -PUT update a user││  8    {                           -DEL delete a user││  9  "userId"1,              -││ 10  "id"2,                  -││ 11  "title""qui est esse" -││Name 12  "body""est rerum  -│────────────────────────────────────││Valuetempore vitae\nsequi sint  -Retrieve all posts││ Add header 1:1read-onlyJSONWrap X -╰─────────────── sample-collections ─╯╰─────────────────────────────────────╯╰─────────────────────────────────────╯ - f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  + + +GEThttps://jsonplaceholder.typicode.com/posts                                        ■■■■■■■ Send  + +╭─ Collection ───────────────────────╮╭─────────────────────────── Request ─╮╭───────────────── Response  200 OK ─╮ +GET echo││HeadersBodyQueryAuthInfoSBodyHeadersCookiesTrace +GET get random user││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││ Content-Type     application/json   1  [ +▼ jsonplaceholder/││ Referer          https://example.c  2    {                           +▼ posts/││ Accept-Encoding  gzip               3  "userId"1,              +█ GET get all││ Cache-Control    no-cache           4  "id"1,                  +GET get one││  5  "title""sunt aut  +POS create││facere repellat provident  +DEL delete a post││occaecati excepturi optio  +▼ comments/││reprehenderit",               +GET get comments││  6  "body""quia et  +GET get comments (via param)││suscipit\nsuscipit  +PUT edit a comment││recusandae consequuntur  +▼ todos/││expedita et  +GET get all││cum\nreprehenderit  +GET get one││molestiae ut ut quas  +▼ users/││totam\nnostrum rerum est  +GET get a user││autem sunt rem eveniet  +GET get all users││architecto" +POS create a user││  7    },                          +PUT update a user││  8    {                           +DEL delete a user││  9  "userId"1,              +││ 10  "id"2,                  +││ 11  "title""qui est esse" +││Name 12  "body""est rerum  +│────────────────────────────────────││Valuetempore vitae\nsequi sint  +Retrieve all posts││ Add header 1:1read-onlyJSONWrap X +╰─────────────── sample-collections ─╯╰─────────────────────────────────────╯╰─────────────────────────────────────╯ + f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  diff --git a/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__json.svg b/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__json.svg index 1ce1f868..52aefef6 100644 --- a/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__json.svg +++ b/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__json.svg @@ -19,211 +19,211 @@ font-weight: 700; } - .terminal-910467972-matrix { + .terminal-413142848-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-910467972-title { + .terminal-413142848-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-910467972-r1 { fill: #1e1f1f } -.terminal-910467972-r2 { fill: #c5c8c6 } -.terminal-910467972-r3 { fill: #c47fe0 } -.terminal-910467972-r4 { fill: #e4f0f9;text-decoration: underline; } -.terminal-910467972-r5 { fill: #e4f0f9 } -.terminal-910467972-r6 { fill: #acd3ed } -.terminal-910467972-r7 { fill: #9b59b6;font-weight: bold;text-decoration: underline; } -.terminal-910467972-r8 { fill: #de4e88;text-decoration: underline; } -.terminal-910467972-r9 { fill: #3498db;font-style: italic; } -.terminal-910467972-r10 { fill: #181919 } -.terminal-910467972-r11 { fill: #051a0e } -.terminal-910467972-r12 { fill: #5e6060 } -.terminal-910467972-r13 { fill: #cfbbdc } -.terminal-910467972-r14 { fill: #9b59b6 } -.terminal-910467972-r15 { fill: #1e1f1f;font-weight: bold } -.terminal-910467972-r16 { fill: #707273 } -.terminal-910467972-r17 { fill: #707273;font-weight: bold } -.terminal-910467972-r18 { fill: #929495 } -.terminal-910467972-r19 { fill: #58d1eb;font-weight: bold } -.terminal-910467972-r20 { fill: #007129 } -.terminal-910467972-r21 { fill: #0ea5e9 } -.terminal-910467972-r22 { fill: #d6d9da } -.terminal-910467972-r23 { fill: #1d1d1e } -.terminal-910467972-r24 { fill: #5a5c5c } -.terminal-910467972-r25 { fill: #181a1a;font-weight: bold } -.terminal-910467972-r26 { fill: #1a1a1a } -.terminal-910467972-r27 { fill: #ef4444 } -.terminal-910467972-r28 { fill: #ecf0f1;font-style: italic; } -.terminal-910467972-r29 { fill: #1e1f1f;font-style: italic; } -.terminal-910467972-r30 { fill: #8e44ad;font-weight: bold;font-style: italic; } -.terminal-910467972-r31 { fill: #27ae60;font-style: italic; } -.terminal-910467972-r32 { fill: #8e44ad;font-weight: bold } -.terminal-910467972-r33 { fill: #27ae60 } -.terminal-910467972-r34 { fill: #e67e22 } -.terminal-910467972-r35 { fill: #f59e0b } -.terminal-910467972-r36 { fill: #767878 } -.terminal-910467972-r37 { fill: #cbcece } -.terminal-910467972-r38 { fill: #27ae60;font-weight: bold } -.terminal-910467972-r39 { fill: #cccfd0;font-weight: bold } -.terminal-910467972-r40 { fill: #cccfd0 } -.terminal-910467972-r41 { fill: #5b5d5e } -.terminal-910467972-r42 { fill: #e0e4e5 } -.terminal-910467972-r43 { fill: #b386c7 } -.terminal-910467972-r44 { fill: #22c55e } -.terminal-910467972-r45 { fill: #595a5b } -.terminal-910467972-r46 { fill: #848787 } -.terminal-910467972-r47 { fill: #dbdfe0 } -.terminal-910467972-r48 { fill: #62c18b;font-weight: bold } -.terminal-910467972-r49 { fill: #af6cca;font-weight: bold } -.terminal-910467972-r50 { fill: #232424 } + .terminal-413142848-r1 { fill: #1e1f1f } +.terminal-413142848-r2 { fill: #c5c8c6 } +.terminal-413142848-r3 { fill: #c47fe0 } +.terminal-413142848-r4 { fill: #e4f0f9;text-decoration: underline; } +.terminal-413142848-r5 { fill: #e4f0f9 } +.terminal-413142848-r6 { fill: #acd3ed } +.terminal-413142848-r7 { fill: #9b59b6;font-weight: bold;text-decoration: underline; } +.terminal-413142848-r8 { fill: #de4e88;text-decoration: underline; } +.terminal-413142848-r9 { fill: #3498db;font-style: italic; } +.terminal-413142848-r10 { fill: #181919 } +.terminal-413142848-r11 { fill: #051a0e } +.terminal-413142848-r12 { fill: #5e6060 } +.terminal-413142848-r13 { fill: #cfbbdc } +.terminal-413142848-r14 { fill: #9b59b6 } +.terminal-413142848-r15 { fill: #1e1f1f;font-weight: bold } +.terminal-413142848-r16 { fill: #707273 } +.terminal-413142848-r17 { fill: #707273;font-weight: bold } +.terminal-413142848-r18 { fill: #929495 } +.terminal-413142848-r19 { fill: #58d1eb;font-weight: bold } +.terminal-413142848-r20 { fill: #007129 } +.terminal-413142848-r21 { fill: #0ea5e9 } +.terminal-413142848-r22 { fill: #d6d9da } +.terminal-413142848-r23 { fill: #1d1d1e } +.terminal-413142848-r24 { fill: #5a5c5c } +.terminal-413142848-r25 { fill: #181a1a;font-weight: bold } +.terminal-413142848-r26 { fill: #1a1a1a } +.terminal-413142848-r27 { fill: #ef4444 } +.terminal-413142848-r28 { fill: #ecf0f1;font-style: italic; } +.terminal-413142848-r29 { fill: #1e1f1f;font-style: italic; } +.terminal-413142848-r30 { fill: #8e44ad;font-weight: bold;font-style: italic; } +.terminal-413142848-r31 { fill: #27ae60;font-style: italic; } +.terminal-413142848-r32 { fill: #8e44ad;font-weight: bold } +.terminal-413142848-r33 { fill: #27ae60 } +.terminal-413142848-r34 { fill: #e67e22 } +.terminal-413142848-r35 { fill: #f59e0b } +.terminal-413142848-r36 { fill: #767878 } +.terminal-413142848-r37 { fill: #cbcece } +.terminal-413142848-r38 { fill: #27ae60;font-weight: bold } +.terminal-413142848-r39 { fill: #cccfd0;font-weight: bold } +.terminal-413142848-r40 { fill: #cccfd0 } +.terminal-413142848-r41 { fill: #5b5d5e } +.terminal-413142848-r42 { fill: #e0e4e5 } +.terminal-413142848-r43 { fill: #b386c7 } +.terminal-413142848-r44 { fill: #22c55e } +.terminal-413142848-r45 { fill: #595a5b } +.terminal-413142848-r46 { fill: #848787 } +.terminal-413142848-r47 { fill: #dbdfe0 } +.terminal-413142848-r48 { fill: #62c18b;font-weight: bold } +.terminal-413142848-r49 { fill: #af6cca;font-weight: bold } +.terminal-413142848-r50 { fill: #232424 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                                        - -POSThttps://jsonplaceholder.typicode.com/posts                              Send  - -╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ -▼ posts/HeadersBodyQueryAuthInfoOptions -GET get all━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get oneRaw (json, text, etc.) -█ POS create1  { -DEL delete a post2  "title""foo",                                          -▼ comments/3  "body""bar",                                           -GET get comments4  "userId"1 -GET get comments (via pa5  }                                                          -PUT edit a comment -▼ todos/2:1JSONWrap X -GET get all╰───────────────────────────────────────────────────────────────╯ -GET get one│╭──────────────────────────────────────────────────── Response ─╮ -▼ users/││BodyHeadersCookiesTrace -GET get a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get all users││ -POS create a user││ -PUT update a user││ -DEL delete a user││ -││ -││ -││ -│─────────────────────────────││ -Create a new post││1:1read-onlyJSONWrap X -╰─────────── jsonplaceholder ─╯╰───────────────────────────────────────────────────────────────╯ - f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Hel + + + + +Posting                                                                                        + +POSThttps://jsonplaceholder.typicode.com/posts                              Send  + +╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ +▼ posts/HeadersBodyQueryAuthInfoScriptsOptions +GET get all━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get oneRaw (json, text, etc.) +█ POS create1  { +DEL delete a post2  "title""foo",                                          +▼ comments/3  "body""bar",                                           +GET get comments4  "userId"1 +GET get comments (via pa5  }                                                          +PUT edit a comment +▼ todos/2:1JSONWrap X +GET get all╰───────────────────────────────────────────────────────────────╯ +GET get one│╭──────────────────────────────────────────────────── Response ─╮ +▼ users/││BodyHeadersCookiesTrace +GET get a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get all users││ +POS create a user││ +PUT update a user││ +DEL delete a user││ +││ +││ +││ +│─────────────────────────────││ +Create a new post││1:1read-onlyJSONWrap X +╰─────────── jsonplaceholder ─╯╰───────────────────────────────────────────────────────────────╯ + f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Hel diff --git a/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__url.svg b/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__url.svg index 1afaf400..292b06b5 100644 --- a/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__url.svg +++ b/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__url.svg @@ -19,197 +19,197 @@ font-weight: 700; } - .terminal-1224347773-matrix { + .terminal-33848362-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1224347773-title { + .terminal-33848362-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1224347773-r1 { fill: #1e1f1f } -.terminal-1224347773-r2 { fill: #c5c8c6 } -.terminal-1224347773-r3 { fill: #c47fe0 } -.terminal-1224347773-r4 { fill: #e4f0f9;text-decoration: underline; } -.terminal-1224347773-r5 { fill: #e4f0f9 } -.terminal-1224347773-r6 { fill: #acd3ed } -.terminal-1224347773-r7 { fill: #9b59b6;font-weight: bold;text-decoration: underline; } -.terminal-1224347773-r8 { fill: #de4e88;text-decoration: underline; } -.terminal-1224347773-r9 { fill: #3498db;font-style: italic; } -.terminal-1224347773-r10 { fill: #181919 } -.terminal-1224347773-r11 { fill: #1a1a1a } -.terminal-1224347773-r12 { fill: #051a0e } -.terminal-1224347773-r13 { fill: #5e6060 } -.terminal-1224347773-r14 { fill: #cfbbdc } -.terminal-1224347773-r15 { fill: #9b59b6 } -.terminal-1224347773-r16 { fill: #1e1f1f;font-weight: bold } -.terminal-1224347773-r17 { fill: #0ea5e9 } -.terminal-1224347773-r18 { fill: #929495 } -.terminal-1224347773-r19 { fill: #58d1eb;font-weight: bold } -.terminal-1224347773-r20 { fill: #181a1a;font-weight: bold } -.terminal-1224347773-r21 { fill: #c3a4d3 } -.terminal-1224347773-r22 { fill: #1d1d1e } -.terminal-1224347773-r23 { fill: #5a5c5c } -.terminal-1224347773-r24 { fill: #d9dee1 } -.terminal-1224347773-r25 { fill: #cccfd0;font-weight: bold } -.terminal-1224347773-r26 { fill: #cccfd0 } -.terminal-1224347773-r27 { fill: #5b5d5e } -.terminal-1224347773-r28 { fill: #e0e4e5 } -.terminal-1224347773-r29 { fill: #b386c7 } -.terminal-1224347773-r30 { fill: #767878 } -.terminal-1224347773-r31 { fill: #595a5b } -.terminal-1224347773-r32 { fill: #848787 } -.terminal-1224347773-r33 { fill: #dbdfe0 } -.terminal-1224347773-r34 { fill: #62c18b;font-weight: bold } -.terminal-1224347773-r35 { fill: #af6cca;font-weight: bold } -.terminal-1224347773-r36 { fill: #232424 } + .terminal-33848362-r1 { fill: #1e1f1f } +.terminal-33848362-r2 { fill: #c5c8c6 } +.terminal-33848362-r3 { fill: #c47fe0 } +.terminal-33848362-r4 { fill: #e4f0f9;text-decoration: underline; } +.terminal-33848362-r5 { fill: #e4f0f9 } +.terminal-33848362-r6 { fill: #acd3ed } +.terminal-33848362-r7 { fill: #9b59b6;font-weight: bold;text-decoration: underline; } +.terminal-33848362-r8 { fill: #de4e88;text-decoration: underline; } +.terminal-33848362-r9 { fill: #3498db;font-style: italic; } +.terminal-33848362-r10 { fill: #181919 } +.terminal-33848362-r11 { fill: #1a1a1a } +.terminal-33848362-r12 { fill: #051a0e } +.terminal-33848362-r13 { fill: #5e6060 } +.terminal-33848362-r14 { fill: #cfbbdc } +.terminal-33848362-r15 { fill: #9b59b6 } +.terminal-33848362-r16 { fill: #1e1f1f;font-weight: bold } +.terminal-33848362-r17 { fill: #0ea5e9 } +.terminal-33848362-r18 { fill: #929495 } +.terminal-33848362-r19 { fill: #58d1eb;font-weight: bold } +.terminal-33848362-r20 { fill: #181a1a;font-weight: bold } +.terminal-33848362-r21 { fill: #c3a4d3 } +.terminal-33848362-r22 { fill: #1d1d1e } +.terminal-33848362-r23 { fill: #5a5c5c } +.terminal-33848362-r24 { fill: #d9dee1 } +.terminal-33848362-r25 { fill: #cccfd0;font-weight: bold } +.terminal-33848362-r26 { fill: #cccfd0 } +.terminal-33848362-r27 { fill: #5b5d5e } +.terminal-33848362-r28 { fill: #e0e4e5 } +.terminal-33848362-r29 { fill: #b386c7 } +.terminal-33848362-r30 { fill: #767878 } +.terminal-33848362-r31 { fill: #595a5b } +.terminal-33848362-r32 { fill: #848787 } +.terminal-33848362-r33 { fill: #dbdfe0 } +.terminal-33848362-r34 { fill: #62c18b;font-weight: bold } +.terminal-33848362-r35 { fill: #af6cca;font-weight: bold } +.terminal-33848362-r36 { fill: #232424 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                                        - -GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID/$lol/ Send  - -╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ -GET get allHeadersBodyQueryAuthInfoOptions -█ GET get one━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -None -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱The request doesn't have a body.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╰───────────────────────────────────────────────────────────────╯ -│╭──────────────────────────────────────────────────── Response ─╮ -││BodyHeadersCookiesTrace -││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -││ -││ -││ -││ -││ -││ -││ -│─────────────────────────────││ -Retrieve one todo││1:1read-onlyJSONWrap X -╰───────────────────── todos ─╯╰───────────────────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  + + + + +Posting                                                                                        + +GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID/$lol/ Send  + +╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ +GET get allHeadersBodyQueryAuthInfoScriptsOptions +█ GET get one━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +None +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱The request doesn't have a body.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╰───────────────────────────────────────────────────────────────╯ +│╭──────────────────────────────────────────────────── Response ─╮ +││BodyHeadersCookiesTrace +││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +││ +││ +││ +││ +││ +││ +││ +│─────────────────────────────││ +Retrieve one todo││1:1read-onlyJSONWrap X +╰───────────────────── todos ─╯╰───────────────────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  diff --git a/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__json.svg b/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__json.svg index bdf1305b..e4e2d824 100644 --- a/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__json.svg +++ b/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__json.svg @@ -19,210 +19,210 @@ font-weight: 700; } - .terminal-2634244097-matrix { + .terminal-689556499-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2634244097-title { + .terminal-689556499-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2634244097-r1 { fill: #1d1f20 } -.terminal-2634244097-r2 { fill: #c5c8c6 } -.terminal-2634244097-r3 { fill: #ff5c51 } -.terminal-2634244097-r4 { fill: #ddf3f5;text-decoration: underline; } -.terminal-2634244097-r5 { fill: #ddf3f5 } -.terminal-2634244097-r6 { fill: #99dbe3 } -.terminal-2634244097-r7 { fill: #d32f2f } -.terminal-2634244097-r8 { fill: #797979 } -.terminal-2634244097-r9 { fill: #00acc1 } -.terminal-2634244097-r10 { fill: #212121 } -.terminal-2634244097-r11 { fill: #e1effb } -.terminal-2634244097-r12 { fill: #5a6065 } -.terminal-2634244097-r13 { fill: #ddadb4 } -.terminal-2634244097-r14 { fill: #d22f2f } -.terminal-2634244097-r15 { fill: #1d1f20;font-weight: bold } -.terminal-2634244097-r16 { fill: #6c7378 } -.terminal-2634244097-r17 { fill: #6c7378;font-weight: bold } -.terminal-2634244097-r18 { fill: #8c969c } -.terminal-2634244097-r19 { fill: #58d1eb;font-weight: bold } -.terminal-2634244097-r20 { fill: #00640d } -.terminal-2634244097-r21 { fill: #0ea5e9 } -.terminal-2634244097-r22 { fill: #cfdbe3 } -.terminal-2634244097-r23 { fill: #1c1e1f } -.terminal-2634244097-r24 { fill: #575c61 } -.terminal-2634244097-r25 { fill: #1f2021;font-weight: bold } -.terminal-2634244097-r26 { fill: #889197 } -.terminal-2634244097-r27 { fill: #1d1617 } -.terminal-2634244097-r28 { fill: #ef4444 } -.terminal-2634244097-r29 { fill: #575c61;font-weight: bold } -.terminal-2634244097-r30 { fill: #f9e3e3 } -.terminal-2634244097-r31 { fill: #569cd6;font-weight: bold } -.terminal-2634244097-r32 { fill: #ce9178 } -.terminal-2634244097-r33 { fill: #b5cea8 } -.terminal-2634244097-r34 { fill: #f59e0b } -.terminal-2634244097-r35 { fill: #71797e } -.terminal-2634244097-r36 { fill: #c5cfd7 } -.terminal-2634244097-r37 { fill: #43a047;font-weight: bold } -.terminal-2634244097-r38 { fill: #c4d1da;font-weight: bold } -.terminal-2634244097-r39 { fill: #c4d1da } -.terminal-2634244097-r40 { fill: #585e62 } -.terminal-2634244097-r41 { fill: #d9e6f0 } -.terminal-2634244097-r42 { fill: #d7696c } -.terminal-2634244097-r43 { fill: #22c55e } -.terminal-2634244097-r44 { fill: #555b5f } -.terminal-2634244097-r45 { fill: #7f888e } -.terminal-2634244097-r46 { fill: #d4e0ea } -.terminal-2634244097-r47 { fill: #73b87d;font-weight: bold } -.terminal-2634244097-r48 { fill: #eb4640;font-weight: bold } -.terminal-2634244097-r49 { fill: #222425 } + .terminal-689556499-r1 { fill: #1d1f20 } +.terminal-689556499-r2 { fill: #c5c8c6 } +.terminal-689556499-r3 { fill: #ff5c51 } +.terminal-689556499-r4 { fill: #ddf3f5;text-decoration: underline; } +.terminal-689556499-r5 { fill: #ddf3f5 } +.terminal-689556499-r6 { fill: #99dbe3 } +.terminal-689556499-r7 { fill: #d32f2f } +.terminal-689556499-r8 { fill: #797979 } +.terminal-689556499-r9 { fill: #00acc1 } +.terminal-689556499-r10 { fill: #212121 } +.terminal-689556499-r11 { fill: #e1effb } +.terminal-689556499-r12 { fill: #5a6065 } +.terminal-689556499-r13 { fill: #ddadb4 } +.terminal-689556499-r14 { fill: #d22f2f } +.terminal-689556499-r15 { fill: #1d1f20;font-weight: bold } +.terminal-689556499-r16 { fill: #6c7378 } +.terminal-689556499-r17 { fill: #6c7378;font-weight: bold } +.terminal-689556499-r18 { fill: #8c969c } +.terminal-689556499-r19 { fill: #58d1eb;font-weight: bold } +.terminal-689556499-r20 { fill: #00640d } +.terminal-689556499-r21 { fill: #0ea5e9 } +.terminal-689556499-r22 { fill: #cfdbe3 } +.terminal-689556499-r23 { fill: #1c1e1f } +.terminal-689556499-r24 { fill: #575c61 } +.terminal-689556499-r25 { fill: #1f2021;font-weight: bold } +.terminal-689556499-r26 { fill: #889197 } +.terminal-689556499-r27 { fill: #1d1617 } +.terminal-689556499-r28 { fill: #ef4444 } +.terminal-689556499-r29 { fill: #575c61;font-weight: bold } +.terminal-689556499-r30 { fill: #f9e3e3 } +.terminal-689556499-r31 { fill: #569cd6;font-weight: bold } +.terminal-689556499-r32 { fill: #ce9178 } +.terminal-689556499-r33 { fill: #b5cea8 } +.terminal-689556499-r34 { fill: #f59e0b } +.terminal-689556499-r35 { fill: #71797e } +.terminal-689556499-r36 { fill: #c5cfd7 } +.terminal-689556499-r37 { fill: #43a047;font-weight: bold } +.terminal-689556499-r38 { fill: #c4d1da;font-weight: bold } +.terminal-689556499-r39 { fill: #c4d1da } +.terminal-689556499-r40 { fill: #585e62 } +.terminal-689556499-r41 { fill: #d9e6f0 } +.terminal-689556499-r42 { fill: #d7696c } +.terminal-689556499-r43 { fill: #22c55e } +.terminal-689556499-r44 { fill: #555b5f } +.terminal-689556499-r45 { fill: #7f888e } +.terminal-689556499-r46 { fill: #d4e0ea } +.terminal-689556499-r47 { fill: #73b87d;font-weight: bold } +.terminal-689556499-r48 { fill: #eb4640;font-weight: bold } +.terminal-689556499-r49 { fill: #222425 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                                        - -POSThttps://jsonplaceholder.typicode.com/posts                              Send  - -╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ -▼ posts/HeadersBodyQueryAuthInfoOptions -GET get all━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get oneRaw (json, text, etc.) -█ POS create1  { -DEL delete a post2  "title""foo",                                          -▼ comments/3  "body""bar",                                           -GET get comments4  "userId"1 -GET get comments (via pa5  }                                                          -PUT edit a comment -▼ todos/2:1JSONWrap X -GET get all╰───────────────────────────────────────────────────────────────╯ -GET get one│╭──────────────────────────────────────────────────── Response ─╮ -▼ users/││BodyHeadersCookiesTrace -GET get a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get all users││ -POS create a user││ -PUT update a user││ -DEL delete a user││ -││ -││ -││ -│─────────────────────────────││ -Create a new post││1:1read-onlyJSONWrap X -╰─────────── jsonplaceholder ─╯╰───────────────────────────────────────────────────────────────╯ - f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Hel + + + + +Posting                                                                                        + +POSThttps://jsonplaceholder.typicode.com/posts                              Send  + +╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ +▼ posts/HeadersBodyQueryAuthInfoScriptsOptions +GET get all━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get oneRaw (json, text, etc.) +█ POS create1  { +DEL delete a post2  "title""foo",                                          +▼ comments/3  "body""bar",                                           +GET get comments4  "userId"1 +GET get comments (via pa5  }                                                          +PUT edit a comment +▼ todos/2:1JSONWrap X +GET get all╰───────────────────────────────────────────────────────────────╯ +GET get one│╭──────────────────────────────────────────────────── Response ─╮ +▼ users/││BodyHeadersCookiesTrace +GET get a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get all users││ +POS create a user││ +PUT update a user││ +DEL delete a user││ +││ +││ +││ +│─────────────────────────────││ +Create a new post││1:1read-onlyJSONWrap X +╰─────────── jsonplaceholder ─╯╰───────────────────────────────────────────────────────────────╯ + f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Hel diff --git a/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__url.svg b/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__url.svg index 352a4d5e..76be8659 100644 --- a/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__url.svg +++ b/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__url.svg @@ -19,197 +19,197 @@ font-weight: 700; } - .terminal-2363874043-matrix { + .terminal-2876000028-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2363874043-title { + .terminal-2876000028-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2363874043-r1 { fill: #1d1f20 } -.terminal-2363874043-r2 { fill: #c5c8c6 } -.terminal-2363874043-r3 { fill: #ff5c51 } -.terminal-2363874043-r4 { fill: #ddf3f5;text-decoration: underline; } -.terminal-2363874043-r5 { fill: #ddf3f5 } -.terminal-2363874043-r6 { fill: #99dbe3 } -.terminal-2363874043-r7 { fill: #d32f2f } -.terminal-2363874043-r8 { fill: #797979 } -.terminal-2363874043-r9 { fill: #00acc1 } -.terminal-2363874043-r10 { fill: #212121 } -.terminal-2363874043-r11 { fill: #43a047 } -.terminal-2363874043-r12 { fill: #e1effb } -.terminal-2363874043-r13 { fill: #5a6065 } -.terminal-2363874043-r14 { fill: #ddadb4 } -.terminal-2363874043-r15 { fill: #d22f2f } -.terminal-2363874043-r16 { fill: #1d1f20;font-weight: bold } -.terminal-2363874043-r17 { fill: #0ea5e9 } -.terminal-2363874043-r18 { fill: #8c969c } -.terminal-2363874043-r19 { fill: #58d1eb;font-weight: bold } -.terminal-2363874043-r20 { fill: #1f2021;font-weight: bold } -.terminal-2363874043-r21 { fill: #da9096 } -.terminal-2363874043-r22 { fill: #1c1e1f } -.terminal-2363874043-r23 { fill: #575c61 } -.terminal-2363874043-r24 { fill: #f6fbfe } -.terminal-2363874043-r25 { fill: #c4d1da;font-weight: bold } -.terminal-2363874043-r26 { fill: #c4d1da } -.terminal-2363874043-r27 { fill: #585e62 } -.terminal-2363874043-r28 { fill: #d9e6f0 } -.terminal-2363874043-r29 { fill: #d7696c } -.terminal-2363874043-r30 { fill: #71797e } -.terminal-2363874043-r31 { fill: #555b5f } -.terminal-2363874043-r32 { fill: #7f888e } -.terminal-2363874043-r33 { fill: #d4e0ea } -.terminal-2363874043-r34 { fill: #73b87d;font-weight: bold } -.terminal-2363874043-r35 { fill: #eb4640;font-weight: bold } -.terminal-2363874043-r36 { fill: #222425 } + .terminal-2876000028-r1 { fill: #1d1f20 } +.terminal-2876000028-r2 { fill: #c5c8c6 } +.terminal-2876000028-r3 { fill: #ff5c51 } +.terminal-2876000028-r4 { fill: #ddf3f5;text-decoration: underline; } +.terminal-2876000028-r5 { fill: #ddf3f5 } +.terminal-2876000028-r6 { fill: #99dbe3 } +.terminal-2876000028-r7 { fill: #d32f2f } +.terminal-2876000028-r8 { fill: #797979 } +.terminal-2876000028-r9 { fill: #00acc1 } +.terminal-2876000028-r10 { fill: #212121 } +.terminal-2876000028-r11 { fill: #43a047 } +.terminal-2876000028-r12 { fill: #e1effb } +.terminal-2876000028-r13 { fill: #5a6065 } +.terminal-2876000028-r14 { fill: #ddadb4 } +.terminal-2876000028-r15 { fill: #d22f2f } +.terminal-2876000028-r16 { fill: #1d1f20;font-weight: bold } +.terminal-2876000028-r17 { fill: #0ea5e9 } +.terminal-2876000028-r18 { fill: #8c969c } +.terminal-2876000028-r19 { fill: #58d1eb;font-weight: bold } +.terminal-2876000028-r20 { fill: #1f2021;font-weight: bold } +.terminal-2876000028-r21 { fill: #da9096 } +.terminal-2876000028-r22 { fill: #1c1e1f } +.terminal-2876000028-r23 { fill: #575c61 } +.terminal-2876000028-r24 { fill: #f6fbfe } +.terminal-2876000028-r25 { fill: #c4d1da;font-weight: bold } +.terminal-2876000028-r26 { fill: #c4d1da } +.terminal-2876000028-r27 { fill: #585e62 } +.terminal-2876000028-r28 { fill: #d9e6f0 } +.terminal-2876000028-r29 { fill: #d7696c } +.terminal-2876000028-r30 { fill: #71797e } +.terminal-2876000028-r31 { fill: #555b5f } +.terminal-2876000028-r32 { fill: #7f888e } +.terminal-2876000028-r33 { fill: #d4e0ea } +.terminal-2876000028-r34 { fill: #73b87d;font-weight: bold } +.terminal-2876000028-r35 { fill: #eb4640;font-weight: bold } +.terminal-2876000028-r36 { fill: #222425 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                                        - -GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID/$lol/ Send  - -╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ -GET get allHeadersBodyQueryAuthInfoOptions -█ GET get one━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -None -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱The request doesn't have a body.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╰───────────────────────────────────────────────────────────────╯ -│╭──────────────────────────────────────────────────── Response ─╮ -││BodyHeadersCookiesTrace -││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -││ -││ -││ -││ -││ -││ -││ -│─────────────────────────────││ -Retrieve one todo││1:1read-onlyJSONWrap X -╰───────────────────── todos ─╯╰───────────────────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  + + + + +Posting                                                                                        + +GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID/$lol/ Send  + +╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ +GET get allHeadersBodyQueryAuthInfoScriptsOptions +█ GET get one━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +None +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱The request doesn't have a body.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╰───────────────────────────────────────────────────────────────╯ +│╭──────────────────────────────────────────────────── Response ─╮ +││BodyHeadersCookiesTrace +││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +││ +││ +││ +││ +││ +││ +││ +│─────────────────────────────││ +Retrieve one todo││1:1read-onlyJSONWrap X +╰───────────────────── todos ─╯╰───────────────────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  diff --git a/tests/__snapshots__/test_snapshots/TestHelpScreen.test_help_screen_appears.svg b/tests/__snapshots__/test_snapshots/TestHelpScreen.test_help_screen_appears.svg index 40df2450..81edc904 100644 --- a/tests/__snapshots__/test_snapshots/TestHelpScreen.test_help_screen_appears.svg +++ b/tests/__snapshots__/test_snapshots/TestHelpScreen.test_help_screen_appears.svg @@ -19,250 +19,250 @@ font-weight: 700; } - .terminal-428911520-matrix { + .terminal-311536695-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-428911520-title { + .terminal-311536695-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-428911520-r1 { fill: #9c9c9d } -.terminal-428911520-r2 { fill: #c5c8c6 } -.terminal-428911520-r3 { fill: #dfdfe0 } -.terminal-428911520-r4 { fill: #b2669a } -.terminal-428911520-r5 { fill: #0e0b15;text-decoration: underline; } -.terminal-428911520-r6 { fill: #0e0b15 } -.terminal-428911520-r7 { fill: #2e2540 } -.terminal-428911520-r8 { fill: #50505e } -.terminal-428911520-r9 { fill: #9d9da1 } -.terminal-428911520-r10 { fill: #a79eaf } -.terminal-428911520-r11 { fill: #6f6f73 } -.terminal-428911520-r12 { fill: #2e2e3f } -.terminal-428911520-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-428911520-r14 { fill: #dfdfe1 } -.terminal-428911520-r15 { fill: #45203a } -.terminal-428911520-r16 { fill: #0f0f1f } -.terminal-428911520-r17 { fill: #9e9ea2;font-weight: bold } -.terminal-428911520-r18 { fill: #a5a5ab;font-weight: bold } -.terminal-428911520-r19 { fill: #4a4a51 } -.terminal-428911520-r20 { fill: #0973a3 } -.terminal-428911520-r21 { fill: #191923 } -.terminal-428911520-r22 { fill: #178941 } -.terminal-428911520-r23 { fill: #19192d } -.terminal-428911520-r24 { fill: #616166 } -.terminal-428911520-r25 { fill: #616166;font-weight: bold } -.terminal-428911520-r26 { fill: #8b8b93;font-weight: bold } -.terminal-428911520-r27 { fill: #008042 } -.terminal-428911520-r28 { fill: #a72f2f } -.terminal-428911520-r29 { fill: #a5a5ab } -.terminal-428911520-r30 { fill: #ab6e07 } -.terminal-428911520-r31 { fill: #e0e0e2;font-weight: bold } -.terminal-428911520-r32 { fill: #e0e0e2 } -.terminal-428911520-r33 { fill: #e1e0e4 } -.terminal-428911520-r34 { fill: #e1e0e4;font-weight: bold } -.terminal-428911520-r35 { fill: #e2e0e5 } -.terminal-428911520-r36 { fill: #65626d } -.terminal-428911520-r37 { fill: #e2e0e5;font-weight: bold } -.terminal-428911520-r38 { fill: #707074 } -.terminal-428911520-r39 { fill: #11111c } -.terminal-428911520-r40 { fill: #0d0e2e } -.terminal-428911520-r41 { fill: #6f6f78;font-weight: bold } -.terminal-428911520-r42 { fill: #6f6f78 } -.terminal-428911520-r43 { fill: #5e5e64 } -.terminal-428911520-r44 { fill: #727276 } -.terminal-428911520-r45 { fill: #535359 } -.terminal-428911520-r46 { fill: #15151f } -.terminal-428911520-r47 { fill: #027d51;font-weight: bold } -.terminal-428911520-r48 { fill: #b2588c;font-weight: bold } -.terminal-428911520-r49 { fill: #99999a } + .terminal-311536695-r1 { fill: #9c9c9d } +.terminal-311536695-r2 { fill: #c5c8c6 } +.terminal-311536695-r3 { fill: #dfdfe0 } +.terminal-311536695-r4 { fill: #b2669a } +.terminal-311536695-r5 { fill: #0e0b15;text-decoration: underline; } +.terminal-311536695-r6 { fill: #0e0b15 } +.terminal-311536695-r7 { fill: #2e2540 } +.terminal-311536695-r8 { fill: #50505e } +.terminal-311536695-r9 { fill: #9d9da1 } +.terminal-311536695-r10 { fill: #a79eaf } +.terminal-311536695-r11 { fill: #6f6f73 } +.terminal-311536695-r12 { fill: #2e2e3f } +.terminal-311536695-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-311536695-r14 { fill: #dfdfe1 } +.terminal-311536695-r15 { fill: #45203a } +.terminal-311536695-r16 { fill: #0f0f1f } +.terminal-311536695-r17 { fill: #9e9ea2;font-weight: bold } +.terminal-311536695-r18 { fill: #a5a5ab;font-weight: bold } +.terminal-311536695-r19 { fill: #4a4a51 } +.terminal-311536695-r20 { fill: #0973a3 } +.terminal-311536695-r21 { fill: #191923 } +.terminal-311536695-r22 { fill: #178941 } +.terminal-311536695-r23 { fill: #19192d } +.terminal-311536695-r24 { fill: #616166 } +.terminal-311536695-r25 { fill: #616166;font-weight: bold } +.terminal-311536695-r26 { fill: #8b8b93;font-weight: bold } +.terminal-311536695-r27 { fill: #008042 } +.terminal-311536695-r28 { fill: #a72f2f } +.terminal-311536695-r29 { fill: #a5a5ab } +.terminal-311536695-r30 { fill: #ab6e07 } +.terminal-311536695-r31 { fill: #e0e0e2;font-weight: bold } +.terminal-311536695-r32 { fill: #e0e0e2 } +.terminal-311536695-r33 { fill: #e1e0e4 } +.terminal-311536695-r34 { fill: #e1e0e4;font-weight: bold } +.terminal-311536695-r35 { fill: #e2e0e5 } +.terminal-311536695-r36 { fill: #65626d } +.terminal-311536695-r37 { fill: #e2e0e5;font-weight: bold } +.terminal-311536695-r38 { fill: #707074 } +.terminal-311536695-r39 { fill: #11111c } +.terminal-311536695-r40 { fill: #0d0e2e } +.terminal-311536695-r41 { fill: #6f6f78;font-weight: bold } +.terminal-311536695-r42 { fill: #6f6f78 } +.terminal-311536695-r43 { fill: #5e5e64 } +.terminal-311536695-r44 { fill: #727276 } +.terminal-311536695-r45 { fill: #535359 } +.terminal-311536695-r46 { fill: #15151f } +.terminal-311536695-r47 { fill: #027d51;font-weight: bold } +.terminal-311536695-r48 { fill: #b2588c;font-weight: bold } +.terminal-311536695-r49 { fill: #99999a } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  -▁▁Focused Widget Help (Address Bar)▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ -╭─ Collectio Request ─╮ - GET echoAddress Barions -GET get raEnter the URL to send a request to. Refer to ━━━━━━━━━━━ -POS echo pvariables from the environment (loaded via ╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplace--env) using $variable or ${variable} syntax. ╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/Resolved variables will be highlighted green. ╱╱╱╱╱╱╱╱╱╱╱ -GET geMove the cursor over a variable to preview the╱╱╱╱╱╱╱╱╱╱╱ -GET gevalue. Base URL suggestions are loaded based ╱╱╱╱╱╱╱╱╱╱╱ -POS cron the URLs found in the currently open ╱╱╱╱╱╱╱╱╱╱╱ -DEL decollection. Press ctrl+l to quickly focus this╱╱╱╱╱╱╱╱╱╱╱ -▼ commebar from elsewhere.╱╱╱╱╱╱╱╱╱╱╱ -GET╱╱╱╱╱╱╱╱╱╱╱ -GETAll Keybindings╱╱╱╱╱╱╱╱╱╱╱ -PUT Key   Description                   ╱╱╱╱╱╱╱╱╱╱╱ -▼ todos/ cursor left                   ╱╱╱╱╱╱╱╱╱╱╱ -GET ge^← cursor left word               header  -GET ge cursor right                  ───────────╯ -▼ users/^→ cursor right word              Response ─╮ -GET ge delete left                    -GET gehome home                          ━━━━━━━━━━━ -POS cr^a home                           -PUT upend end                            -DEL de^e end                            -del delete right                   -^d delete right                   - submit                         - -Press ESC to dismiss. -│───────────Note: This page relates to the widget that is  -This is ancurrently focused. -server we  -see exactl▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETEnter a URL... Send  +▁▁Focused Widget Help (Address Bar)▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ +╭─ Collectio Request ─╮ + GET echoAddress BariptsOptio +GET get raEnter the URL to send a request to. Refer to ━━━━━━━━━━━ +POS echo pvariables from the environment (loaded via ╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplace--env) using $variable or ${variable} syntax. ╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/Resolved variables will be highlighted green. ╱╱╱╱╱╱╱╱╱╱╱ +GET geMove the cursor over a variable to preview the╱╱╱╱╱╱╱╱╱╱╱ +GET gevalue. Base URL suggestions are loaded based ╱╱╱╱╱╱╱╱╱╱╱ +POS cron the URLs found in the currently open ╱╱╱╱╱╱╱╱╱╱╱ +DEL decollection. Press ctrl+l to quickly focus this╱╱╱╱╱╱╱╱╱╱╱ +▼ commebar from elsewhere.╱╱╱╱╱╱╱╱╱╱╱ +GET╱╱╱╱╱╱╱╱╱╱╱ +GETAll Keybindings╱╱╱╱╱╱╱╱╱╱╱ +PUT Key   Description                   ╱╱╱╱╱╱╱╱╱╱╱ +▼ todos/ cursor left                   ╱╱╱╱╱╱╱╱╱╱╱ +GET ge^← cursor left word               header  +GET ge cursor right                  ───────────╯ +▼ users/^→ cursor right word              Response ─╮ +GET ge delete left                    +GET gehome home                          ━━━━━━━━━━━ +POS cr^a home                           +PUT upend end                            +DEL de^e end                            +del delete right                   +^d delete right                   + submit                         + +Press ESC to dismiss. +│───────────Note: This page relates to the widget that is  +This is ancurrently focused. +server we  +see exactl▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg b/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg index f3b03428..129c5031 100644 --- a/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg +++ b/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg @@ -19,166 +19,164 @@ font-weight: 700; } - .terminal-1907060174-matrix { + .terminal-2013397361-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1907060174-title { + .terminal-2013397361-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1907060174-r1 { fill: #dfdfe1 } -.terminal-1907060174-r2 { fill: #c5c8c6 } -.terminal-1907060174-r3 { fill: #ff93dd } -.terminal-1907060174-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1907060174-r5 { fill: #15111e } -.terminal-1907060174-r6 { fill: #43365c } -.terminal-1907060174-r7 { fill: #737387 } -.terminal-1907060174-r8 { fill: #e1e1e6 } -.terminal-1907060174-r9 { fill: #efe3fb } -.terminal-1907060174-r10 { fill: #9f9fa5 } -.terminal-1907060174-r11 { fill: #632e53 } -.terminal-1907060174-r12 { fill: #ff69b4 } -.terminal-1907060174-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-1907060174-r14 { fill: #e3e3e8;font-weight: bold } -.terminal-1907060174-r15 { fill: #6a6a74 } -.terminal-1907060174-r16 { fill: #0ea5e9 } -.terminal-1907060174-r17 { fill: #873c69 } -.terminal-1907060174-r18 { fill: #22c55e } -.terminal-1907060174-r19 { fill: #30303b } -.terminal-1907060174-r20 { fill: #00fa9a;font-weight: bold } -.terminal-1907060174-r21 { fill: #8b8b93 } -.terminal-1907060174-r22 { fill: #8b8b93;font-weight: bold } -.terminal-1907060174-r23 { fill: #0d0e2e } -.terminal-1907060174-r24 { fill: #00b85f } -.terminal-1907060174-r25 { fill: #ef4444 } -.terminal-1907060174-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-1907060174-r27 { fill: #2e2e3c } -.terminal-1907060174-r28 { fill: #a0a0a6 } -.terminal-1907060174-r29 { fill: #191928 } -.terminal-1907060174-r30 { fill: #b74e87 } -.terminal-1907060174-r31 { fill: #87878f } -.terminal-1907060174-r32 { fill: #a3a3a9 } -.terminal-1907060174-r33 { fill: #777780 } -.terminal-1907060174-r34 { fill: #1f1f2d } -.terminal-1907060174-r35 { fill: #04b375;font-weight: bold } -.terminal-1907060174-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-1907060174-r37 { fill: #dbdbdd } + .terminal-2013397361-r1 { fill: #dfdfe1 } +.terminal-2013397361-r2 { fill: #c5c8c6 } +.terminal-2013397361-r3 { fill: #ff93dd } +.terminal-2013397361-r4 { fill: #15111e;text-decoration: underline; } +.terminal-2013397361-r5 { fill: #15111e } +.terminal-2013397361-r6 { fill: #43365c } +.terminal-2013397361-r7 { fill: #737387 } +.terminal-2013397361-r8 { fill: #e1e1e6 } +.terminal-2013397361-r9 { fill: #efe3fb } +.terminal-2013397361-r10 { fill: #9f9fa5 } +.terminal-2013397361-r11 { fill: #632e53 } +.terminal-2013397361-r12 { fill: #ff69b4 } +.terminal-2013397361-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-2013397361-r14 { fill: #e3e3e8;font-weight: bold } +.terminal-2013397361-r15 { fill: #6a6a74 } +.terminal-2013397361-r16 { fill: #0ea5e9 } +.terminal-2013397361-r17 { fill: #873c69 } +.terminal-2013397361-r18 { fill: #22c55e } +.terminal-2013397361-r19 { fill: #8b8b93 } +.terminal-2013397361-r20 { fill: #8b8b93;font-weight: bold } +.terminal-2013397361-r21 { fill: #0d0e2e } +.terminal-2013397361-r22 { fill: #00b85f } +.terminal-2013397361-r23 { fill: #ef4444 } +.terminal-2013397361-r24 { fill: #2e2e3c;font-weight: bold } +.terminal-2013397361-r25 { fill: #2e2e3c } +.terminal-2013397361-r26 { fill: #a0a0a6 } +.terminal-2013397361-r27 { fill: #191928 } +.terminal-2013397361-r28 { fill: #b74e87 } +.terminal-2013397361-r29 { fill: #87878f } +.terminal-2013397361-r30 { fill: #a3a3a9 } +.terminal-2013397361-r31 { fill: #777780 } +.terminal-2013397361-r32 { fill: #1f1f2d } +.terminal-2013397361-r33 { fill: #04b375;font-weight: bold } +.terminal-2013397361-r34 { fill: #ff7ec8;font-weight: bold } +.terminal-2013397361-r35 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echoHeadersBodyQueryAuthInfoOptions -GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━╺━━━━━━ -POS echo postX Follow redirects -▼ jsonplaceholder/ -▼ posts/X Verify SSL certificates -GET get all -GET get one╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echoadersBodyQueryAuthInfoScriptsOptions +GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━╺━━━━━━━━━ +POS echo postPre-request script optional +▼ jsonplaceholder/Collection-relative path to pre-request  +▼ posts/ +GET get allPost-response script optional +GET get one╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestJumpMode.test_focus_switch.svg b/tests/__snapshots__/test_snapshots/TestJumpMode.test_focus_switch.svg index 5f22f9ff..34e47730 100644 --- a/tests/__snapshots__/test_snapshots/TestJumpMode.test_focus_switch.svg +++ b/tests/__snapshots__/test_snapshots/TestJumpMode.test_focus_switch.svg @@ -19,166 +19,166 @@ font-weight: 700; } - .terminal-1712740851-matrix { + .terminal-1577605832-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1712740851-title { + .terminal-1577605832-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1712740851-r1 { fill: #dfdfe1 } -.terminal-1712740851-r2 { fill: #c5c8c6 } -.terminal-1712740851-r3 { fill: #ff93dd } -.terminal-1712740851-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1712740851-r5 { fill: #15111e } -.terminal-1712740851-r6 { fill: #43365c } -.terminal-1712740851-r7 { fill: #737387 } -.terminal-1712740851-r8 { fill: #e1e1e6 } -.terminal-1712740851-r9 { fill: #efe3fb } -.terminal-1712740851-r10 { fill: #9f9fa5 } -.terminal-1712740851-r11 { fill: #ff69b4 } -.terminal-1712740851-r12 { fill: #dfdfe1;font-weight: bold } -.terminal-1712740851-r13 { fill: #632e53 } -.terminal-1712740851-r14 { fill: #210d17;font-weight: bold } -.terminal-1712740851-r15 { fill: #6a6a74 } -.terminal-1712740851-r16 { fill: #0ea5e9 } -.terminal-1712740851-r17 { fill: #252532 } -.terminal-1712740851-r18 { fill: #22c55e } -.terminal-1712740851-r19 { fill: #252441 } -.terminal-1712740851-r20 { fill: #8b8b93 } -.terminal-1712740851-r21 { fill: #8b8b93;font-weight: bold } -.terminal-1712740851-r22 { fill: #0d0e2e } -.terminal-1712740851-r23 { fill: #00b85f } -.terminal-1712740851-r24 { fill: #918d9d } -.terminal-1712740851-r25 { fill: #ef4444 } -.terminal-1712740851-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-1712740851-r27 { fill: #2e2e3c } -.terminal-1712740851-r28 { fill: #a0a0a6 } -.terminal-1712740851-r29 { fill: #191928 } -.terminal-1712740851-r30 { fill: #b74e87 } -.terminal-1712740851-r31 { fill: #87878f } -.terminal-1712740851-r32 { fill: #a3a3a9 } -.terminal-1712740851-r33 { fill: #777780 } -.terminal-1712740851-r34 { fill: #1f1f2d } -.terminal-1712740851-r35 { fill: #04b375;font-weight: bold } -.terminal-1712740851-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-1712740851-r37 { fill: #dbdbdd } + .terminal-1577605832-r1 { fill: #dfdfe1 } +.terminal-1577605832-r2 { fill: #c5c8c6 } +.terminal-1577605832-r3 { fill: #ff93dd } +.terminal-1577605832-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1577605832-r5 { fill: #15111e } +.terminal-1577605832-r6 { fill: #43365c } +.terminal-1577605832-r7 { fill: #737387 } +.terminal-1577605832-r8 { fill: #e1e1e6 } +.terminal-1577605832-r9 { fill: #efe3fb } +.terminal-1577605832-r10 { fill: #9f9fa5 } +.terminal-1577605832-r11 { fill: #ff69b4 } +.terminal-1577605832-r12 { fill: #dfdfe1;font-weight: bold } +.terminal-1577605832-r13 { fill: #632e53 } +.terminal-1577605832-r14 { fill: #210d17;font-weight: bold } +.terminal-1577605832-r15 { fill: #6a6a74 } +.terminal-1577605832-r16 { fill: #0ea5e9 } +.terminal-1577605832-r17 { fill: #252532 } +.terminal-1577605832-r18 { fill: #22c55e } +.terminal-1577605832-r19 { fill: #252441 } +.terminal-1577605832-r20 { fill: #8b8b93 } +.terminal-1577605832-r21 { fill: #8b8b93;font-weight: bold } +.terminal-1577605832-r22 { fill: #0d0e2e } +.terminal-1577605832-r23 { fill: #00b85f } +.terminal-1577605832-r24 { fill: #918d9d } +.terminal-1577605832-r25 { fill: #ef4444 } +.terminal-1577605832-r26 { fill: #2e2e3c;font-weight: bold } +.terminal-1577605832-r27 { fill: #2e2e3c } +.terminal-1577605832-r28 { fill: #a0a0a6 } +.terminal-1577605832-r29 { fill: #191928 } +.terminal-1577605832-r30 { fill: #b74e87 } +.terminal-1577605832-r31 { fill: #87878f } +.terminal-1577605832-r32 { fill: #a3a3a9 } +.terminal-1577605832-r33 { fill: #777780 } +.terminal-1577605832-r34 { fill: #1f1f2d } +.terminal-1577605832-r35 { fill: #04b375;font-weight: bold } +.terminal-1577605832-r36 { fill: #ff7ec8;font-weight: bold } +.terminal-1577605832-r37 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echoHeadersBodyQueryAuthInfoOptions -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get allNameValue Add header  -GET get one╰─────────────────────────────────────────────────╯ -POS create╭────────────────────────────────────── Response ─╮ -DEL delete a postBodyHeadersCookiesTrace -───────────────────────━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo  -server we can use to  -see exactly what  -request is being  -sent.1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get allNameValue Add header  +GET get one╰─────────────────────────────────────────────────╯ +POS create╭────────────────────────────────────── Response ─╮ +DEL delete a postBodyHeadersCookiesTrace +───────────────────────━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo  +server we can use to  +see exactly what  +request is being  +sent.1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump diff --git a/tests/__snapshots__/test_snapshots/TestJumpMode.test_loads.svg b/tests/__snapshots__/test_snapshots/TestJumpMode.test_loads.svg index ebed12f8..2d0ffd99 100644 --- a/tests/__snapshots__/test_snapshots/TestJumpMode.test_loads.svg +++ b/tests/__snapshots__/test_snapshots/TestJumpMode.test_loads.svg @@ -19,171 +19,171 @@ font-weight: 700; } - .terminal-799934733-matrix { + .terminal-2796704069-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-799934733-title { + .terminal-2796704069-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-799934733-r1 { fill: #9c9c9d } -.terminal-799934733-r2 { fill: #c5c8c6 } -.terminal-799934733-r3 { fill: #dfdfe0 } -.terminal-799934733-r4 { fill: #b2669a } -.terminal-799934733-r5 { fill: #21131c;font-weight: bold } -.terminal-799934733-r6 { fill: #0e0b15;text-decoration: underline; } -.terminal-799934733-r7 { fill: #0e0b15 } -.terminal-799934733-r8 { fill: #2e2540 } -.terminal-799934733-r9 { fill: #50505e } -.terminal-799934733-r10 { fill: #9d9da1 } -.terminal-799934733-r11 { fill: #a79eaf } -.terminal-799934733-r12 { fill: #6f6f73 } -.terminal-799934733-r13 { fill: #45203a } -.terminal-799934733-r14 { fill: #9e9ea2;font-weight: bold } -.terminal-799934733-r15 { fill: #9c9c9d;font-weight: bold } -.terminal-799934733-r16 { fill: #4a4a51 } -.terminal-799934733-r17 { fill: #0973a3 } -.terminal-799934733-r18 { fill: #191923 } -.terminal-799934733-r19 { fill: #b2497e } -.terminal-799934733-r20 { fill: #178941 } -.terminal-799934733-r21 { fill: #19192d } -.terminal-799934733-r22 { fill: #616166 } -.terminal-799934733-r23 { fill: #616166;font-weight: bold } -.terminal-799934733-r24 { fill: #090920 } -.terminal-799934733-r25 { fill: #008042 } -.terminal-799934733-r26 { fill: #65626d } -.terminal-799934733-r27 { fill: #a72f2f } -.terminal-799934733-r28 { fill: #20202a;font-weight: bold } -.terminal-799934733-r29 { fill: #20202a } -.terminal-799934733-r30 { fill: #707074 } -.terminal-799934733-r31 { fill: #11111c } -.terminal-799934733-r32 { fill: #80365e } -.terminal-799934733-r33 { fill: #5e5e64 } -.terminal-799934733-r34 { fill: #727276 } -.terminal-799934733-r35 { fill: #535359 } -.terminal-799934733-r36 { fill: #15151f } -.terminal-799934733-r37 { fill: #027d51;font-weight: bold } -.terminal-799934733-r38 { fill: #d13c8c } -.terminal-799934733-r39 { fill: #210d17 } -.terminal-799934733-r40 { fill: #707077 } -.terminal-799934733-r41 { fill: #707077;font-weight: bold } + .terminal-2796704069-r1 { fill: #9c9c9d } +.terminal-2796704069-r2 { fill: #c5c8c6 } +.terminal-2796704069-r3 { fill: #dfdfe0 } +.terminal-2796704069-r4 { fill: #b2669a } +.terminal-2796704069-r5 { fill: #21131c;font-weight: bold } +.terminal-2796704069-r6 { fill: #0e0b15;text-decoration: underline; } +.terminal-2796704069-r7 { fill: #0e0b15 } +.terminal-2796704069-r8 { fill: #2e2540 } +.terminal-2796704069-r9 { fill: #50505e } +.terminal-2796704069-r10 { fill: #9d9da1 } +.terminal-2796704069-r11 { fill: #a79eaf } +.terminal-2796704069-r12 { fill: #6f6f73 } +.terminal-2796704069-r13 { fill: #45203a } +.terminal-2796704069-r14 { fill: #9e9ea2;font-weight: bold } +.terminal-2796704069-r15 { fill: #9c9c9d;font-weight: bold } +.terminal-2796704069-r16 { fill: #4a4a51 } +.terminal-2796704069-r17 { fill: #0973a3 } +.terminal-2796704069-r18 { fill: #191923 } +.terminal-2796704069-r19 { fill: #b2497e } +.terminal-2796704069-r20 { fill: #178941 } +.terminal-2796704069-r21 { fill: #19192d } +.terminal-2796704069-r22 { fill: #616166 } +.terminal-2796704069-r23 { fill: #616166;font-weight: bold } +.terminal-2796704069-r24 { fill: #090920 } +.terminal-2796704069-r25 { fill: #008042 } +.terminal-2796704069-r26 { fill: #65626d } +.terminal-2796704069-r27 { fill: #a72f2f } +.terminal-2796704069-r28 { fill: #20202a;font-weight: bold } +.terminal-2796704069-r29 { fill: #20202a } +.terminal-2796704069-r30 { fill: #707074 } +.terminal-2796704069-r31 { fill: #11111c } +.terminal-2796704069-r32 { fill: #80365e } +.terminal-2796704069-r33 { fill: #5e5e64 } +.terminal-2796704069-r34 { fill: #727276 } +.terminal-2796704069-r35 { fill: #535359 } +.terminal-2796704069-r36 { fill: #15151f } +.terminal-2796704069-r37 { fill: #027d51;font-weight: bold } +.terminal-2796704069-r38 { fill: #d13c8c } +.terminal-2796704069-r39 { fill: #210d17 } +.terminal-2796704069-r40 { fill: #707077 } +.terminal-2796704069-r41 { fill: #707077;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -1GET2Enter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -tabT echo││qHeaderswBodyeQueryrAuthtInfoyOptions -GET get random user  ││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post        ││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all      ││NameValue Add header  -GET get one      │╰─────────────────────────────────────────────────╯ -POS create       │╭────────────────────────────────────── Response ─╮ -DEL delete a post││aBodysHeadersdCookiesfTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱Press a key to jump╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -ESC to dismiss                                  + + + + +Posting                                                                    + +1GET2Enter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +tabT echo││qHeaderswBodyeQueryrAuthtInfoyScriptsuOptio +GET get random user  ││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post        ││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all      ││NameValue Add header  +GET get one      │╰─────────────────────────────────────────────────╯ +POS create       │╭────────────────────────────────────── Response ─╮ +DEL delete a post││aBodysHeadersdCookiesfTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱Press a key to jump╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +ESC to dismiss                                  diff --git a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__auth.svg b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__auth.svg index e73f02c9..b4141ae1 100644 --- a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__auth.svg +++ b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__auth.svg @@ -19,249 +19,249 @@ font-weight: 700; } - .terminal-3719494018-matrix { + .terminal-3023361312-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3719494018-title { + .terminal-3023361312-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3719494018-r1 { fill: #dfdfe1 } -.terminal-3719494018-r2 { fill: #c5c8c6 } -.terminal-3719494018-r3 { fill: #ff93dd } -.terminal-3719494018-r4 { fill: #15111e;text-decoration: underline; } -.terminal-3719494018-r5 { fill: #15111e } -.terminal-3719494018-r6 { fill: #43365c } -.terminal-3719494018-r7 { fill: #ff69b4 } -.terminal-3719494018-r8 { fill: #9393a3 } -.terminal-3719494018-r9 { fill: #a684e8 } -.terminal-3719494018-r10 { fill: #e1e1e6 } -.terminal-3719494018-r11 { fill: #efe3fb } -.terminal-3719494018-r12 { fill: #9f9fa5 } -.terminal-3719494018-r13 { fill: #632e53 } -.terminal-3719494018-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-3719494018-r15 { fill: #0ea5e9 } -.terminal-3719494018-r16 { fill: #6a6a74 } -.terminal-3719494018-r17 { fill: #58d1eb;font-weight: bold } -.terminal-3719494018-r18 { fill: #873c69 } -.terminal-3719494018-r19 { fill: #e3e3e8;font-weight: bold } -.terminal-3719494018-r20 { fill: #8b8b93 } -.terminal-3719494018-r21 { fill: #8b8b93;font-weight: bold } -.terminal-3719494018-r22 { fill: #e0e0e2 } -.terminal-3719494018-r23 { fill: #a2a2a8 } -.terminal-3719494018-r24 { fill: #00b85f } -.terminal-3719494018-r25 { fill: #22c55e } -.terminal-3719494018-r26 { fill: #ef4444 } -.terminal-3719494018-r27 { fill: #ff4500 } -.terminal-3719494018-r28 { fill: #f59e0b } -.terminal-3719494018-r29 { fill: #2e2e3c;font-weight: bold } -.terminal-3719494018-r30 { fill: #2e2e3c } -.terminal-3719494018-r31 { fill: #a0a0a6 } -.terminal-3719494018-r32 { fill: #191928 } -.terminal-3719494018-r33 { fill: #b74e87 } -.terminal-3719494018-r34 { fill: #87878f } -.terminal-3719494018-r35 { fill: #a3a3a9 } -.terminal-3719494018-r36 { fill: #777780 } -.terminal-3719494018-r37 { fill: #1f1f2d } -.terminal-3719494018-r38 { fill: #04b375;font-weight: bold } -.terminal-3719494018-r39 { fill: #ff7ec8;font-weight: bold } -.terminal-3719494018-r40 { fill: #dbdbdd } + .terminal-3023361312-r1 { fill: #dfdfe1 } +.terminal-3023361312-r2 { fill: #c5c8c6 } +.terminal-3023361312-r3 { fill: #ff93dd } +.terminal-3023361312-r4 { fill: #15111e;text-decoration: underline; } +.terminal-3023361312-r5 { fill: #15111e } +.terminal-3023361312-r6 { fill: #43365c } +.terminal-3023361312-r7 { fill: #ff69b4 } +.terminal-3023361312-r8 { fill: #9393a3 } +.terminal-3023361312-r9 { fill: #a684e8 } +.terminal-3023361312-r10 { fill: #e1e1e6 } +.terminal-3023361312-r11 { fill: #efe3fb } +.terminal-3023361312-r12 { fill: #9f9fa5 } +.terminal-3023361312-r13 { fill: #632e53 } +.terminal-3023361312-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-3023361312-r15 { fill: #0ea5e9 } +.terminal-3023361312-r16 { fill: #6a6a74 } +.terminal-3023361312-r17 { fill: #58d1eb;font-weight: bold } +.terminal-3023361312-r18 { fill: #873c69 } +.terminal-3023361312-r19 { fill: #e3e3e8;font-weight: bold } +.terminal-3023361312-r20 { fill: #8b8b93 } +.terminal-3023361312-r21 { fill: #8b8b93;font-weight: bold } +.terminal-3023361312-r22 { fill: #e0e0e2 } +.terminal-3023361312-r23 { fill: #a2a2a8 } +.terminal-3023361312-r24 { fill: #00b85f } +.terminal-3023361312-r25 { fill: #22c55e } +.terminal-3023361312-r26 { fill: #ef4444 } +.terminal-3023361312-r27 { fill: #ff4500 } +.terminal-3023361312-r28 { fill: #f59e0b } +.terminal-3023361312-r29 { fill: #2e2e3c;font-weight: bold } +.terminal-3023361312-r30 { fill: #2e2e3c } +.terminal-3023361312-r31 { fill: #a0a0a6 } +.terminal-3023361312-r32 { fill: #191928 } +.terminal-3023361312-r33 { fill: #b74e87 } +.terminal-3023361312-r34 { fill: #87878f } +.terminal-3023361312-r35 { fill: #a3a3a9 } +.terminal-3023361312-r36 { fill: #777780 } +.terminal-3023361312-r37 { fill: #1f1f2d } +.terminal-3023361312-r38 { fill: #04b375;font-weight: bold } +.terminal-3023361312-r39 { fill: #ff7ec8;font-weight: bold } +.terminal-3023361312-r40 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -POSThttps://postman-echo.com/post                       Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoOptions -GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━━━━ -█ POS echo postAuth type             Authorization headers -▼ jsonplaceholder/Basicwill be generated  -▼ posts/when the request is  -GET get allsent. -GET get one -POS createUsername                                      -DEL delete a postdarren                                      -▼ comments/ -GET get commentsPassword                                      -GET get comments$domain -PUT edit a comme -▼ todos/ -GET get all -GET get one -▼ users/╰─────────────────────────────────────────────────╯ -GET get a user│╭────────────────────────────────────── Response ─╮ -GET get all users││BodyHeadersCookiesTrace -POS create a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -PUT update a user││ -DEL delete a user││ -││ -││ -││ -││ -││ -││ -││ -││ -││ -││ -│───────────────────────││ -Echo server for post ││ -requests.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +POSThttps://postman-echo.com/post                       Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echodersBodyQueryAuthInfoScriptsOption +GET get random user━━━━━━━━━━━━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━━━━━━━━ +█ POS echo postAuth type             Authorization headers +▼ jsonplaceholder/Basicwill be generated  +▼ posts/when the request is  +GET get allsent. +GET get one +POS createUsername                                      +DEL delete a postdarren                                      +▼ comments/ +GET get commentsPassword                                      +GET get comments$domain +PUT edit a comme +▼ todos/ +GET get all +GET get one +▼ users/╰─────────────────────────────────────────────────╯ +GET get a user│╭────────────────────────────────────── Response ─╮ +GET get all users││BodyHeadersCookiesTrace +POS create a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +PUT update a user││ +DEL delete a user││ +││ +││ +││ +││ +││ +││ +││ +││ +││ +││ +│───────────────────────││ +Echo server for post ││ +requests.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__body.svg b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__body.svg index 5ec1ce56..14da0585 100644 --- a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__body.svg +++ b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__body.svg @@ -19,216 +19,216 @@ font-weight: 700; } - .terminal-3359737442-matrix { + .terminal-1133807263-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3359737442-title { + .terminal-1133807263-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3359737442-r1 { fill: #dfdfe1 } -.terminal-3359737442-r2 { fill: #c5c8c6 } -.terminal-3359737442-r3 { fill: #ff93dd } -.terminal-3359737442-r4 { fill: #15111e;text-decoration: underline; } -.terminal-3359737442-r5 { fill: #15111e } -.terminal-3359737442-r6 { fill: #43365c } -.terminal-3359737442-r7 { fill: #ff69b4 } -.terminal-3359737442-r8 { fill: #9393a3 } -.terminal-3359737442-r9 { fill: #a684e8 } -.terminal-3359737442-r10 { fill: #e1e1e6 } -.terminal-3359737442-r11 { fill: #efe3fb } -.terminal-3359737442-r12 { fill: #9f9fa5 } -.terminal-3359737442-r13 { fill: #632e53 } -.terminal-3359737442-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-3359737442-r15 { fill: #0ea5e9 } -.terminal-3359737442-r16 { fill: #6a6a74 } -.terminal-3359737442-r17 { fill: #58d1eb;font-weight: bold } -.terminal-3359737442-r18 { fill: #873c69 } -.terminal-3359737442-r19 { fill: #22c55e } -.terminal-3359737442-r20 { fill: #e0e0e2 } -.terminal-3359737442-r21 { fill: #a2a2a8 } -.terminal-3359737442-r22 { fill: #8b8b93 } -.terminal-3359737442-r23 { fill: #8b8b93;font-weight: bold } -.terminal-3359737442-r24 { fill: #a2a2a8;font-weight: bold } -.terminal-3359737442-r25 { fill: #e8e8e9 } -.terminal-3359737442-r26 { fill: #00b85f } -.terminal-3359737442-r27 { fill: #6f6f78 } -.terminal-3359737442-r28 { fill: #f92672;font-weight: bold } -.terminal-3359737442-r29 { fill: #e6db74 } -.terminal-3359737442-r30 { fill: #ae81ff } -.terminal-3359737442-r31 { fill: #e3e3e8;font-weight: bold } -.terminal-3359737442-r32 { fill: #ef4444 } -.terminal-3359737442-r33 { fill: #87878f } -.terminal-3359737442-r34 { fill: #30303b } -.terminal-3359737442-r35 { fill: #00fa9a;font-weight: bold } -.terminal-3359737442-r36 { fill: #f59e0b } -.terminal-3359737442-r37 { fill: #2e2e3c;font-weight: bold } -.terminal-3359737442-r38 { fill: #2e2e3c } -.terminal-3359737442-r39 { fill: #a0a0a6 } -.terminal-3359737442-r40 { fill: #191928 } -.terminal-3359737442-r41 { fill: #b74e87 } -.terminal-3359737442-r42 { fill: #a3a3a9 } -.terminal-3359737442-r43 { fill: #777780 } -.terminal-3359737442-r44 { fill: #1f1f2d } -.terminal-3359737442-r45 { fill: #04b375;font-weight: bold } -.terminal-3359737442-r46 { fill: #ff7ec8;font-weight: bold } -.terminal-3359737442-r47 { fill: #dbdbdd } + .terminal-1133807263-r1 { fill: #dfdfe1 } +.terminal-1133807263-r2 { fill: #c5c8c6 } +.terminal-1133807263-r3 { fill: #ff93dd } +.terminal-1133807263-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1133807263-r5 { fill: #15111e } +.terminal-1133807263-r6 { fill: #43365c } +.terminal-1133807263-r7 { fill: #ff69b4 } +.terminal-1133807263-r8 { fill: #9393a3 } +.terminal-1133807263-r9 { fill: #a684e8 } +.terminal-1133807263-r10 { fill: #e1e1e6 } +.terminal-1133807263-r11 { fill: #efe3fb } +.terminal-1133807263-r12 { fill: #9f9fa5 } +.terminal-1133807263-r13 { fill: #632e53 } +.terminal-1133807263-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-1133807263-r15 { fill: #0ea5e9 } +.terminal-1133807263-r16 { fill: #6a6a74 } +.terminal-1133807263-r17 { fill: #58d1eb;font-weight: bold } +.terminal-1133807263-r18 { fill: #873c69 } +.terminal-1133807263-r19 { fill: #22c55e } +.terminal-1133807263-r20 { fill: #e0e0e2 } +.terminal-1133807263-r21 { fill: #a2a2a8 } +.terminal-1133807263-r22 { fill: #8b8b93 } +.terminal-1133807263-r23 { fill: #8b8b93;font-weight: bold } +.terminal-1133807263-r24 { fill: #a2a2a8;font-weight: bold } +.terminal-1133807263-r25 { fill: #e8e8e9 } +.terminal-1133807263-r26 { fill: #00b85f } +.terminal-1133807263-r27 { fill: #6f6f78 } +.terminal-1133807263-r28 { fill: #f92672;font-weight: bold } +.terminal-1133807263-r29 { fill: #e6db74 } +.terminal-1133807263-r30 { fill: #ae81ff } +.terminal-1133807263-r31 { fill: #e3e3e8;font-weight: bold } +.terminal-1133807263-r32 { fill: #ef4444 } +.terminal-1133807263-r33 { fill: #87878f } +.terminal-1133807263-r34 { fill: #30303b } +.terminal-1133807263-r35 { fill: #00fa9a;font-weight: bold } +.terminal-1133807263-r36 { fill: #f59e0b } +.terminal-1133807263-r37 { fill: #2e2e3c;font-weight: bold } +.terminal-1133807263-r38 { fill: #2e2e3c } +.terminal-1133807263-r39 { fill: #a0a0a6 } +.terminal-1133807263-r40 { fill: #191928 } +.terminal-1133807263-r41 { fill: #b74e87 } +.terminal-1133807263-r42 { fill: #a3a3a9 } +.terminal-1133807263-r43 { fill: #777780 } +.terminal-1133807263-r44 { fill: #1f1f2d } +.terminal-1133807263-r45 { fill: #04b375;font-weight: bold } +.terminal-1133807263-r46 { fill: #ff7ec8;font-weight: bold } +.terminal-1133807263-r47 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -POSThttps://jsonplaceholder.typicode.com/posts          Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoOptions -GET get random user━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo postRaw (json, text, etc.) -▼ jsonplaceholder/1  { -▼ posts/2  "title""foo",                            -GET get all3  "body""bar",                             -GET get one4  "userId"1 -█ POS create5  } -DEL delete a post -▼ comments/ -GET get comments1:1JSONWrap X -GET get comments╰─────────────────────────────────────────────────╯ -PUT edit a comme│╭────────────────────────────────────── Response ─╮ -▼ todos/││BodyHeadersCookiesTrace -GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get one││ -▼ users/││ -GET get a user││ -GET get all users││ -POS create a user││ -PUT update a user││ -DEL delete a user││ -││ -│───────────────────────││ -Create a new post││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +POSThttps://jsonplaceholder.typicode.com/posts          Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOpt +GET get random user━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo postRaw (json, text, etc.) +▼ jsonplaceholder/1  { +▼ posts/2  "title""foo",                            +GET get all3  "body""bar",                             +GET get one4  "userId"1 +█ POS create5  } +DEL delete a post +▼ comments/ +GET get comments1:1JSONWrap X +GET get comments╰─────────────────────────────────────────────────╯ +PUT edit a comme│╭────────────────────────────────────── Response ─╮ +▼ todos/││BodyHeadersCookiesTrace +GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get one││ +▼ users/││ +GET get a user││ +GET get all users││ +POS create a user││ +PUT update a user││ +DEL delete a user││ +││ +│───────────────────────││ +Create a new post││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__headers.svg b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__headers.svg index 0a7d39c4..29a523d0 100644 --- a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__headers.svg +++ b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__headers.svg @@ -19,206 +19,206 @@ font-weight: 700; } - .terminal-1175968894-matrix { + .terminal-2179915091-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1175968894-title { + .terminal-2179915091-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1175968894-r1 { fill: #dfdfe1 } -.terminal-1175968894-r2 { fill: #c5c8c6 } -.terminal-1175968894-r3 { fill: #ff93dd } -.terminal-1175968894-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1175968894-r5 { fill: #15111e } -.terminal-1175968894-r6 { fill: #43365c } -.terminal-1175968894-r7 { fill: #737387 } -.terminal-1175968894-r8 { fill: #e1e1e6 } -.terminal-1175968894-r9 { fill: #efe3fb } -.terminal-1175968894-r10 { fill: #9f9fa5 } -.terminal-1175968894-r11 { fill: #ff69b4 } -.terminal-1175968894-r12 { fill: #dfdfe1;font-weight: bold } -.terminal-1175968894-r13 { fill: #632e53 } -.terminal-1175968894-r14 { fill: #0ea5e9 } -.terminal-1175968894-r15 { fill: #6a6a74 } -.terminal-1175968894-r16 { fill: #252532 } -.terminal-1175968894-r17 { fill: #22c55e } -.terminal-1175968894-r18 { fill: #252441 } -.terminal-1175968894-r19 { fill: #8b8b93 } -.terminal-1175968894-r20 { fill: #8b8b93;font-weight: bold } -.terminal-1175968894-r21 { fill: #00b85f } -.terminal-1175968894-r22 { fill: #210d17;font-weight: bold } -.terminal-1175968894-r23 { fill: #918d9d } -.terminal-1175968894-r24 { fill: #f59e0b } -.terminal-1175968894-r25 { fill: #ef4444 } -.terminal-1175968894-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-1175968894-r27 { fill: #2e2e3c } -.terminal-1175968894-r28 { fill: #a0a0a6 } -.terminal-1175968894-r29 { fill: #191928 } -.terminal-1175968894-r30 { fill: #b74e87 } -.terminal-1175968894-r31 { fill: #87878f } -.terminal-1175968894-r32 { fill: #a3a3a9 } -.terminal-1175968894-r33 { fill: #777780 } -.terminal-1175968894-r34 { fill: #1f1f2d } -.terminal-1175968894-r35 { fill: #04b375;font-weight: bold } -.terminal-1175968894-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-1175968894-r37 { fill: #dbdbdd } + .terminal-2179915091-r1 { fill: #dfdfe1 } +.terminal-2179915091-r2 { fill: #c5c8c6 } +.terminal-2179915091-r3 { fill: #ff93dd } +.terminal-2179915091-r4 { fill: #15111e;text-decoration: underline; } +.terminal-2179915091-r5 { fill: #15111e } +.terminal-2179915091-r6 { fill: #43365c } +.terminal-2179915091-r7 { fill: #737387 } +.terminal-2179915091-r8 { fill: #e1e1e6 } +.terminal-2179915091-r9 { fill: #efe3fb } +.terminal-2179915091-r10 { fill: #9f9fa5 } +.terminal-2179915091-r11 { fill: #ff69b4 } +.terminal-2179915091-r12 { fill: #dfdfe1;font-weight: bold } +.terminal-2179915091-r13 { fill: #632e53 } +.terminal-2179915091-r14 { fill: #0ea5e9 } +.terminal-2179915091-r15 { fill: #6a6a74 } +.terminal-2179915091-r16 { fill: #252532 } +.terminal-2179915091-r17 { fill: #22c55e } +.terminal-2179915091-r18 { fill: #252441 } +.terminal-2179915091-r19 { fill: #8b8b93 } +.terminal-2179915091-r20 { fill: #8b8b93;font-weight: bold } +.terminal-2179915091-r21 { fill: #00b85f } +.terminal-2179915091-r22 { fill: #210d17;font-weight: bold } +.terminal-2179915091-r23 { fill: #918d9d } +.terminal-2179915091-r24 { fill: #f59e0b } +.terminal-2179915091-r25 { fill: #ef4444 } +.terminal-2179915091-r26 { fill: #2e2e3c;font-weight: bold } +.terminal-2179915091-r27 { fill: #2e2e3c } +.terminal-2179915091-r28 { fill: #a0a0a6 } +.terminal-2179915091-r29 { fill: #191928 } +.terminal-2179915091-r30 { fill: #b74e87 } +.terminal-2179915091-r31 { fill: #87878f } +.terminal-2179915091-r32 { fill: #a3a3a9 } +.terminal-2179915091-r33 { fill: #777780 } +.terminal-2179915091-r34 { fill: #1f1f2d } +.terminal-2179915091-r35 { fill: #04b375;font-weight: bold } +.terminal-2179915091-r36 { fill: #ff7ec8;font-weight: bold } +.terminal-2179915091-r37 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoOptions -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▶ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ todos/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get one╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ users/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get a user╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all usersNameValue Add header  -POS create a user╰─────────────────────────────────────────────────╯ -PUT update a user╭────────────────────────────────────── Response ─╮ -DEL delete a userBodyHeadersCookiesTrace -━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - - - - - - - - -1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▶ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ todos/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get one╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ users/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get a user╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all usersNameValue Add header  +POS create a user╰─────────────────────────────────────────────────╯ +PUT update a user╭────────────────────────────────────── Response ─╮ +DEL delete a userBodyHeadersCookiesTrace +━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + + + + + + + + +1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump diff --git a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__options.svg b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__options.svg index 3167a4eb..604cb43d 100644 --- a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__options.svg +++ b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__options.svg @@ -19,248 +19,248 @@ font-weight: 700; } - .terminal-1881705878-matrix { + .terminal-297766357-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1881705878-title { + .terminal-297766357-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1881705878-r1 { fill: #dfdfe1 } -.terminal-1881705878-r2 { fill: #c5c8c6 } -.terminal-1881705878-r3 { fill: #ff93dd } -.terminal-1881705878-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1881705878-r5 { fill: #15111e } -.terminal-1881705878-r6 { fill: #43365c } -.terminal-1881705878-r7 { fill: #ff69b4 } -.terminal-1881705878-r8 { fill: #9393a3 } -.terminal-1881705878-r9 { fill: #a684e8 } -.terminal-1881705878-r10 { fill: #e1e1e6 } -.terminal-1881705878-r11 { fill: #efe3fb } -.terminal-1881705878-r12 { fill: #9f9fa5 } -.terminal-1881705878-r13 { fill: #632e53 } -.terminal-1881705878-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-1881705878-r15 { fill: #0ea5e9 } -.terminal-1881705878-r16 { fill: #6a6a74 } -.terminal-1881705878-r17 { fill: #58d1eb;font-weight: bold } -.terminal-1881705878-r18 { fill: #873c69 } -.terminal-1881705878-r19 { fill: #e3e3e8;font-weight: bold } -.terminal-1881705878-r20 { fill: #30303b } -.terminal-1881705878-r21 { fill: #00fa9a;font-weight: bold } -.terminal-1881705878-r22 { fill: #8b8b93 } -.terminal-1881705878-r23 { fill: #8b8b93;font-weight: bold } -.terminal-1881705878-r24 { fill: #00b85f } -.terminal-1881705878-r25 { fill: #22c55e } -.terminal-1881705878-r26 { fill: #ef4444 } -.terminal-1881705878-r27 { fill: #f59e0b } -.terminal-1881705878-r28 { fill: #2e2e3c;font-weight: bold } -.terminal-1881705878-r29 { fill: #2e2e3c } -.terminal-1881705878-r30 { fill: #a0a0a6 } -.terminal-1881705878-r31 { fill: #191928 } -.terminal-1881705878-r32 { fill: #b74e87 } -.terminal-1881705878-r33 { fill: #87878f } -.terminal-1881705878-r34 { fill: #a3a3a9 } -.terminal-1881705878-r35 { fill: #777780 } -.terminal-1881705878-r36 { fill: #1f1f2d } -.terminal-1881705878-r37 { fill: #04b375;font-weight: bold } -.terminal-1881705878-r38 { fill: #ff7ec8;font-weight: bold } -.terminal-1881705878-r39 { fill: #dbdbdd } + .terminal-297766357-r1 { fill: #dfdfe1 } +.terminal-297766357-r2 { fill: #c5c8c6 } +.terminal-297766357-r3 { fill: #ff93dd } +.terminal-297766357-r4 { fill: #15111e;text-decoration: underline; } +.terminal-297766357-r5 { fill: #15111e } +.terminal-297766357-r6 { fill: #43365c } +.terminal-297766357-r7 { fill: #ff69b4 } +.terminal-297766357-r8 { fill: #9393a3 } +.terminal-297766357-r9 { fill: #a684e8 } +.terminal-297766357-r10 { fill: #e1e1e6 } +.terminal-297766357-r11 { fill: #efe3fb } +.terminal-297766357-r12 { fill: #9f9fa5 } +.terminal-297766357-r13 { fill: #632e53 } +.terminal-297766357-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-297766357-r15 { fill: #0ea5e9 } +.terminal-297766357-r16 { fill: #6a6a74 } +.terminal-297766357-r17 { fill: #58d1eb;font-weight: bold } +.terminal-297766357-r18 { fill: #873c69 } +.terminal-297766357-r19 { fill: #e3e3e8;font-weight: bold } +.terminal-297766357-r20 { fill: #30303b } +.terminal-297766357-r21 { fill: #00fa9a;font-weight: bold } +.terminal-297766357-r22 { fill: #8b8b93 } +.terminal-297766357-r23 { fill: #8b8b93;font-weight: bold } +.terminal-297766357-r24 { fill: #00b85f } +.terminal-297766357-r25 { fill: #22c55e } +.terminal-297766357-r26 { fill: #ef4444 } +.terminal-297766357-r27 { fill: #f59e0b } +.terminal-297766357-r28 { fill: #2e2e3c;font-weight: bold } +.terminal-297766357-r29 { fill: #2e2e3c } +.terminal-297766357-r30 { fill: #a0a0a6 } +.terminal-297766357-r31 { fill: #191928 } +.terminal-297766357-r32 { fill: #b74e87 } +.terminal-297766357-r33 { fill: #87878f } +.terminal-297766357-r34 { fill: #a3a3a9 } +.terminal-297766357-r35 { fill: #777780 } +.terminal-297766357-r36 { fill: #1f1f2d } +.terminal-297766357-r37 { fill: #04b375;font-weight: bold } +.terminal-297766357-r38 { fill: #ff7ec8;font-weight: bold } +.terminal-297766357-r39 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -POSThttps://postman-echo.com/post                       Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoOptions -GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━╺━━━ -█ POS echo postX Follow redirects -▼ jsonplaceholder/ -▼ posts/X Verify SSL certificates -GET get all -GET get oneX Attach cookies -POS create -DEL delete a postProxy URL                                      -▼ comments/ -GET get comments -GET get commentsTimeout                                        -PUT edit a comme0.2                                      -▼ todos/ -GET get all -GET get one -▼ users/╰─────────────────────────────────────────────────╯ -GET get a user│╭────────────────────────────────────── Response ─╮ -GET get all users││BodyHeadersCookiesTrace -POS create a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -PUT update a user││ -DEL delete a user││ -││ -││ -││ -││ -││ -││ -││ -││ -││ -││ -│───────────────────────││ -Echo server for post ││ -requests.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +POSThttps://postman-echo.com/post                       Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echorsBodyQueryAuthInfoScriptsOptions +GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━ +█ POS echo postX Follow redirects +▼ jsonplaceholder/ +▼ posts/X Verify SSL certificates +GET get all +GET get oneX Attach cookies +POS create +DEL delete a postProxy URL                                      +▼ comments/ +GET get comments +GET get commentsTimeout                                        +PUT edit a comme0.2                                      +▼ todos/ +GET get all +GET get one +▼ users/╰─────────────────────────────────────────────────╯ +GET get a user│╭────────────────────────────────────── Response ─╮ +GET get all users││BodyHeadersCookiesTrace +POS create a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +PUT update a user││ +DEL delete a user││ +││ +││ +││ +││ +││ +││ +││ +││ +││ +││ +│───────────────────────││ +Echo server for post ││ +requests.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__query_params.svg b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__query_params.svg index c0b60e8c..ff1f9c30 100644 --- a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__query_params.svg +++ b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__query_params.svg @@ -19,214 +19,214 @@ font-weight: 700; } - .terminal-42944799-matrix { + .terminal-1118652764-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-42944799-title { + .terminal-1118652764-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-42944799-r1 { fill: #dfdfe1 } -.terminal-42944799-r2 { fill: #c5c8c6 } -.terminal-42944799-r3 { fill: #ff93dd } -.terminal-42944799-r4 { fill: #15111e;text-decoration: underline; } -.terminal-42944799-r5 { fill: #15111e } -.terminal-42944799-r6 { fill: #43365c } -.terminal-42944799-r7 { fill: #ff69b4 } -.terminal-42944799-r8 { fill: #9393a3 } -.terminal-42944799-r9 { fill: #a684e8 } -.terminal-42944799-r10 { fill: #e1e1e6 } -.terminal-42944799-r11 { fill: #efe3fb } -.terminal-42944799-r12 { fill: #9f9fa5 } -.terminal-42944799-r13 { fill: #632e53 } -.terminal-42944799-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-42944799-r15 { fill: #0ea5e9 } -.terminal-42944799-r16 { fill: #6a6a74 } -.terminal-42944799-r17 { fill: #58d1eb;font-weight: bold } -.terminal-42944799-r18 { fill: #873c69 } -.terminal-42944799-r19 { fill: #22c55e } -.terminal-42944799-r20 { fill: #0f0f1f } -.terminal-42944799-r21 { fill: #ede2f7 } -.terminal-42944799-r22 { fill: #e1e0e4 } -.terminal-42944799-r23 { fill: #e2e0e5 } -.terminal-42944799-r24 { fill: #8b8b93 } -.terminal-42944799-r25 { fill: #8b8b93;font-weight: bold } -.terminal-42944799-r26 { fill: #e9e1f1 } -.terminal-42944799-r27 { fill: #00b85f } -.terminal-42944799-r28 { fill: #ef4444 } -.terminal-42944799-r29 { fill: #737387 } -.terminal-42944799-r30 { fill: #918d9d } -.terminal-42944799-r31 { fill: #e3e3e8;font-weight: bold } -.terminal-42944799-r32 { fill: #f59e0b } -.terminal-42944799-r33 { fill: #2e2e3c;font-weight: bold } -.terminal-42944799-r34 { fill: #2e2e3c } -.terminal-42944799-r35 { fill: #a0a0a6 } -.terminal-42944799-r36 { fill: #191928 } -.terminal-42944799-r37 { fill: #b74e87 } -.terminal-42944799-r38 { fill: #0d0e2e } -.terminal-42944799-r39 { fill: #87878f } -.terminal-42944799-r40 { fill: #a3a3a9 } -.terminal-42944799-r41 { fill: #777780 } -.terminal-42944799-r42 { fill: #1f1f2d } -.terminal-42944799-r43 { fill: #04b375;font-weight: bold } -.terminal-42944799-r44 { fill: #ff7ec8;font-weight: bold } -.terminal-42944799-r45 { fill: #dbdbdd } + .terminal-1118652764-r1 { fill: #dfdfe1 } +.terminal-1118652764-r2 { fill: #c5c8c6 } +.terminal-1118652764-r3 { fill: #ff93dd } +.terminal-1118652764-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1118652764-r5 { fill: #15111e } +.terminal-1118652764-r6 { fill: #43365c } +.terminal-1118652764-r7 { fill: #ff69b4 } +.terminal-1118652764-r8 { fill: #9393a3 } +.terminal-1118652764-r9 { fill: #a684e8 } +.terminal-1118652764-r10 { fill: #e1e1e6 } +.terminal-1118652764-r11 { fill: #efe3fb } +.terminal-1118652764-r12 { fill: #9f9fa5 } +.terminal-1118652764-r13 { fill: #632e53 } +.terminal-1118652764-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-1118652764-r15 { fill: #0ea5e9 } +.terminal-1118652764-r16 { fill: #6a6a74 } +.terminal-1118652764-r17 { fill: #58d1eb;font-weight: bold } +.terminal-1118652764-r18 { fill: #873c69 } +.terminal-1118652764-r19 { fill: #22c55e } +.terminal-1118652764-r20 { fill: #0f0f1f } +.terminal-1118652764-r21 { fill: #ede2f7 } +.terminal-1118652764-r22 { fill: #e1e0e4 } +.terminal-1118652764-r23 { fill: #e2e0e5 } +.terminal-1118652764-r24 { fill: #8b8b93 } +.terminal-1118652764-r25 { fill: #8b8b93;font-weight: bold } +.terminal-1118652764-r26 { fill: #e9e1f1 } +.terminal-1118652764-r27 { fill: #00b85f } +.terminal-1118652764-r28 { fill: #ef4444 } +.terminal-1118652764-r29 { fill: #737387 } +.terminal-1118652764-r30 { fill: #918d9d } +.terminal-1118652764-r31 { fill: #e3e3e8;font-weight: bold } +.terminal-1118652764-r32 { fill: #f59e0b } +.terminal-1118652764-r33 { fill: #2e2e3c;font-weight: bold } +.terminal-1118652764-r34 { fill: #2e2e3c } +.terminal-1118652764-r35 { fill: #a0a0a6 } +.terminal-1118652764-r36 { fill: #191928 } +.terminal-1118652764-r37 { fill: #b74e87 } +.terminal-1118652764-r38 { fill: #0d0e2e } +.terminal-1118652764-r39 { fill: #87878f } +.terminal-1118652764-r40 { fill: #a3a3a9 } +.terminal-1118652764-r41 { fill: #777780 } +.terminal-1118652764-r42 { fill: #1f1f2d } +.terminal-1118652764-r43 { fill: #04b375;font-weight: bold } +.terminal-1118652764-r44 { fill: #ff7ec8;font-weight: bold } +.terminal-1118652764-r45 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttps://jsonplaceholder.typicode.com/comments       Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoOptions -GET get random user━━━━━━━━━━━━━━━━╸━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post postId                            1       -▼ jsonplaceholder/ foo                               bar     -▼ posts/ beep                              boop    -GET get all onetwothree                       123     -GET get one areallyreallyreallyreallylongkey  avalue  -POS create -DEL delete a post -▼ comments/ -GET get commentKeyValue Add   -█ GET get commen╰─────────────────────────────────────────────────╯ -PUT edit a comm│╭────────────────────────────────────── Response ─╮ -▼ todos/││BodyHeadersCookiesTrace -GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get one││ -▼ users/││ -GET get a user││ -GET get all users││ -POS create a user││ -PUT update a user││ -│───────────────────────││ -Retrieve the comments││ -for a post using the ││ -query string││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttps://jsonplaceholder.typicode.com/comments       Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOpt +GET get random user━━━━━━━━━━━━━━━━╸━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post postId                            1       +▼ jsonplaceholder/ foo                               bar     +▼ posts/ beep                              boop    +GET get all onetwothree                       123     +GET get one areallyreallyreallyreallylongkey  avalue  +POS create +DEL delete a post +▼ comments/ +GET get commentKeyValue Add   +█ GET get commen╰─────────────────────────────────────────────────╯ +PUT edit a comm│╭────────────────────────────────────── Response ─╮ +▼ todos/││BodyHeadersCookiesTrace +GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get one││ +▼ users/││ +GET get a user││ +GET get all users││ +POS create a user││ +PUT update a user││ +│───────────────────────││ +Retrieve the comments││ +for a post using the ││ +query string││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestMethodSelection.test_select_post_method.svg b/tests/__snapshots__/test_snapshots/TestMethodSelection.test_select_post_method.svg index 7215f1b6..148321f4 100644 --- a/tests/__snapshots__/test_snapshots/TestMethodSelection.test_select_post_method.svg +++ b/tests/__snapshots__/test_snapshots/TestMethodSelection.test_select_post_method.svg @@ -19,166 +19,166 @@ font-weight: 700; } - .terminal-4259725610-matrix { + .terminal-672678399-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4259725610-title { + .terminal-672678399-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4259725610-r1 { fill: #dfdfe1 } -.terminal-4259725610-r2 { fill: #c5c8c6 } -.terminal-4259725610-r3 { fill: #ff93dd } -.terminal-4259725610-r4 { fill: #21101a;text-decoration: underline; } -.terminal-4259725610-r5 { fill: #21101a } -.terminal-4259725610-r6 { fill: #663250 } -.terminal-4259725610-r7 { fill: #737387 } -.terminal-4259725610-r8 { fill: #e1e1e6 } -.terminal-4259725610-r9 { fill: #efe3fb } -.terminal-4259725610-r10 { fill: #9f9fa5 } -.terminal-4259725610-r11 { fill: #632e53 } -.terminal-4259725610-r12 { fill: #e3e3e8;font-weight: bold } -.terminal-4259725610-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-4259725610-r14 { fill: #6a6a74 } -.terminal-4259725610-r15 { fill: #0ea5e9 } -.terminal-4259725610-r16 { fill: #252532 } -.terminal-4259725610-r17 { fill: #ff69b4 } -.terminal-4259725610-r18 { fill: #22c55e } -.terminal-4259725610-r19 { fill: #252441 } -.terminal-4259725610-r20 { fill: #8b8b93 } -.terminal-4259725610-r21 { fill: #8b8b93;font-weight: bold } -.terminal-4259725610-r22 { fill: #0d0e2e } -.terminal-4259725610-r23 { fill: #00b85f } -.terminal-4259725610-r24 { fill: #918d9d } -.terminal-4259725610-r25 { fill: #ef4444 } -.terminal-4259725610-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-4259725610-r27 { fill: #2e2e3c } -.terminal-4259725610-r28 { fill: #a0a0a6 } -.terminal-4259725610-r29 { fill: #191928 } -.terminal-4259725610-r30 { fill: #b74e87 } -.terminal-4259725610-r31 { fill: #87878f } -.terminal-4259725610-r32 { fill: #a3a3a9 } -.terminal-4259725610-r33 { fill: #777780 } -.terminal-4259725610-r34 { fill: #1f1f2d } -.terminal-4259725610-r35 { fill: #04b375;font-weight: bold } -.terminal-4259725610-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-4259725610-r37 { fill: #dbdbdd } + .terminal-672678399-r1 { fill: #dfdfe1 } +.terminal-672678399-r2 { fill: #c5c8c6 } +.terminal-672678399-r3 { fill: #ff93dd } +.terminal-672678399-r4 { fill: #21101a;text-decoration: underline; } +.terminal-672678399-r5 { fill: #21101a } +.terminal-672678399-r6 { fill: #663250 } +.terminal-672678399-r7 { fill: #737387 } +.terminal-672678399-r8 { fill: #e1e1e6 } +.terminal-672678399-r9 { fill: #efe3fb } +.terminal-672678399-r10 { fill: #9f9fa5 } +.terminal-672678399-r11 { fill: #632e53 } +.terminal-672678399-r12 { fill: #e3e3e8;font-weight: bold } +.terminal-672678399-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-672678399-r14 { fill: #6a6a74 } +.terminal-672678399-r15 { fill: #0ea5e9 } +.terminal-672678399-r16 { fill: #252532 } +.terminal-672678399-r17 { fill: #ff69b4 } +.terminal-672678399-r18 { fill: #22c55e } +.terminal-672678399-r19 { fill: #252441 } +.terminal-672678399-r20 { fill: #8b8b93 } +.terminal-672678399-r21 { fill: #8b8b93;font-weight: bold } +.terminal-672678399-r22 { fill: #0d0e2e } +.terminal-672678399-r23 { fill: #00b85f } +.terminal-672678399-r24 { fill: #918d9d } +.terminal-672678399-r25 { fill: #ef4444 } +.terminal-672678399-r26 { fill: #2e2e3c;font-weight: bold } +.terminal-672678399-r27 { fill: #2e2e3c } +.terminal-672678399-r28 { fill: #a0a0a6 } +.terminal-672678399-r29 { fill: #191928 } +.terminal-672678399-r30 { fill: #b74e87 } +.terminal-672678399-r31 { fill: #87878f } +.terminal-672678399-r32 { fill: #a3a3a9 } +.terminal-672678399-r33 { fill: #777780 } +.terminal-672678399-r34 { fill: #1f1f2d } +.terminal-672678399-r35 { fill: #04b375;font-weight: bold } +.terminal-672678399-r36 { fill: #ff7ec8;font-weight: bold } +.terminal-672678399-r37 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -POSTEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoOptions -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +POSTEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echo││HeadersBodyQueryAuthInfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestNewRequest.test_dialog_loads_and_can_be_used.svg b/tests/__snapshots__/test_snapshots/TestNewRequest.test_dialog_loads_and_can_be_used.svg index f15bd068..81641988 100644 --- a/tests/__snapshots__/test_snapshots/TestNewRequest.test_dialog_loads_and_can_be_used.svg +++ b/tests/__snapshots__/test_snapshots/TestNewRequest.test_dialog_loads_and_can_be_used.svg @@ -19,174 +19,174 @@ font-weight: 700; } - .terminal-1072590351-matrix { + .terminal-1363701403-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1072590351-title { + .terminal-1363701403-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1072590351-r1 { fill: #9c9c9d } -.terminal-1072590351-r2 { fill: #c5c8c6 } -.terminal-1072590351-r3 { fill: #dfdfe0 } -.terminal-1072590351-r4 { fill: #b2669a } -.terminal-1072590351-r5 { fill: #0e0b15;text-decoration: underline; } -.terminal-1072590351-r6 { fill: #0e0b15 } -.terminal-1072590351-r7 { fill: #2e2540 } -.terminal-1072590351-r8 { fill: #50505e } -.terminal-1072590351-r9 { fill: #2e2e3f } -.terminal-1072590351-r10 { fill: #dfdfe1;font-weight: bold } -.terminal-1072590351-r11 { fill: #9d9da1 } -.terminal-1072590351-r12 { fill: #a79eaf } -.terminal-1072590351-r13 { fill: #6f6f73 } -.terminal-1072590351-r14 { fill: #0f0f1f } -.terminal-1072590351-r15 { fill: #45203a } -.terminal-1072590351-r16 { fill: #dfdfe1 } -.terminal-1072590351-r17 { fill: #0973a3 } -.terminal-1072590351-r18 { fill: #e1e1e6 } -.terminal-1072590351-r19 { fill: #4a4a51 } -.terminal-1072590351-r20 { fill: #191923 } -.terminal-1072590351-r21 { fill: #178941 } -.terminal-1072590351-r22 { fill: #8b8b93 } -.terminal-1072590351-r23 { fill: #19192d } -.terminal-1072590351-r24 { fill: #616166 } -.terminal-1072590351-r25 { fill: #616166;font-weight: bold } -.terminal-1072590351-r26 { fill: #a5a5b2 } -.terminal-1072590351-r27 { fill: #008042 } -.terminal-1072590351-r28 { fill: #9e9ea2;font-weight: bold } -.terminal-1072590351-r29 { fill: #65626d } -.terminal-1072590351-r30 { fill: #403e62 } -.terminal-1072590351-r31 { fill: #e3e3e8 } -.terminal-1072590351-r32 { fill: #e5e4e9 } -.terminal-1072590351-r33 { fill: #210d17 } -.terminal-1072590351-r34 { fill: #a72f2f } -.terminal-1072590351-r35 { fill: #0d0e2e } -.terminal-1072590351-r36 { fill: #707074 } -.terminal-1072590351-r37 { fill: #11111c } -.terminal-1072590351-r38 { fill: #ab6e07 } -.terminal-1072590351-r39 { fill: #5e5e64 } -.terminal-1072590351-r40 { fill: #727276 } -.terminal-1072590351-r41 { fill: #535359 } -.terminal-1072590351-r42 { fill: #15151f } -.terminal-1072590351-r43 { fill: #027d51;font-weight: bold } -.terminal-1072590351-r44 { fill: #ff7ec8;font-weight: bold } -.terminal-1072590351-r45 { fill: #dadadb } + .terminal-1363701403-r1 { fill: #9c9c9d } +.terminal-1363701403-r2 { fill: #c5c8c6 } +.terminal-1363701403-r3 { fill: #dfdfe0 } +.terminal-1363701403-r4 { fill: #b2669a } +.terminal-1363701403-r5 { fill: #0e0b15;text-decoration: underline; } +.terminal-1363701403-r6 { fill: #0e0b15 } +.terminal-1363701403-r7 { fill: #2e2540 } +.terminal-1363701403-r8 { fill: #50505e } +.terminal-1363701403-r9 { fill: #2e2e3f } +.terminal-1363701403-r10 { fill: #dfdfe1;font-weight: bold } +.terminal-1363701403-r11 { fill: #9d9da1 } +.terminal-1363701403-r12 { fill: #a79eaf } +.terminal-1363701403-r13 { fill: #6f6f73 } +.terminal-1363701403-r14 { fill: #0f0f1f } +.terminal-1363701403-r15 { fill: #45203a } +.terminal-1363701403-r16 { fill: #dfdfe1 } +.terminal-1363701403-r17 { fill: #0973a3 } +.terminal-1363701403-r18 { fill: #e1e1e6 } +.terminal-1363701403-r19 { fill: #4a4a51 } +.terminal-1363701403-r20 { fill: #191923 } +.terminal-1363701403-r21 { fill: #178941 } +.terminal-1363701403-r22 { fill: #8b8b93 } +.terminal-1363701403-r23 { fill: #19192d } +.terminal-1363701403-r24 { fill: #616166 } +.terminal-1363701403-r25 { fill: #616166;font-weight: bold } +.terminal-1363701403-r26 { fill: #a5a5b2 } +.terminal-1363701403-r27 { fill: #008042 } +.terminal-1363701403-r28 { fill: #9e9ea2;font-weight: bold } +.terminal-1363701403-r29 { fill: #65626d } +.terminal-1363701403-r30 { fill: #403e62 } +.terminal-1363701403-r31 { fill: #e3e3e8 } +.terminal-1363701403-r32 { fill: #e5e4e9 } +.terminal-1363701403-r33 { fill: #210d17 } +.terminal-1363701403-r34 { fill: #a72f2f } +.terminal-1363701403-r35 { fill: #0d0e2e } +.terminal-1363701403-r36 { fill: #707074 } +.terminal-1363701403-r37 { fill: #11111c } +.terminal-1363701403-r38 { fill: #ab6e07 } +.terminal-1363701403-r39 { fill: #5e5e64 } +.terminal-1363701403-r40 { fill: #727276 } +.terminal-1363701403-r41 { fill: #535359 } +.terminal-1363701403-r42 { fill: #15151f } +.terminal-1363701403-r43 { fill: #027d51;font-weight: bold } +.terminal-1363701403-r44 { fill: #ff7ec8;font-weight: bold } +.terminal-1363701403-r45 { fill: #dadadb } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter▁▁ New request ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ Send  - -╭─ Collection ────Title                            ─────── Request ─╮ -GET echo        foo                            oOptions -GET get random u━━━━━━━━━━━━━━━━━ -POS echo post   File name optional╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholderfoo               .posting.yamlrs.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all Description optional Add header  -GET get one bar─────────────────╯ -POS create  ────── Response ─╮ -DEL delete aDirectory                         -▼ comments/jsonplaceholder/posts          ━━━━━━━━━━━━━━━━━ -GET get co -GET get co▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ -PUT edit a comm││ -▼ todos/││ -GET get all      ││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - f3 Pager  f4 Editor  esc Cancel  ^n Create  + + + + +Posting                                                                    + +GETEnter▁▁ New request ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ Send  + +╭─ Collection ────Title                            ─────── Request ─╮ +GET echo        foo                            oScriptsOptio +GET get random u━━━━━━━━━━━━━━━━━ +POS echo post   File name optional╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholderfoo               .posting.yamlrs.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all Description optional Add header  +GET get one bar─────────────────╯ +POS create  ────── Response ─╮ +DEL delete aDirectory                         +▼ comments/jsonplaceholder/posts          ━━━━━━━━━━━━━━━━━ +GET get co +GET get co▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +PUT edit a comm││ +▼ todos/││ +GET get all      ││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + f3 Pager  f4 Editor  esc Cancel  ^n Create  diff --git a/tests/__snapshots__/test_snapshots/TestNewRequest.test_new_request_added_to_tree_correctly_and_notification_shown.svg b/tests/__snapshots__/test_snapshots/TestNewRequest.test_new_request_added_to_tree_correctly_and_notification_shown.svg index 3d96fdf0..495a1f50 100644 --- a/tests/__snapshots__/test_snapshots/TestNewRequest.test_new_request_added_to_tree_correctly_and_notification_shown.svg +++ b/tests/__snapshots__/test_snapshots/TestNewRequest.test_new_request_added_to_tree_correctly_and_notification_shown.svg @@ -19,164 +19,164 @@ font-weight: 700; } - .terminal-2982644878-matrix { + .terminal-1214287203-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2982644878-title { + .terminal-1214287203-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2982644878-r1 { fill: #dfdfe1 } -.terminal-2982644878-r2 { fill: #c5c8c6 } -.terminal-2982644878-r3 { fill: #ff93dd } -.terminal-2982644878-r4 { fill: #15111e;text-decoration: underline; } -.terminal-2982644878-r5 { fill: #15111e } -.terminal-2982644878-r6 { fill: #43365c } -.terminal-2982644878-r7 { fill: #737387 } -.terminal-2982644878-r8 { fill: #e1e1e6 } -.terminal-2982644878-r9 { fill: #efe3fb } -.terminal-2982644878-r10 { fill: #9f9fa5 } -.terminal-2982644878-r11 { fill: #ff69b4 } -.terminal-2982644878-r12 { fill: #dfdfe1;font-weight: bold } -.terminal-2982644878-r13 { fill: #632e53 } -.terminal-2982644878-r14 { fill: #0ea5e9 } -.terminal-2982644878-r15 { fill: #6a6a74 } -.terminal-2982644878-r16 { fill: #252532 } -.terminal-2982644878-r17 { fill: #22c55e } -.terminal-2982644878-r18 { fill: #252441 } -.terminal-2982644878-r19 { fill: #8b8b93 } -.terminal-2982644878-r20 { fill: #8b8b93;font-weight: bold } -.terminal-2982644878-r21 { fill: #00b85f } -.terminal-2982644878-r22 { fill: #210d17;font-weight: bold } -.terminal-2982644878-r23 { fill: #918d9d } -.terminal-2982644878-r24 { fill: #0d0e2e } -.terminal-2982644878-r25 { fill: #2e2e3c;font-weight: bold } -.terminal-2982644878-r26 { fill: #2e2e3c } -.terminal-2982644878-r27 { fill: #a0a0a6 } -.terminal-2982644878-r28 { fill: #ef4444 } -.terminal-2982644878-r29 { fill: #191928 } -.terminal-2982644878-r30 { fill: #b74e87 } -.terminal-2982644878-r31 { fill: #0cfa9f } -.terminal-2982644878-r32 { fill: #0ce48c;font-weight: bold } -.terminal-2982644878-r33 { fill: #e3e3e6 } -.terminal-2982644878-r34 { fill: #ff7ec8;font-weight: bold } -.terminal-2982644878-r35 { fill: #dbdbdd } + .terminal-1214287203-r1 { fill: #dfdfe1 } +.terminal-1214287203-r2 { fill: #c5c8c6 } +.terminal-1214287203-r3 { fill: #ff93dd } +.terminal-1214287203-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1214287203-r5 { fill: #15111e } +.terminal-1214287203-r6 { fill: #43365c } +.terminal-1214287203-r7 { fill: #737387 } +.terminal-1214287203-r8 { fill: #e1e1e6 } +.terminal-1214287203-r9 { fill: #efe3fb } +.terminal-1214287203-r10 { fill: #9f9fa5 } +.terminal-1214287203-r11 { fill: #ff69b4 } +.terminal-1214287203-r12 { fill: #dfdfe1;font-weight: bold } +.terminal-1214287203-r13 { fill: #632e53 } +.terminal-1214287203-r14 { fill: #0ea5e9 } +.terminal-1214287203-r15 { fill: #6a6a74 } +.terminal-1214287203-r16 { fill: #252532 } +.terminal-1214287203-r17 { fill: #22c55e } +.terminal-1214287203-r18 { fill: #252441 } +.terminal-1214287203-r19 { fill: #8b8b93 } +.terminal-1214287203-r20 { fill: #8b8b93;font-weight: bold } +.terminal-1214287203-r21 { fill: #00b85f } +.terminal-1214287203-r22 { fill: #210d17;font-weight: bold } +.terminal-1214287203-r23 { fill: #918d9d } +.terminal-1214287203-r24 { fill: #0d0e2e } +.terminal-1214287203-r25 { fill: #2e2e3c;font-weight: bold } +.terminal-1214287203-r26 { fill: #2e2e3c } +.terminal-1214287203-r27 { fill: #a0a0a6 } +.terminal-1214287203-r28 { fill: #ef4444 } +.terminal-1214287203-r29 { fill: #191928 } +.terminal-1214287203-r30 { fill: #b74e87 } +.terminal-1214287203-r31 { fill: #0cfa9f } +.terminal-1214287203-r32 { fill: #0ce48c;font-weight: bold } +.terminal-1214287203-r33 { fill: #e3e3e6 } +.terminal-1214287203-r34 { fill: #ff7ec8;font-weight: bold } +.terminal-1214287203-r35 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoOptions -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -█ GET fooNameValue Add header  -GET get all╰─────────────────────────────────────────────────╯ -GET get one╭────────────────────────────────────── Response ─╮ -POS createBodyHeadersCookiesTrace -DEL delete a post━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -▼ comments/ -GET get comment -GET get comment -───────────────────────Request saved -barjsonplaceholder/posts/foo.posting.ya -╰── sample-collections ─╯╰───────────ml - d Dupe  ⌫ Delete  ^j Send  ^t Method + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +█ GET fooNameValue Add header  +GET get all╰─────────────────────────────────────────────────╯ +GET get one╭────────────────────────────────────── Response ─╮ +POS createBodyHeadersCookiesTrace +DEL delete a post━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +▼ comments/ +GET get comment +GET get comment +───────────────────────Request saved +barjsonplaceholder/posts/foo.posting.ya +╰── sample-collections ─╯╰───────────ml + d Dupe  ⌫ Delete  ^j Send  ^t Method diff --git a/tests/__snapshots__/test_snapshots/TestSave.test_no_request_selected__dialog_is_prefilled_correctly.svg b/tests/__snapshots__/test_snapshots/TestSave.test_no_request_selected__dialog_is_prefilled_correctly.svg index 4b674262..567b1cd6 100644 --- a/tests/__snapshots__/test_snapshots/TestSave.test_no_request_selected__dialog_is_prefilled_correctly.svg +++ b/tests/__snapshots__/test_snapshots/TestSave.test_no_request_selected__dialog_is_prefilled_correctly.svg @@ -19,176 +19,174 @@ font-weight: 700; } - .terminal-3934714337-matrix { + .terminal-2261479457-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3934714337-title { + .terminal-2261479457-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3934714337-r1 { fill: #9c9c9d } -.terminal-3934714337-r2 { fill: #c5c8c6 } -.terminal-3934714337-r3 { fill: #dfdfe0 } -.terminal-3934714337-r4 { fill: #b2669a } -.terminal-3934714337-r5 { fill: #0e0b15;text-decoration: underline; } -.terminal-3934714337-r6 { fill: #0e0b15 } -.terminal-3934714337-r7 { fill: #2e2540 } -.terminal-3934714337-r8 { fill: #50505e } -.terminal-3934714337-r9 { fill: #2e2e3f } -.terminal-3934714337-r10 { fill: #dfdfe1;font-weight: bold } -.terminal-3934714337-r11 { fill: #9d9da1 } -.terminal-3934714337-r12 { fill: #a79eaf } -.terminal-3934714337-r13 { fill: #6f6f73 } -.terminal-3934714337-r14 { fill: #0f0f1f } -.terminal-3934714337-r15 { fill: #45203a } -.terminal-3934714337-r16 { fill: #dfdfe1 } -.terminal-3934714337-r17 { fill: #0973a3 } -.terminal-3934714337-r18 { fill: #403e62 } -.terminal-3934714337-r19 { fill: #e3e3e8 } -.terminal-3934714337-r20 { fill: #210d17 } -.terminal-3934714337-r21 { fill: #9c9c9d;font-weight: bold } -.terminal-3934714337-r22 { fill: #4a4a51 } -.terminal-3934714337-r23 { fill: #b2497e } -.terminal-3934714337-r24 { fill: #191923 } -.terminal-3934714337-r25 { fill: #178941 } -.terminal-3934714337-r26 { fill: #8b8b93 } -.terminal-3934714337-r27 { fill: #616166 } -.terminal-3934714337-r28 { fill: #616166;font-weight: bold } -.terminal-3934714337-r29 { fill: #e1e1e6 } -.terminal-3934714337-r30 { fill: #a5a5b2 } -.terminal-3934714337-r31 { fill: #3b1c3c } -.terminal-3934714337-r32 { fill: #008042 } -.terminal-3934714337-r33 { fill: #9e9ea1 } -.terminal-3934714337-r34 { fill: #9e9ea2;font-weight: bold } -.terminal-3934714337-r35 { fill: #e2e2e6 } -.terminal-3934714337-r36 { fill: #a72f2f } -.terminal-3934714337-r37 { fill: #0d0e2e } -.terminal-3934714337-r38 { fill: #707074 } -.terminal-3934714337-r39 { fill: #11111c } -.terminal-3934714337-r40 { fill: #ab6e07 } -.terminal-3934714337-r41 { fill: #5e5e64 } -.terminal-3934714337-r42 { fill: #727276 } -.terminal-3934714337-r43 { fill: #535359 } -.terminal-3934714337-r44 { fill: #15151f } -.terminal-3934714337-r45 { fill: #027d51;font-weight: bold } -.terminal-3934714337-r46 { fill: #ff7ec8;font-weight: bold } -.terminal-3934714337-r47 { fill: #dadadb } + .terminal-2261479457-r1 { fill: #9c9c9d } +.terminal-2261479457-r2 { fill: #c5c8c6 } +.terminal-2261479457-r3 { fill: #dfdfe0 } +.terminal-2261479457-r4 { fill: #b2669a } +.terminal-2261479457-r5 { fill: #0e0b15;text-decoration: underline; } +.terminal-2261479457-r6 { fill: #0e0b15 } +.terminal-2261479457-r7 { fill: #2e2540 } +.terminal-2261479457-r8 { fill: #50505e } +.terminal-2261479457-r9 { fill: #2e2e3f } +.terminal-2261479457-r10 { fill: #dfdfe1;font-weight: bold } +.terminal-2261479457-r11 { fill: #9d9da1 } +.terminal-2261479457-r12 { fill: #a79eaf } +.terminal-2261479457-r13 { fill: #6f6f73 } +.terminal-2261479457-r14 { fill: #0f0f1f } +.terminal-2261479457-r15 { fill: #45203a } +.terminal-2261479457-r16 { fill: #dfdfe1 } +.terminal-2261479457-r17 { fill: #0973a3 } +.terminal-2261479457-r18 { fill: #403e62 } +.terminal-2261479457-r19 { fill: #e3e3e8 } +.terminal-2261479457-r20 { fill: #210d17 } +.terminal-2261479457-r21 { fill: #4a4a51 } +.terminal-2261479457-r22 { fill: #191923 } +.terminal-2261479457-r23 { fill: #178941 } +.terminal-2261479457-r24 { fill: #8b8b93 } +.terminal-2261479457-r25 { fill: #616166 } +.terminal-2261479457-r26 { fill: #616166;font-weight: bold } +.terminal-2261479457-r27 { fill: #e1e1e6 } +.terminal-2261479457-r28 { fill: #a5a5b2 } +.terminal-2261479457-r29 { fill: #3b1c3c } +.terminal-2261479457-r30 { fill: #008042 } +.terminal-2261479457-r31 { fill: #9e9ea1 } +.terminal-2261479457-r32 { fill: #9e9ea2;font-weight: bold } +.terminal-2261479457-r33 { fill: #e2e2e6 } +.terminal-2261479457-r34 { fill: #a72f2f } +.terminal-2261479457-r35 { fill: #0d0e2e } +.terminal-2261479457-r36 { fill: #707074 } +.terminal-2261479457-r37 { fill: #11111c } +.terminal-2261479457-r38 { fill: #ab6e07 } +.terminal-2261479457-r39 { fill: #5e5e64 } +.terminal-2261479457-r40 { fill: #727276 } +.terminal-2261479457-r41 { fill: #535359 } +.terminal-2261479457-r42 { fill: #15151f } +.terminal-2261479457-r43 { fill: #027d51;font-weight: bold } +.terminal-2261479457-r44 { fill: #ff7ec8;font-weight: bold } +.terminal-2261479457-r45 { fill: #dadadb } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter▁▁ New request ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ Send  - -╭─ Collection ────Title                            ─────── Request ─╮ -GET echo        Foo: BaroOptions -GET get random u╺━━━━━━━━━━━━━━━ -POS echo post   File name optional -▼ jsonplaceholderfoo-bar           .posting.yaml -▼ posts/ - GET get allDescription optional -GET get one baz                             ─────────────────╯ -POS create  ────── Response ─╮ -DEL delete aDirectory                         -▼ comments/jsonplaceholder/posts          ━━━━━━━━━━━━━━━━━ -GET get co -GET get co▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ -PUT edit a comm││ -│───────────────────────││ -Retrieve all posts││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - esc Cancel  ^n Create  + + + + +Posting                                                                    + +GETEnter▁▁ New request ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ Send  + +╭─ Collection ────Title                            ─────── Request ─╮ +GET echo        Foo: BarScriptsOptions +GET get random u━━━━━━━━━━━━━━━━━ +POS echo post   File name optional +▼ jsonplaceholderfoo-bar           .posting.yaml +▼ posts/ + GET get allDescription optional +GET get one baz                             ─────────────────╯ +POS create  ────── Response ─╮ +DEL delete aDirectory                         +▼ comments/jsonplaceholder/posts          ━━━━━━━━━━━━━━━━━ +GET get co +GET get co▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +PUT edit a comm││ +│───────────────────────││ +Retrieve all posts││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + esc Cancel  ^n Create  diff --git a/tests/__snapshots__/test_snapshots/TestSendRequest.test_send_request.svg b/tests/__snapshots__/test_snapshots/TestSendRequest.test_send_request.svg index 119da434..da2b4f67 100644 --- a/tests/__snapshots__/test_snapshots/TestSendRequest.test_send_request.svg +++ b/tests/__snapshots__/test_snapshots/TestSendRequest.test_send_request.svg @@ -19,216 +19,216 @@ font-weight: 700; } - .terminal-2675315308-matrix { + .terminal-2954263752-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2675315308-title { + .terminal-2954263752-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2675315308-r1 { fill: #dfdfe1 } -.terminal-2675315308-r2 { fill: #c5c8c6 } -.terminal-2675315308-r3 { fill: #ff93dd } -.terminal-2675315308-r4 { fill: #15111e;text-decoration: underline; } -.terminal-2675315308-r5 { fill: #15111e } -.terminal-2675315308-r6 { fill: #43365c } -.terminal-2675315308-r7 { fill: #ff69b4 } -.terminal-2675315308-r8 { fill: #9393a3 } -.terminal-2675315308-r9 { fill: #a684e8 } -.terminal-2675315308-r10 { fill: #e1e1e6 } -.terminal-2675315308-r11 { fill: #00fa9a } -.terminal-2675315308-r12 { fill: #efe3fb } -.terminal-2675315308-r13 { fill: #9f9fa5 } -.terminal-2675315308-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-2675315308-r15 { fill: #632e53 } -.terminal-2675315308-r16 { fill: #0ea5e9 } -.terminal-2675315308-r17 { fill: #58d1eb;font-weight: bold } -.terminal-2675315308-r18 { fill: #6a6a74 } -.terminal-2675315308-r19 { fill: #252532 } -.terminal-2675315308-r20 { fill: #22c55e } -.terminal-2675315308-r21 { fill: #0f0f1f } -.terminal-2675315308-r22 { fill: #ede2f7 } -.terminal-2675315308-r23 { fill: #e1e0e4 } -.terminal-2675315308-r24 { fill: #e2e0e5 } -.terminal-2675315308-r25 { fill: #8b8b93 } -.terminal-2675315308-r26 { fill: #8b8b93;font-weight: bold } -.terminal-2675315308-r27 { fill: #e9e1f1 } -.terminal-2675315308-r28 { fill: #00b85f } -.terminal-2675315308-r29 { fill: #210d17;font-weight: bold } -.terminal-2675315308-r30 { fill: #ef4444 } -.terminal-2675315308-r31 { fill: #737387 } -.terminal-2675315308-r32 { fill: #918d9d } -.terminal-2675315308-r33 { fill: #f59e0b } -.terminal-2675315308-r34 { fill: #002014 } -.terminal-2675315308-r35 { fill: #a2a2a8;font-weight: bold } -.terminal-2675315308-r36 { fill: #e8e8e9 } -.terminal-2675315308-r37 { fill: #e0e0e2 } -.terminal-2675315308-r38 { fill: #6f6f78 } -.terminal-2675315308-r39 { fill: #f92672;font-weight: bold } -.terminal-2675315308-r40 { fill: #ae81ff } -.terminal-2675315308-r41 { fill: #e6db74 } -.terminal-2675315308-r42 { fill: #87878f } -.terminal-2675315308-r43 { fill: #a2a2a8 } -.terminal-2675315308-r44 { fill: #30303b } -.terminal-2675315308-r45 { fill: #00fa9a;font-weight: bold } -.terminal-2675315308-r46 { fill: #ff7ec8;font-weight: bold } -.terminal-2675315308-r47 { fill: #dbdbdd } + .terminal-2954263752-r1 { fill: #dfdfe1 } +.terminal-2954263752-r2 { fill: #c5c8c6 } +.terminal-2954263752-r3 { fill: #ff93dd } +.terminal-2954263752-r4 { fill: #15111e;text-decoration: underline; } +.terminal-2954263752-r5 { fill: #15111e } +.terminal-2954263752-r6 { fill: #43365c } +.terminal-2954263752-r7 { fill: #ff69b4 } +.terminal-2954263752-r8 { fill: #9393a3 } +.terminal-2954263752-r9 { fill: #a684e8 } +.terminal-2954263752-r10 { fill: #e1e1e6 } +.terminal-2954263752-r11 { fill: #00fa9a } +.terminal-2954263752-r12 { fill: #efe3fb } +.terminal-2954263752-r13 { fill: #9f9fa5 } +.terminal-2954263752-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-2954263752-r15 { fill: #632e53 } +.terminal-2954263752-r16 { fill: #0ea5e9 } +.terminal-2954263752-r17 { fill: #58d1eb;font-weight: bold } +.terminal-2954263752-r18 { fill: #6a6a74 } +.terminal-2954263752-r19 { fill: #252532 } +.terminal-2954263752-r20 { fill: #22c55e } +.terminal-2954263752-r21 { fill: #0f0f1f } +.terminal-2954263752-r22 { fill: #ede2f7 } +.terminal-2954263752-r23 { fill: #e1e0e4 } +.terminal-2954263752-r24 { fill: #e2e0e5 } +.terminal-2954263752-r25 { fill: #8b8b93 } +.terminal-2954263752-r26 { fill: #8b8b93;font-weight: bold } +.terminal-2954263752-r27 { fill: #e9e1f1 } +.terminal-2954263752-r28 { fill: #00b85f } +.terminal-2954263752-r29 { fill: #210d17;font-weight: bold } +.terminal-2954263752-r30 { fill: #ef4444 } +.terminal-2954263752-r31 { fill: #737387 } +.terminal-2954263752-r32 { fill: #918d9d } +.terminal-2954263752-r33 { fill: #f59e0b } +.terminal-2954263752-r34 { fill: #002014 } +.terminal-2954263752-r35 { fill: #a2a2a8;font-weight: bold } +.terminal-2954263752-r36 { fill: #e8e8e9 } +.terminal-2954263752-r37 { fill: #e0e0e2 } +.terminal-2954263752-r38 { fill: #6f6f78 } +.terminal-2954263752-r39 { fill: #f92672;font-weight: bold } +.terminal-2954263752-r40 { fill: #ae81ff } +.terminal-2954263752-r41 { fill: #e6db74 } +.terminal-2954263752-r42 { fill: #87878f } +.terminal-2954263752-r43 { fill: #a2a2a8 } +.terminal-2954263752-r44 { fill: #30303b } +.terminal-2954263752-r45 { fill: #00fa9a;font-weight: bold } +.terminal-2954263752-r46 { fill: #ff7ec8;font-weight: bold } +.terminal-2954263752-r47 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                            - -GEThttps://jsonplaceholder.typicode.com/posts        ■■■■■■■ Send  - -╭─ Collection ────────────╮╭───────────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoOptions -GET get random user━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post Content-Type     application/json      -▼ jsonplaceholder/ Referer          https://example.com/  -▼ posts/ Accept-Encoding  gzip                  -█ GET get all Cache-Control    no-cache              -GET get one -POS create -DEL delete a post -▼ comments/ -GET get commentsNameValue Add header  -GET get comments (╰───────────────────────────────────────────────────────╯ -PUT edit a comment╭─────────────────────────────────── Response  200 OK ─╮ -▼ todos/BodyHeadersCookiesTrace -GET get all━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get one  1  [ -▼ users/  2    {                                             -GET get a user  3  "userId"1,                                -GET get all users  4  "id"1,                                    -POS create a user  5  "title""sunt aut facere repellat  -PUT update a userprovident occaecati excepturi optio  -DEL delete a userreprehenderit",                                 -  6  "body""quia et suscipit\nsuscipit  -─────────────────────────recusandae consequuntur expedita et  -Retrieve all posts1:1read-onlyJSONWrap X -╰──── sample-collections ─╯╰───────────────────────────────────────────────────────╯ - d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Qui + + + + +Posting                                                                            + +GEThttps://jsonplaceholder.typicode.com/posts        ■■■■■■■ Send  + +╭─ Collection ────────────╮╭───────────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOptions +GET get random user━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post Content-Type     application/json      +▼ jsonplaceholder/ Referer          https://example.com/  +▼ posts/ Accept-Encoding  gzip                  +█ GET get all Cache-Control    no-cache              +GET get one +POS create +DEL delete a post +▼ comments/ +GET get commentsNameValue Add header  +GET get comments (╰───────────────────────────────────────────────────────╯ +PUT edit a comment╭─────────────────────────────────── Response  200 OK ─╮ +▼ todos/BodyHeadersCookiesTrace +GET get all━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get one  1  [ +▼ users/  2    {                                             +GET get a user  3  "userId"1,                                +GET get all users  4  "id"1,                                    +POS create a user  5  "title""sunt aut facere repellat  +PUT update a userprovident occaecati excepturi optio  +DEL delete a userreprehenderit",                                 +  6  "body""quia et suscipit\nsuscipit  +─────────────────────────recusandae consequuntur expedita et  +Retrieve all posts1:1read-onlyJSONWrap X +╰──── sample-collections ─╯╰───────────────────────────────────────────────────────╯ + d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Qui diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_appears_on_typing.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_appears_on_typing.svg index bdd8a783..8c5f0f97 100644 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_appears_on_typing.svg +++ b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_appears_on_typing.svg @@ -19,172 +19,172 @@ font-weight: 700; } - .terminal-1519454980-matrix { + .terminal-2226392025-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1519454980-title { + .terminal-2226392025-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1519454980-r1 { fill: #dfdfe1 } -.terminal-1519454980-r2 { fill: #c5c8c6 } -.terminal-1519454980-r3 { fill: #ff93dd } -.terminal-1519454980-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1519454980-r5 { fill: #15111e } -.terminal-1519454980-r6 { fill: #43365c } -.terminal-1519454980-r7 { fill: #403e62 } -.terminal-1519454980-r8 { fill: #e3e3e8 } -.terminal-1519454980-r9 { fill: #210d17 } -.terminal-1519454980-r10 { fill: #efe3fb } -.terminal-1519454980-r11 { fill: #9f9fa5 } -.terminal-1519454980-r12 { fill: #ff69b4 } -.terminal-1519454980-r13 { fill: #170b21;font-weight: bold } -.terminal-1519454980-r14 { fill: #e5e5ea;font-weight: bold } -.terminal-1519454980-r15 { fill: #632e53 } -.terminal-1519454980-r16 { fill: #170b21 } -.terminal-1519454980-r17 { fill: #a5a5b2 } -.terminal-1519454980-r18 { fill: #e3e3e8;font-weight: bold } -.terminal-1519454980-r19 { fill: #6a6a74 } -.terminal-1519454980-r20 { fill: #0ea5e9 } -.terminal-1519454980-r21 { fill: #252532 } -.terminal-1519454980-r22 { fill: #22c55e } -.terminal-1519454980-r23 { fill: #252441 } -.terminal-1519454980-r24 { fill: #8b8b93 } -.terminal-1519454980-r25 { fill: #8b8b93;font-weight: bold } -.terminal-1519454980-r26 { fill: #0d0e2e } -.terminal-1519454980-r27 { fill: #00b85f } -.terminal-1519454980-r28 { fill: #737387 } -.terminal-1519454980-r29 { fill: #e1e1e6 } -.terminal-1519454980-r30 { fill: #918d9d } -.terminal-1519454980-r31 { fill: #ef4444 } -.terminal-1519454980-r32 { fill: #2e2e3c;font-weight: bold } -.terminal-1519454980-r33 { fill: #2e2e3c } -.terminal-1519454980-r34 { fill: #a0a0a6 } -.terminal-1519454980-r35 { fill: #191928 } -.terminal-1519454980-r36 { fill: #b74e87 } -.terminal-1519454980-r37 { fill: #87878f } -.terminal-1519454980-r38 { fill: #a3a3a9 } -.terminal-1519454980-r39 { fill: #777780 } -.terminal-1519454980-r40 { fill: #1f1f2d } -.terminal-1519454980-r41 { fill: #04b375;font-weight: bold } -.terminal-1519454980-r42 { fill: #ff7ec8;font-weight: bold } -.terminal-1519454980-r43 { fill: #dbdbdd } + .terminal-2226392025-r1 { fill: #dfdfe1 } +.terminal-2226392025-r2 { fill: #c5c8c6 } +.terminal-2226392025-r3 { fill: #ff93dd } +.terminal-2226392025-r4 { fill: #15111e;text-decoration: underline; } +.terminal-2226392025-r5 { fill: #15111e } +.terminal-2226392025-r6 { fill: #43365c } +.terminal-2226392025-r7 { fill: #403e62 } +.terminal-2226392025-r8 { fill: #e3e3e8 } +.terminal-2226392025-r9 { fill: #210d17 } +.terminal-2226392025-r10 { fill: #efe3fb } +.terminal-2226392025-r11 { fill: #9f9fa5 } +.terminal-2226392025-r12 { fill: #ff69b4 } +.terminal-2226392025-r13 { fill: #170b21;font-weight: bold } +.terminal-2226392025-r14 { fill: #e5e5ea;font-weight: bold } +.terminal-2226392025-r15 { fill: #632e53 } +.terminal-2226392025-r16 { fill: #170b21 } +.terminal-2226392025-r17 { fill: #a5a5b2 } +.terminal-2226392025-r18 { fill: #e3e3e8;font-weight: bold } +.terminal-2226392025-r19 { fill: #6a6a74 } +.terminal-2226392025-r20 { fill: #0ea5e9 } +.terminal-2226392025-r21 { fill: #252532 } +.terminal-2226392025-r22 { fill: #22c55e } +.terminal-2226392025-r23 { fill: #252441 } +.terminal-2226392025-r24 { fill: #8b8b93 } +.terminal-2226392025-r25 { fill: #8b8b93;font-weight: bold } +.terminal-2226392025-r26 { fill: #0d0e2e } +.terminal-2226392025-r27 { fill: #00b85f } +.terminal-2226392025-r28 { fill: #737387 } +.terminal-2226392025-r29 { fill: #e1e1e6 } +.terminal-2226392025-r30 { fill: #918d9d } +.terminal-2226392025-r31 { fill: #ef4444 } +.terminal-2226392025-r32 { fill: #2e2e3c;font-weight: bold } +.terminal-2226392025-r33 { fill: #2e2e3c } +.terminal-2226392025-r34 { fill: #a0a0a6 } +.terminal-2226392025-r35 { fill: #191928 } +.terminal-2226392025-r36 { fill: #b74e87 } +.terminal-2226392025-r37 { fill: #87878f } +.terminal-2226392025-r38 { fill: #a3a3a9 } +.terminal-2226392025-r39 { fill: #777780 } +.terminal-2226392025-r40 { fill: #1f1f2d } +.terminal-2226392025-r41 { fill: #04b375;font-weight: bold } +.terminal-2226392025-r42 { fill: #ff7ec8;font-weight: bold } +.terminal-2226392025-r43 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttp Send  -https://api.randomuser.me            -╭─ Collection ────https://jsonplaceholder.typicode.com────────── Request ─╮ - GET echohttps://postman-echo.com            InfoOptions -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttp Send  +https://api.randomuser.me            +╭─ Collection ────https://jsonplaceholder.typicode.com────────── Request ─╮ + GET echohttps://postman-echo.com            InfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_enter_key.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_enter_key.svg index 5d6cf79d..a2aa2854 100644 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_enter_key.svg +++ b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_enter_key.svg @@ -19,171 +19,171 @@ font-weight: 700; } - .terminal-866456717-matrix { + .terminal-1573393762-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-866456717-title { + .terminal-1573393762-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-866456717-r1 { fill: #dfdfe1 } -.terminal-866456717-r2 { fill: #c5c8c6 } -.terminal-866456717-r3 { fill: #ff93dd } -.terminal-866456717-r4 { fill: #15111e;text-decoration: underline; } -.terminal-866456717-r5 { fill: #15111e } -.terminal-866456717-r6 { fill: #43365c } -.terminal-866456717-r7 { fill: #403e62 } -.terminal-866456717-r8 { fill: #ff69b4 } -.terminal-866456717-r9 { fill: #9b9aab } -.terminal-866456717-r10 { fill: #a684e8 } -.terminal-866456717-r11 { fill: #210d17 } -.terminal-866456717-r12 { fill: #e3e3e8 } -.terminal-866456717-r13 { fill: #efe3fb } -.terminal-866456717-r14 { fill: #9f9fa5 } -.terminal-866456717-r15 { fill: #632e53 } -.terminal-866456717-r16 { fill: #e3e3e8;font-weight: bold } -.terminal-866456717-r17 { fill: #dfdfe1;font-weight: bold } -.terminal-866456717-r18 { fill: #6a6a74 } -.terminal-866456717-r19 { fill: #0ea5e9 } -.terminal-866456717-r20 { fill: #252532 } -.terminal-866456717-r21 { fill: #22c55e } -.terminal-866456717-r22 { fill: #252441 } -.terminal-866456717-r23 { fill: #8b8b93 } -.terminal-866456717-r24 { fill: #8b8b93;font-weight: bold } -.terminal-866456717-r25 { fill: #0d0e2e } -.terminal-866456717-r26 { fill: #00b85f } -.terminal-866456717-r27 { fill: #737387 } -.terminal-866456717-r28 { fill: #e1e1e6 } -.terminal-866456717-r29 { fill: #918d9d } -.terminal-866456717-r30 { fill: #ef4444 } -.terminal-866456717-r31 { fill: #2e2e3c;font-weight: bold } -.terminal-866456717-r32 { fill: #2e2e3c } -.terminal-866456717-r33 { fill: #a0a0a6 } -.terminal-866456717-r34 { fill: #191928 } -.terminal-866456717-r35 { fill: #b74e87 } -.terminal-866456717-r36 { fill: #87878f } -.terminal-866456717-r37 { fill: #a3a3a9 } -.terminal-866456717-r38 { fill: #777780 } -.terminal-866456717-r39 { fill: #1f1f2d } -.terminal-866456717-r40 { fill: #04b375;font-weight: bold } -.terminal-866456717-r41 { fill: #ff7ec8;font-weight: bold } -.terminal-866456717-r42 { fill: #dbdbdd } + .terminal-1573393762-r1 { fill: #dfdfe1 } +.terminal-1573393762-r2 { fill: #c5c8c6 } +.terminal-1573393762-r3 { fill: #ff93dd } +.terminal-1573393762-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1573393762-r5 { fill: #15111e } +.terminal-1573393762-r6 { fill: #43365c } +.terminal-1573393762-r7 { fill: #403e62 } +.terminal-1573393762-r8 { fill: #ff69b4 } +.terminal-1573393762-r9 { fill: #9b9aab } +.terminal-1573393762-r10 { fill: #a684e8 } +.terminal-1573393762-r11 { fill: #210d17 } +.terminal-1573393762-r12 { fill: #e3e3e8 } +.terminal-1573393762-r13 { fill: #efe3fb } +.terminal-1573393762-r14 { fill: #9f9fa5 } +.terminal-1573393762-r15 { fill: #632e53 } +.terminal-1573393762-r16 { fill: #e3e3e8;font-weight: bold } +.terminal-1573393762-r17 { fill: #dfdfe1;font-weight: bold } +.terminal-1573393762-r18 { fill: #6a6a74 } +.terminal-1573393762-r19 { fill: #0ea5e9 } +.terminal-1573393762-r20 { fill: #252532 } +.terminal-1573393762-r21 { fill: #22c55e } +.terminal-1573393762-r22 { fill: #252441 } +.terminal-1573393762-r23 { fill: #8b8b93 } +.terminal-1573393762-r24 { fill: #8b8b93;font-weight: bold } +.terminal-1573393762-r25 { fill: #0d0e2e } +.terminal-1573393762-r26 { fill: #00b85f } +.terminal-1573393762-r27 { fill: #737387 } +.terminal-1573393762-r28 { fill: #e1e1e6 } +.terminal-1573393762-r29 { fill: #918d9d } +.terminal-1573393762-r30 { fill: #ef4444 } +.terminal-1573393762-r31 { fill: #2e2e3c;font-weight: bold } +.terminal-1573393762-r32 { fill: #2e2e3c } +.terminal-1573393762-r33 { fill: #a0a0a6 } +.terminal-1573393762-r34 { fill: #191928 } +.terminal-1573393762-r35 { fill: #b74e87 } +.terminal-1573393762-r36 { fill: #87878f } +.terminal-1573393762-r37 { fill: #a3a3a9 } +.terminal-1573393762-r38 { fill: #777780 } +.terminal-1573393762-r39 { fill: #1f1f2d } +.terminal-1573393762-r40 { fill: #04b375;font-weight: bold } +.terminal-1573393762-r41 { fill: #ff7ec8;font-weight: bold } +.terminal-1573393762-r42 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttps://jsonplaceholder.typicode.com Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoOptions -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttps://jsonplaceholder.typicode.com Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echo││HeadersBodyQueryAuthInfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_tab_key.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_tab_key.svg index 5d6cf79d..a2aa2854 100644 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_tab_key.svg +++ b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_tab_key.svg @@ -19,171 +19,171 @@ font-weight: 700; } - .terminal-866456717-matrix { + .terminal-1573393762-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-866456717-title { + .terminal-1573393762-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-866456717-r1 { fill: #dfdfe1 } -.terminal-866456717-r2 { fill: #c5c8c6 } -.terminal-866456717-r3 { fill: #ff93dd } -.terminal-866456717-r4 { fill: #15111e;text-decoration: underline; } -.terminal-866456717-r5 { fill: #15111e } -.terminal-866456717-r6 { fill: #43365c } -.terminal-866456717-r7 { fill: #403e62 } -.terminal-866456717-r8 { fill: #ff69b4 } -.terminal-866456717-r9 { fill: #9b9aab } -.terminal-866456717-r10 { fill: #a684e8 } -.terminal-866456717-r11 { fill: #210d17 } -.terminal-866456717-r12 { fill: #e3e3e8 } -.terminal-866456717-r13 { fill: #efe3fb } -.terminal-866456717-r14 { fill: #9f9fa5 } -.terminal-866456717-r15 { fill: #632e53 } -.terminal-866456717-r16 { fill: #e3e3e8;font-weight: bold } -.terminal-866456717-r17 { fill: #dfdfe1;font-weight: bold } -.terminal-866456717-r18 { fill: #6a6a74 } -.terminal-866456717-r19 { fill: #0ea5e9 } -.terminal-866456717-r20 { fill: #252532 } -.terminal-866456717-r21 { fill: #22c55e } -.terminal-866456717-r22 { fill: #252441 } -.terminal-866456717-r23 { fill: #8b8b93 } -.terminal-866456717-r24 { fill: #8b8b93;font-weight: bold } -.terminal-866456717-r25 { fill: #0d0e2e } -.terminal-866456717-r26 { fill: #00b85f } -.terminal-866456717-r27 { fill: #737387 } -.terminal-866456717-r28 { fill: #e1e1e6 } -.terminal-866456717-r29 { fill: #918d9d } -.terminal-866456717-r30 { fill: #ef4444 } -.terminal-866456717-r31 { fill: #2e2e3c;font-weight: bold } -.terminal-866456717-r32 { fill: #2e2e3c } -.terminal-866456717-r33 { fill: #a0a0a6 } -.terminal-866456717-r34 { fill: #191928 } -.terminal-866456717-r35 { fill: #b74e87 } -.terminal-866456717-r36 { fill: #87878f } -.terminal-866456717-r37 { fill: #a3a3a9 } -.terminal-866456717-r38 { fill: #777780 } -.terminal-866456717-r39 { fill: #1f1f2d } -.terminal-866456717-r40 { fill: #04b375;font-weight: bold } -.terminal-866456717-r41 { fill: #ff7ec8;font-weight: bold } -.terminal-866456717-r42 { fill: #dbdbdd } + .terminal-1573393762-r1 { fill: #dfdfe1 } +.terminal-1573393762-r2 { fill: #c5c8c6 } +.terminal-1573393762-r3 { fill: #ff93dd } +.terminal-1573393762-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1573393762-r5 { fill: #15111e } +.terminal-1573393762-r6 { fill: #43365c } +.terminal-1573393762-r7 { fill: #403e62 } +.terminal-1573393762-r8 { fill: #ff69b4 } +.terminal-1573393762-r9 { fill: #9b9aab } +.terminal-1573393762-r10 { fill: #a684e8 } +.terminal-1573393762-r11 { fill: #210d17 } +.terminal-1573393762-r12 { fill: #e3e3e8 } +.terminal-1573393762-r13 { fill: #efe3fb } +.terminal-1573393762-r14 { fill: #9f9fa5 } +.terminal-1573393762-r15 { fill: #632e53 } +.terminal-1573393762-r16 { fill: #e3e3e8;font-weight: bold } +.terminal-1573393762-r17 { fill: #dfdfe1;font-weight: bold } +.terminal-1573393762-r18 { fill: #6a6a74 } +.terminal-1573393762-r19 { fill: #0ea5e9 } +.terminal-1573393762-r20 { fill: #252532 } +.terminal-1573393762-r21 { fill: #22c55e } +.terminal-1573393762-r22 { fill: #252441 } +.terminal-1573393762-r23 { fill: #8b8b93 } +.terminal-1573393762-r24 { fill: #8b8b93;font-weight: bold } +.terminal-1573393762-r25 { fill: #0d0e2e } +.terminal-1573393762-r26 { fill: #00b85f } +.terminal-1573393762-r27 { fill: #737387 } +.terminal-1573393762-r28 { fill: #e1e1e6 } +.terminal-1573393762-r29 { fill: #918d9d } +.terminal-1573393762-r30 { fill: #ef4444 } +.terminal-1573393762-r31 { fill: #2e2e3c;font-weight: bold } +.terminal-1573393762-r32 { fill: #2e2e3c } +.terminal-1573393762-r33 { fill: #a0a0a6 } +.terminal-1573393762-r34 { fill: #191928 } +.terminal-1573393762-r35 { fill: #b74e87 } +.terminal-1573393762-r36 { fill: #87878f } +.terminal-1573393762-r37 { fill: #a3a3a9 } +.terminal-1573393762-r38 { fill: #777780 } +.terminal-1573393762-r39 { fill: #1f1f2d } +.terminal-1573393762-r40 { fill: #04b375;font-weight: bold } +.terminal-1573393762-r41 { fill: #ff7ec8;font-weight: bold } +.terminal-1573393762-r42 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttps://jsonplaceholder.typicode.com Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoOptions -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttps://jsonplaceholder.typicode.com Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echo││HeadersBodyQueryAuthInfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_filters_on_typing.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_filters_on_typing.svg index bae5ee16..952c9947 100644 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_filters_on_typing.svg +++ b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_filters_on_typing.svg @@ -19,171 +19,171 @@ font-weight: 700; } - .terminal-1293025071-matrix { + .terminal-1999896595-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1293025071-title { + .terminal-1999896595-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1293025071-r1 { fill: #dfdfe1 } -.terminal-1293025071-r2 { fill: #c5c8c6 } -.terminal-1293025071-r3 { fill: #ff93dd } -.terminal-1293025071-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1293025071-r5 { fill: #15111e } -.terminal-1293025071-r6 { fill: #43365c } -.terminal-1293025071-r7 { fill: #403e62 } -.terminal-1293025071-r8 { fill: #e3e3e8 } -.terminal-1293025071-r9 { fill: #210d17 } -.terminal-1293025071-r10 { fill: #efe3fb } -.terminal-1293025071-r11 { fill: #9f9fa5 } -.terminal-1293025071-r12 { fill: #ff69b4 } -.terminal-1293025071-r13 { fill: #e5e5ea;font-weight: bold } -.terminal-1293025071-r14 { fill: #170b21;font-weight: bold } -.terminal-1293025071-r15 { fill: #632e53 } -.terminal-1293025071-r16 { fill: #e3e3e8;font-weight: bold } -.terminal-1293025071-r17 { fill: #dfdfe1;font-weight: bold } -.terminal-1293025071-r18 { fill: #6a6a74 } -.terminal-1293025071-r19 { fill: #0ea5e9 } -.terminal-1293025071-r20 { fill: #252532 } -.terminal-1293025071-r21 { fill: #22c55e } -.terminal-1293025071-r22 { fill: #252441 } -.terminal-1293025071-r23 { fill: #8b8b93 } -.terminal-1293025071-r24 { fill: #8b8b93;font-weight: bold } -.terminal-1293025071-r25 { fill: #0d0e2e } -.terminal-1293025071-r26 { fill: #00b85f } -.terminal-1293025071-r27 { fill: #737387 } -.terminal-1293025071-r28 { fill: #e1e1e6 } -.terminal-1293025071-r29 { fill: #918d9d } -.terminal-1293025071-r30 { fill: #ef4444 } -.terminal-1293025071-r31 { fill: #2e2e3c;font-weight: bold } -.terminal-1293025071-r32 { fill: #2e2e3c } -.terminal-1293025071-r33 { fill: #a0a0a6 } -.terminal-1293025071-r34 { fill: #191928 } -.terminal-1293025071-r35 { fill: #b74e87 } -.terminal-1293025071-r36 { fill: #87878f } -.terminal-1293025071-r37 { fill: #a3a3a9 } -.terminal-1293025071-r38 { fill: #777780 } -.terminal-1293025071-r39 { fill: #1f1f2d } -.terminal-1293025071-r40 { fill: #04b375;font-weight: bold } -.terminal-1293025071-r41 { fill: #ff7ec8;font-weight: bold } -.terminal-1293025071-r42 { fill: #dbdbdd } + .terminal-1999896595-r1 { fill: #dfdfe1 } +.terminal-1999896595-r2 { fill: #c5c8c6 } +.terminal-1999896595-r3 { fill: #ff93dd } +.terminal-1999896595-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1999896595-r5 { fill: #15111e } +.terminal-1999896595-r6 { fill: #43365c } +.terminal-1999896595-r7 { fill: #403e62 } +.terminal-1999896595-r8 { fill: #e3e3e8 } +.terminal-1999896595-r9 { fill: #210d17 } +.terminal-1999896595-r10 { fill: #efe3fb } +.terminal-1999896595-r11 { fill: #9f9fa5 } +.terminal-1999896595-r12 { fill: #ff69b4 } +.terminal-1999896595-r13 { fill: #e5e5ea;font-weight: bold } +.terminal-1999896595-r14 { fill: #170b21;font-weight: bold } +.terminal-1999896595-r15 { fill: #632e53 } +.terminal-1999896595-r16 { fill: #e3e3e8;font-weight: bold } +.terminal-1999896595-r17 { fill: #dfdfe1;font-weight: bold } +.terminal-1999896595-r18 { fill: #6a6a74 } +.terminal-1999896595-r19 { fill: #0ea5e9 } +.terminal-1999896595-r20 { fill: #252532 } +.terminal-1999896595-r21 { fill: #22c55e } +.terminal-1999896595-r22 { fill: #252441 } +.terminal-1999896595-r23 { fill: #8b8b93 } +.terminal-1999896595-r24 { fill: #8b8b93;font-weight: bold } +.terminal-1999896595-r25 { fill: #0d0e2e } +.terminal-1999896595-r26 { fill: #00b85f } +.terminal-1999896595-r27 { fill: #737387 } +.terminal-1999896595-r28 { fill: #e1e1e6 } +.terminal-1999896595-r29 { fill: #918d9d } +.terminal-1999896595-r30 { fill: #ef4444 } +.terminal-1999896595-r31 { fill: #2e2e3c;font-weight: bold } +.terminal-1999896595-r32 { fill: #2e2e3c } +.terminal-1999896595-r33 { fill: #a0a0a6 } +.terminal-1999896595-r34 { fill: #191928 } +.terminal-1999896595-r35 { fill: #b74e87 } +.terminal-1999896595-r36 { fill: #87878f } +.terminal-1999896595-r37 { fill: #a3a3a9 } +.terminal-1999896595-r38 { fill: #777780 } +.terminal-1999896595-r39 { fill: #1f1f2d } +.terminal-1999896595-r40 { fill: #04b375;font-weight: bold } +.terminal-1999896595-r41 { fill: #ff7ec8;font-weight: bold } +.terminal-1999896595-r42 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETjson Send  -https://jsonplaceholder.typicode.com -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoOptions -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETjson Send  +https://jsonplaceholder.typicode.com +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echo││HeadersBodyQueryAuthInfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_request_section.svg b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_request_section.svg index 05e55aa8..9b007755 100644 --- a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_request_section.svg +++ b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_request_section.svg @@ -19,156 +19,156 @@ font-weight: 700; } - .terminal-3941567175-matrix { + .terminal-3116075932-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3941567175-title { + .terminal-3116075932-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3941567175-r1 { fill: #dfdfe1 } -.terminal-3941567175-r2 { fill: #c5c8c6 } -.terminal-3941567175-r3 { fill: #ff93dd } -.terminal-3941567175-r4 { fill: #15111e;text-decoration: underline; } -.terminal-3941567175-r5 { fill: #15111e } -.terminal-3941567175-r6 { fill: #43365c } -.terminal-3941567175-r7 { fill: #737387 } -.terminal-3941567175-r8 { fill: #e1e1e6 } -.terminal-3941567175-r9 { fill: #efe3fb } -.terminal-3941567175-r10 { fill: #9f9fa5 } -.terminal-3941567175-r11 { fill: #632e53 } -.terminal-3941567175-r12 { fill: #ff69b4 } -.terminal-3941567175-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-3941567175-r14 { fill: #e3e3e8;font-weight: bold } -.terminal-3941567175-r15 { fill: #6a6a74 } -.terminal-3941567175-r16 { fill: #0ea5e9 } -.terminal-3941567175-r17 { fill: #873c69 } -.terminal-3941567175-r18 { fill: #22c55e } -.terminal-3941567175-r19 { fill: #252441 } -.terminal-3941567175-r20 { fill: #8b8b93 } -.terminal-3941567175-r21 { fill: #8b8b93;font-weight: bold } -.terminal-3941567175-r22 { fill: #0d0e2e } -.terminal-3941567175-r23 { fill: #00b85f } -.terminal-3941567175-r24 { fill: #ef4444 } -.terminal-3941567175-r25 { fill: #918d9d } -.terminal-3941567175-r26 { fill: #ff7ec8;font-weight: bold } -.terminal-3941567175-r27 { fill: #dbdbdd } + .terminal-3116075932-r1 { fill: #dfdfe1 } +.terminal-3116075932-r2 { fill: #c5c8c6 } +.terminal-3116075932-r3 { fill: #ff93dd } +.terminal-3116075932-r4 { fill: #15111e;text-decoration: underline; } +.terminal-3116075932-r5 { fill: #15111e } +.terminal-3116075932-r6 { fill: #43365c } +.terminal-3116075932-r7 { fill: #737387 } +.terminal-3116075932-r8 { fill: #e1e1e6 } +.terminal-3116075932-r9 { fill: #efe3fb } +.terminal-3116075932-r10 { fill: #9f9fa5 } +.terminal-3116075932-r11 { fill: #632e53 } +.terminal-3116075932-r12 { fill: #ff69b4 } +.terminal-3116075932-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-3116075932-r14 { fill: #e3e3e8;font-weight: bold } +.terminal-3116075932-r15 { fill: #6a6a74 } +.terminal-3116075932-r16 { fill: #0ea5e9 } +.terminal-3116075932-r17 { fill: #873c69 } +.terminal-3116075932-r18 { fill: #22c55e } +.terminal-3116075932-r19 { fill: #252441 } +.terminal-3116075932-r20 { fill: #8b8b93 } +.terminal-3116075932-r21 { fill: #8b8b93;font-weight: bold } +.terminal-3116075932-r22 { fill: #0d0e2e } +.terminal-3116075932-r23 { fill: #00b85f } +.terminal-3116075932-r24 { fill: #ef4444 } +.terminal-3116075932-r25 { fill: #918d9d } +.terminal-3116075932-r26 { fill: #ff7ec8;font-weight: bold } +.terminal-3116075932-r27 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echoHeadersBodyQueryAuthInfoOptions -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get one╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -POS create╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -DEL delete a post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -│───────────────────────│╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -This is an echo ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -server we can use to ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -see exactly what ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -request is being ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -sent.NameValue Add header  -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get one╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +POS create╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +DEL delete a post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +│───────────────────────│╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +This is an echo ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +server we can use to ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +see exactly what ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +request is being ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +sent.NameValue Add header  +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_then_reset.svg b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_then_reset.svg index 7223de09..c43e1ee6 100644 --- a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_then_reset.svg +++ b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_then_reset.svg @@ -19,166 +19,166 @@ font-weight: 700; } - .terminal-863791226-matrix { + .terminal-2374199631-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-863791226-title { + .terminal-2374199631-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-863791226-r1 { fill: #dfdfe1 } -.terminal-863791226-r2 { fill: #c5c8c6 } -.terminal-863791226-r3 { fill: #ff93dd } -.terminal-863791226-r4 { fill: #15111e;text-decoration: underline; } -.terminal-863791226-r5 { fill: #15111e } -.terminal-863791226-r6 { fill: #43365c } -.terminal-863791226-r7 { fill: #737387 } -.terminal-863791226-r8 { fill: #e1e1e6 } -.terminal-863791226-r9 { fill: #efe3fb } -.terminal-863791226-r10 { fill: #9f9fa5 } -.terminal-863791226-r11 { fill: #632e53 } -.terminal-863791226-r12 { fill: #ff69b4 } -.terminal-863791226-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-863791226-r14 { fill: #e3e3e8;font-weight: bold } -.terminal-863791226-r15 { fill: #6a6a74 } -.terminal-863791226-r16 { fill: #0ea5e9 } -.terminal-863791226-r17 { fill: #873c69 } -.terminal-863791226-r18 { fill: #22c55e } -.terminal-863791226-r19 { fill: #252441 } -.terminal-863791226-r20 { fill: #8b8b93 } -.terminal-863791226-r21 { fill: #8b8b93;font-weight: bold } -.terminal-863791226-r22 { fill: #0d0e2e } -.terminal-863791226-r23 { fill: #00b85f } -.terminal-863791226-r24 { fill: #918d9d } -.terminal-863791226-r25 { fill: #ef4444 } -.terminal-863791226-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-863791226-r27 { fill: #2e2e3c } -.terminal-863791226-r28 { fill: #a0a0a6 } -.terminal-863791226-r29 { fill: #191928 } -.terminal-863791226-r30 { fill: #b74e87 } -.terminal-863791226-r31 { fill: #87878f } -.terminal-863791226-r32 { fill: #a3a3a9 } -.terminal-863791226-r33 { fill: #777780 } -.terminal-863791226-r34 { fill: #1f1f2d } -.terminal-863791226-r35 { fill: #04b375;font-weight: bold } -.terminal-863791226-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-863791226-r37 { fill: #dbdbdd } + .terminal-2374199631-r1 { fill: #dfdfe1 } +.terminal-2374199631-r2 { fill: #c5c8c6 } +.terminal-2374199631-r3 { fill: #ff93dd } +.terminal-2374199631-r4 { fill: #15111e;text-decoration: underline; } +.terminal-2374199631-r5 { fill: #15111e } +.terminal-2374199631-r6 { fill: #43365c } +.terminal-2374199631-r7 { fill: #737387 } +.terminal-2374199631-r8 { fill: #e1e1e6 } +.terminal-2374199631-r9 { fill: #efe3fb } +.terminal-2374199631-r10 { fill: #9f9fa5 } +.terminal-2374199631-r11 { fill: #632e53 } +.terminal-2374199631-r12 { fill: #ff69b4 } +.terminal-2374199631-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-2374199631-r14 { fill: #e3e3e8;font-weight: bold } +.terminal-2374199631-r15 { fill: #6a6a74 } +.terminal-2374199631-r16 { fill: #0ea5e9 } +.terminal-2374199631-r17 { fill: #873c69 } +.terminal-2374199631-r18 { fill: #22c55e } +.terminal-2374199631-r19 { fill: #252441 } +.terminal-2374199631-r20 { fill: #8b8b93 } +.terminal-2374199631-r21 { fill: #8b8b93;font-weight: bold } +.terminal-2374199631-r22 { fill: #0d0e2e } +.terminal-2374199631-r23 { fill: #00b85f } +.terminal-2374199631-r24 { fill: #918d9d } +.terminal-2374199631-r25 { fill: #ef4444 } +.terminal-2374199631-r26 { fill: #2e2e3c;font-weight: bold } +.terminal-2374199631-r27 { fill: #2e2e3c } +.terminal-2374199631-r28 { fill: #a0a0a6 } +.terminal-2374199631-r29 { fill: #191928 } +.terminal-2374199631-r30 { fill: #b74e87 } +.terminal-2374199631-r31 { fill: #87878f } +.terminal-2374199631-r32 { fill: #a3a3a9 } +.terminal-2374199631-r33 { fill: #777780 } +.terminal-2374199631-r34 { fill: #1f1f2d } +.terminal-2374199631-r35 { fill: #04b375;font-weight: bold } +.terminal-2374199631-r36 { fill: #ff7ec8;font-weight: bold } +.terminal-2374199631-r37 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echoHeadersBodyQueryAuthInfoOptions -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get allNameValue Add header  -GET get one╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get allNameValue Add header  +GET get one╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_hide_collection_browser.svg b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_hide_collection_browser.svg index 24cca2e8..737755a0 100644 --- a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_hide_collection_browser.svg +++ b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_hide_collection_browser.svg @@ -19,162 +19,162 @@ font-weight: 700; } - .terminal-3721920745-matrix { + .terminal-2424990533-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3721920745-title { + .terminal-2424990533-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3721920745-r1 { fill: #dfdfe1 } -.terminal-3721920745-r2 { fill: #c5c8c6 } -.terminal-3721920745-r3 { fill: #ff93dd } -.terminal-3721920745-r4 { fill: #15111e;text-decoration: underline; } -.terminal-3721920745-r5 { fill: #15111e } -.terminal-3721920745-r6 { fill: #43365c } -.terminal-3721920745-r7 { fill: #403e62 } -.terminal-3721920745-r8 { fill: #210d17 } -.terminal-3721920745-r9 { fill: #7e7c92 } -.terminal-3721920745-r10 { fill: #e3e3e8 } -.terminal-3721920745-r11 { fill: #efe3fb } -.terminal-3721920745-r12 { fill: #9f9fa5 } -.terminal-3721920745-r13 { fill: #632e53 } -.terminal-3721920745-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-3721920745-r15 { fill: #6a6a74 } -.terminal-3721920745-r16 { fill: #252532 } -.terminal-3721920745-r17 { fill: #ff69b4 } -.terminal-3721920745-r18 { fill: #252441 } -.terminal-3721920745-r19 { fill: #737387 } -.terminal-3721920745-r20 { fill: #e1e1e6 } -.terminal-3721920745-r21 { fill: #918d9d } -.terminal-3721920745-r22 { fill: #2e2e3c;font-weight: bold } -.terminal-3721920745-r23 { fill: #2e2e3c } -.terminal-3721920745-r24 { fill: #a0a0a6 } -.terminal-3721920745-r25 { fill: #191928 } -.terminal-3721920745-r26 { fill: #b74e87 } -.terminal-3721920745-r27 { fill: #87878f } -.terminal-3721920745-r28 { fill: #a3a3a9 } -.terminal-3721920745-r29 { fill: #777780 } -.terminal-3721920745-r30 { fill: #1f1f2d } -.terminal-3721920745-r31 { fill: #04b375;font-weight: bold } -.terminal-3721920745-r32 { fill: #ff7ec8;font-weight: bold } -.terminal-3721920745-r33 { fill: #dbdbdd } + .terminal-2424990533-r1 { fill: #dfdfe1 } +.terminal-2424990533-r2 { fill: #c5c8c6 } +.terminal-2424990533-r3 { fill: #ff93dd } +.terminal-2424990533-r4 { fill: #15111e;text-decoration: underline; } +.terminal-2424990533-r5 { fill: #15111e } +.terminal-2424990533-r6 { fill: #43365c } +.terminal-2424990533-r7 { fill: #403e62 } +.terminal-2424990533-r8 { fill: #210d17 } +.terminal-2424990533-r9 { fill: #7e7c92 } +.terminal-2424990533-r10 { fill: #e3e3e8 } +.terminal-2424990533-r11 { fill: #efe3fb } +.terminal-2424990533-r12 { fill: #9f9fa5 } +.terminal-2424990533-r13 { fill: #632e53 } +.terminal-2424990533-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-2424990533-r15 { fill: #6a6a74 } +.terminal-2424990533-r16 { fill: #252532 } +.terminal-2424990533-r17 { fill: #ff69b4 } +.terminal-2424990533-r18 { fill: #252441 } +.terminal-2424990533-r19 { fill: #737387 } +.terminal-2424990533-r20 { fill: #e1e1e6 } +.terminal-2424990533-r21 { fill: #918d9d } +.terminal-2424990533-r22 { fill: #2e2e3c;font-weight: bold } +.terminal-2424990533-r23 { fill: #2e2e3c } +.terminal-2424990533-r24 { fill: #a0a0a6 } +.terminal-2424990533-r25 { fill: #191928 } +.terminal-2424990533-r26 { fill: #b74e87 } +.terminal-2424990533-r27 { fill: #87878f } +.terminal-2424990533-r28 { fill: #a3a3a9 } +.terminal-2424990533-r29 { fill: #777780 } +.terminal-2424990533-r30 { fill: #1f1f2d } +.terminal-2424990533-r31 { fill: #04b375;font-weight: bold } +.terminal-2424990533-r32 { fill: #ff7ec8;font-weight: bold } +.terminal-2424990533-r33 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭──────────────────────────────────────────────────────────────── Request ─╮ -HeadersBodyQueryAuthInfoOptions -━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -NameValue Add header  -╰──────────────────────────────────────────────────────────────────────────╯ -╭─────────────────────────────────────────────────────────────── Response ─╮ -BodyHeadersCookiesTrace -━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - - - -1:1read-onlyJSONWrap X -╰──────────────────────────────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭──────────────────────────────────────────────────────────────── Request ─╮ +HeadersBodyQueryAuthInfoScriptsOptions +━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +NameValue Add header  +╰──────────────────────────────────────────────────────────────────────────╯ +╭─────────────────────────────────────────────────────────────── Response ─╮ +BodyHeadersCookiesTrace +━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + + + +1:1read-onlyJSONWrap X +╰──────────────────────────────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestVariables.test_resolved_variables_highlight_and_preview.svg b/tests/__snapshots__/test_snapshots/TestVariables.test_resolved_variables_highlight_and_preview.svg index b1706e8e..d0dc2d38 100644 --- a/tests/__snapshots__/test_snapshots/TestVariables.test_resolved_variables_highlight_and_preview.svg +++ b/tests/__snapshots__/test_snapshots/TestVariables.test_resolved_variables_highlight_and_preview.svg @@ -19,173 +19,173 @@ font-weight: 700; } - .terminal-1091758363-matrix { + .terminal-1258613153-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1091758363-title { + .terminal-1258613153-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1091758363-r1 { fill: #dfdfe1 } -.terminal-1091758363-r2 { fill: #c5c8c6 } -.terminal-1091758363-r3 { fill: #ff93dd } -.terminal-1091758363-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1091758363-r5 { fill: #15111e } -.terminal-1091758363-r6 { fill: #43365c } -.terminal-1091758363-r7 { fill: #403e62 } -.terminal-1091758363-r8 { fill: #ff69b4 } -.terminal-1091758363-r9 { fill: #9b9aab } -.terminal-1091758363-r10 { fill: #a684e8 } -.terminal-1091758363-r11 { fill: #e3e3e8 } -.terminal-1091758363-r12 { fill: #00fa9a;text-decoration: underline; } -.terminal-1091758363-r13 { fill: #210d17 } -.terminal-1091758363-r14 { fill: #efe3fb } -.terminal-1091758363-r15 { fill: #9f9fa5 } -.terminal-1091758363-r16 { fill: #170b21;font-weight: bold } -.terminal-1091758363-r17 { fill: #632e53 } -.terminal-1091758363-r18 { fill: #0ea5e9 } -.terminal-1091758363-r19 { fill: #dfdfe1;font-weight: bold } -.terminal-1091758363-r20 { fill: #58d1eb;font-weight: bold } -.terminal-1091758363-r21 { fill: #6a6a74 } -.terminal-1091758363-r22 { fill: #e3e3e8;font-weight: bold } -.terminal-1091758363-r23 { fill: #252532 } -.terminal-1091758363-r24 { fill: #0f0f1f } -.terminal-1091758363-r25 { fill: #ede2f7 } -.terminal-1091758363-r26 { fill: #e1e0e4 } -.terminal-1091758363-r27 { fill: #e2e0e5 } -.terminal-1091758363-r28 { fill: #e9e1f1 } -.terminal-1091758363-r29 { fill: #0d0e2e } -.terminal-1091758363-r30 { fill: #737387 } -.terminal-1091758363-r31 { fill: #e1e1e6 } -.terminal-1091758363-r32 { fill: #918d9d } -.terminal-1091758363-r33 { fill: #2e2e3c;font-weight: bold } -.terminal-1091758363-r34 { fill: #2e2e3c } -.terminal-1091758363-r35 { fill: #a0a0a6 } -.terminal-1091758363-r36 { fill: #191928 } -.terminal-1091758363-r37 { fill: #b74e87 } -.terminal-1091758363-r38 { fill: #87878f } -.terminal-1091758363-r39 { fill: #a3a3a9 } -.terminal-1091758363-r40 { fill: #777780 } -.terminal-1091758363-r41 { fill: #1f1f2d } -.terminal-1091758363-r42 { fill: #04b375;font-weight: bold } -.terminal-1091758363-r43 { fill: #ff7ec8;font-weight: bold } -.terminal-1091758363-r44 { fill: #dbdbdd } + .terminal-1258613153-r1 { fill: #dfdfe1 } +.terminal-1258613153-r2 { fill: #c5c8c6 } +.terminal-1258613153-r3 { fill: #ff93dd } +.terminal-1258613153-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1258613153-r5 { fill: #15111e } +.terminal-1258613153-r6 { fill: #43365c } +.terminal-1258613153-r7 { fill: #403e62 } +.terminal-1258613153-r8 { fill: #ff69b4 } +.terminal-1258613153-r9 { fill: #9b9aab } +.terminal-1258613153-r10 { fill: #a684e8 } +.terminal-1258613153-r11 { fill: #e3e3e8 } +.terminal-1258613153-r12 { fill: #00fa9a;text-decoration: underline; } +.terminal-1258613153-r13 { fill: #210d17 } +.terminal-1258613153-r14 { fill: #efe3fb } +.terminal-1258613153-r15 { fill: #9f9fa5 } +.terminal-1258613153-r16 { fill: #170b21;font-weight: bold } +.terminal-1258613153-r17 { fill: #632e53 } +.terminal-1258613153-r18 { fill: #0ea5e9 } +.terminal-1258613153-r19 { fill: #dfdfe1;font-weight: bold } +.terminal-1258613153-r20 { fill: #58d1eb;font-weight: bold } +.terminal-1258613153-r21 { fill: #6a6a74 } +.terminal-1258613153-r22 { fill: #e3e3e8;font-weight: bold } +.terminal-1258613153-r23 { fill: #252532 } +.terminal-1258613153-r24 { fill: #0f0f1f } +.terminal-1258613153-r25 { fill: #ede2f7 } +.terminal-1258613153-r26 { fill: #e1e0e4 } +.terminal-1258613153-r27 { fill: #e2e0e5 } +.terminal-1258613153-r28 { fill: #e9e1f1 } +.terminal-1258613153-r29 { fill: #0d0e2e } +.terminal-1258613153-r30 { fill: #737387 } +.terminal-1258613153-r31 { fill: #e1e1e6 } +.terminal-1258613153-r32 { fill: #918d9d } +.terminal-1258613153-r33 { fill: #2e2e3c;font-weight: bold } +.terminal-1258613153-r34 { fill: #2e2e3c } +.terminal-1258613153-r35 { fill: #a0a0a6 } +.terminal-1258613153-r36 { fill: #191928 } +.terminal-1258613153-r37 { fill: #b74e87 } +.terminal-1258613153-r38 { fill: #87878f } +.terminal-1258613153-r39 { fill: #a3a3a9 } +.terminal-1258613153-r40 { fill: #777780 } +.terminal-1258613153-r41 { fill: #1f1f2d } +.terminal-1258613153-r42 { fill: #04b375;font-weight: bold } +.terminal-1258613153-r43 { fill: #ff7ec8;font-weight: bold } +.terminal-1258613153-r44 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID Send  -                               TODO_ID = 1                      $TODO_ID -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET get all││HeadersBodyQueryAuthInfoOptions -█ GET get one││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -││ Content-Type     application/json      -││ Referer          https://example.com/  -││ Accept-Encoding  gzip                  -││NameValue Add header  -│╰─────────────────────────────────────────────────╯ -│╭────────────────────────────────────── Response ─╮ -││BodyHeadersCookiesTrace -││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -││ -││ -││ -│───────────────────────││ -Retrieve one todo││1:1read-onlyJSONWrap X -╰─────────────── todos ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID Send  +                               TODO_ID = 1                      $TODO_ID +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET get all││HeadersBodyQueryAuthInfoScriptsOpti +█ GET get one││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +││ Content-Type     application/json      +││ Referer          https://example.com/  +││ Accept-Encoding  gzip                  +││NameValue Add header  +│╰─────────────────────────────────────────────────╯ +│╭────────────────────────────────────── Response ─╮ +││BodyHeadersCookiesTrace +││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +││ +││ +││ +│───────────────────────││ +Retrieve one todo││1:1read-onlyJSONWrap X +╰─────────────── todos ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestVariables.test_unresolved_variables_highlighted.svg b/tests/__snapshots__/test_snapshots/TestVariables.test_unresolved_variables_highlighted.svg index 92418872..eaaa652a 100644 --- a/tests/__snapshots__/test_snapshots/TestVariables.test_unresolved_variables_highlighted.svg +++ b/tests/__snapshots__/test_snapshots/TestVariables.test_unresolved_variables_highlighted.svg @@ -19,211 +19,211 @@ font-weight: 700; } - .terminal-2486848121-matrix { + .terminal-1211479253-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2486848121-title { + .terminal-1211479253-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2486848121-r1 { fill: #dfdfe1 } -.terminal-2486848121-r2 { fill: #c5c8c6 } -.terminal-2486848121-r3 { fill: #ff93dd } -.terminal-2486848121-r4 { fill: #15111e;text-decoration: underline; } -.terminal-2486848121-r5 { fill: #15111e } -.terminal-2486848121-r6 { fill: #43365c } -.terminal-2486848121-r7 { fill: #ff69b4 } -.terminal-2486848121-r8 { fill: #9393a3 } -.terminal-2486848121-r9 { fill: #a684e8 } -.terminal-2486848121-r10 { fill: #e1e1e6 } -.terminal-2486848121-r11 { fill: #efe3fb } -.terminal-2486848121-r12 { fill: #9f9fa5 } -.terminal-2486848121-r13 { fill: #632e53 } -.terminal-2486848121-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-2486848121-r15 { fill: #0ea5e9 } -.terminal-2486848121-r16 { fill: #6a6a74 } -.terminal-2486848121-r17 { fill: #58d1eb;font-weight: bold } -.terminal-2486848121-r18 { fill: #252532 } -.terminal-2486848121-r19 { fill: #22c55e } -.terminal-2486848121-r20 { fill: #252441 } -.terminal-2486848121-r21 { fill: #8b8b93 } -.terminal-2486848121-r22 { fill: #8b8b93;font-weight: bold } -.terminal-2486848121-r23 { fill: #00b85f } -.terminal-2486848121-r24 { fill: #ef4444 } -.terminal-2486848121-r25 { fill: #403e62 } -.terminal-2486848121-r26 { fill: #ff4500 } -.terminal-2486848121-r27 { fill: #e3e3e8 } -.terminal-2486848121-r28 { fill: #210d17 } -.terminal-2486848121-r29 { fill: #f59e0b } -.terminal-2486848121-r30 { fill: #2e2e3c;font-weight: bold } -.terminal-2486848121-r31 { fill: #2e2e3c } -.terminal-2486848121-r32 { fill: #a0a0a6 } -.terminal-2486848121-r33 { fill: #e3e3e8;font-weight: bold } -.terminal-2486848121-r34 { fill: #191928 } -.terminal-2486848121-r35 { fill: #b74e87 } -.terminal-2486848121-r36 { fill: #87878f } -.terminal-2486848121-r37 { fill: #a3a3a9 } -.terminal-2486848121-r38 { fill: #777780 } -.terminal-2486848121-r39 { fill: #1f1f2d } -.terminal-2486848121-r40 { fill: #04b375;font-weight: bold } -.terminal-2486848121-r41 { fill: #ff7ec8;font-weight: bold } -.terminal-2486848121-r42 { fill: #dbdbdd } + .terminal-1211479253-r1 { fill: #dfdfe1 } +.terminal-1211479253-r2 { fill: #c5c8c6 } +.terminal-1211479253-r3 { fill: #ff93dd } +.terminal-1211479253-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1211479253-r5 { fill: #15111e } +.terminal-1211479253-r6 { fill: #43365c } +.terminal-1211479253-r7 { fill: #ff69b4 } +.terminal-1211479253-r8 { fill: #9393a3 } +.terminal-1211479253-r9 { fill: #a684e8 } +.terminal-1211479253-r10 { fill: #e1e1e6 } +.terminal-1211479253-r11 { fill: #efe3fb } +.terminal-1211479253-r12 { fill: #9f9fa5 } +.terminal-1211479253-r13 { fill: #632e53 } +.terminal-1211479253-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-1211479253-r15 { fill: #0ea5e9 } +.terminal-1211479253-r16 { fill: #6a6a74 } +.terminal-1211479253-r17 { fill: #58d1eb;font-weight: bold } +.terminal-1211479253-r18 { fill: #252532 } +.terminal-1211479253-r19 { fill: #22c55e } +.terminal-1211479253-r20 { fill: #252441 } +.terminal-1211479253-r21 { fill: #8b8b93 } +.terminal-1211479253-r22 { fill: #8b8b93;font-weight: bold } +.terminal-1211479253-r23 { fill: #00b85f } +.terminal-1211479253-r24 { fill: #ef4444 } +.terminal-1211479253-r25 { fill: #403e62 } +.terminal-1211479253-r26 { fill: #ff4500 } +.terminal-1211479253-r27 { fill: #e3e3e8 } +.terminal-1211479253-r28 { fill: #210d17 } +.terminal-1211479253-r29 { fill: #f59e0b } +.terminal-1211479253-r30 { fill: #2e2e3c;font-weight: bold } +.terminal-1211479253-r31 { fill: #2e2e3c } +.terminal-1211479253-r32 { fill: #a0a0a6 } +.terminal-1211479253-r33 { fill: #e3e3e8;font-weight: bold } +.terminal-1211479253-r34 { fill: #191928 } +.terminal-1211479253-r35 { fill: #b74e87 } +.terminal-1211479253-r36 { fill: #87878f } +.terminal-1211479253-r37 { fill: #a3a3a9 } +.terminal-1211479253-r38 { fill: #777780 } +.terminal-1211479253-r39 { fill: #1f1f2d } +.terminal-1211479253-r40 { fill: #04b375;font-weight: bold } +.terminal-1211479253-r41 { fill: #ff7ec8;font-weight: bold } +.terminal-1211479253-r42 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                                                          - -GEThttps://jsonplaceholder.typicode.com/todos                                                Send  - -╭─ Collection ──────────────────────╮╭───────────────────────────────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoOptions -GET get random user━━━━━━━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no parameters.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get one╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -POS create╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -DEL delete a post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ comments/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get commentsfoo                      $nope/${nope} Add   -GET get comments (via param)╰───────────────────────────────────────────────────────────────────────────╯ -PUT edit a comment│╭──────────────────────────────────────────────────────────────── Response ─╮ -▼ todos/││BodyHeadersCookiesTrace -█ GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get one││ -▼ users/││ -GET get a user││ -GET get all users││ -POS create a user││ -PUT update a user││ -DEL delete a user││ -││ -│───────────────────────────────────││ -Retrieve all todos││1:1read-onlyJSONWrap X -╰────────────── sample-collections ─╯╰───────────────────────────────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  + + + + +Posting                                                                                                          + +GEThttps://jsonplaceholder.typicode.com/todos                                                Send  + +╭─ Collection ──────────────────────╮╭───────────────────────────────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOptions +GET get random user━━━━━━━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no parameters.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get one╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +POS create╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +DEL delete a post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ comments/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get commentsfoo                      $nope/${nope} Add   +GET get comments (via param)╰───────────────────────────────────────────────────────────────────────────╯ +PUT edit a comment│╭──────────────────────────────────────────────────────────────── Response ─╮ +▼ todos/││BodyHeadersCookiesTrace +█ GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get one││ +▼ users/││ +GET get a user││ +GET get all users││ +POS create a user││ +PUT update a user││ +DEL delete a user││ +││ +│───────────────────────────────────││ +Retrieve all todos││1:1read-onlyJSONWrap X +╰────────────── sample-collections ─╯╰───────────────────────────────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  diff --git a/tests/test_snapshots.py b/tests/test_snapshots.py index 59f64aa0..03ee3b09 100644 --- a/tests/test_snapshots.py +++ b/tests/test_snapshots.py @@ -302,7 +302,7 @@ def test_request_loaded_into_view__options(self, snap_compare): async def run_before(pilot: Pilot): await pilot.press(*"jj") await pilot.press("enter") - await pilot.press("ctrl+o", "y") # jump to 'Options' tab + await pilot.press("ctrl+o", "u") # jump to 'Options' tab assert snap_compare(POSTING_MAIN, run_before=run_before, terminal_size=(80, 44)) From ab12266c96619cc673aa49d4aa36dc441bbe6542 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 21 Sep 2024 21:14:21 +0100 Subject: [PATCH 08/70] Remove old CSS --- src/posting/widgets/request/request_scripts.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/posting/widgets/request/request_scripts.py b/src/posting/widgets/request/request_scripts.py index 0e2a67f7..59b26769 100644 --- a/src/posting/widgets/request/request_scripts.py +++ b/src/posting/widgets/request/request_scripts.py @@ -45,23 +45,6 @@ class RequestScripts(VerticalScroll): & Input { margin-bottom: 1; } - - & #scripts-path-header-container { - height: 1; - } - - & #scripts-path-title { - width: 13; - } - - & #scripts-path { - color: $text-muted; - width: 1fr; - } - - & #copy-scripts-path { - width: 6; - } } """ From 309947f77981d5aa52ecc7f9916f7b0b4cb475d3 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 21 Sep 2024 21:19:13 +0100 Subject: [PATCH 09/70] rename pre/post request to on_request/on_response in Scripts --- .coverage | Bin 53248 -> 53248 bytes src/posting/app.py | 3 +++ src/posting/collection.py | 4 ++-- .../widgets/request/request_scripts.py | 12 ++++++------ tests/sample-collections/echo.posting.yaml | 2 +- tests/sample-collections/scripts/my_script.py | 4 ++-- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/.coverage b/.coverage index 380795feef4f46786f4721d4e9f92293d67ac454..43ce0bf487931f29d1e0ba82972b65febca601f2 100644 GIT binary patch delta 475 zcmZozz}&Eac>_~Jy&r=aR|qq&8?Pa+8ZQseEUplq2|Rf`sXX31>O4|B0^IMppK+h& z-od?s{|xs${v3W6?oPh<+_l^}+_Bst+_rq%xMjITxY@YAaNXy+%5{iuDPJqsYQ7x4 zSUzt)Z9Y-11-#FBukdc=n#{YBcRueF-fRYBuvtzZn$thOMUj<}voVhK-+yNQANKqH zrZY0kImz_jzV7S(%H;a@>)t&4u>Zd~1H)a}!$q${W4ZIzXe$^pGB9WrB=6q$c=xWW zMt|@7+<(?kT@D1rlM}n-xlSid_xzM(Z)X9iQ8~vrIlAAJldYWr$mLVmG$5+ zL42Kk4>ME4PuB$g$w#_O<%QbHfpTi%|ITc+zkB}lyXVdKzq7Kpm4HkWnZ`d^v**)f zp{}CIQN2>!9Bs)!VIgL_~J{X_;cE+GcqPTmr(7Tzc>Azo=-L7w+K&v?%8tl*i=Gm)o&C!NQK z$C5{r`z!Zr?r!d6Za=P{TyMGVaGm8k!vB(g1OEiB-TY1b1^m%m8~Hu>&H2T-X7T;w zd(U^5Z!h0cu7199z7#%JK5IUGK2<&`-j58(V6&V+J119uiy~`&OE@bd=j2&EMO++h z$t;YVLd)K(4@Q4{}nW~=?( z^QYfEZ@&MXb+Su;2N!!=2}qa7H2%qF`b{RU=>9Z0q|1IXPp{Nu!(Ii(gvt56s^&na zBmiwPUH6{@!W1z1#1CPK80$S|_yH9)`os=lSsA|jKGSe=cCQx~d%F None: print("proxy =", request_model.options.proxy_url) print("timeout =", request_model.options.timeout) print("auth =", request_model.auth) + + # If there's an associated pre-request script, run it. + response = await client.send( request=request, follow_redirects=request_options.follow_redirects, diff --git a/src/posting/collection.py b/src/posting/collection.py index d43a7499..9f56143d 100644 --- a/src/posting/collection.py +++ b/src/posting/collection.py @@ -116,10 +116,10 @@ def request_sort_key(request: RequestModel) -> tuple[int, str]: class Scripts(BaseModel): - pre_request: str | None = Field(default=None) + on_request: str | None = Field(default=None) """A relative path to a script that will be run before the request is sent.""" - post_response: str | None = Field(default=None) + on_response: str | None = Field(default=None) """A relative path to a script that will be run after the response is received.""" diff --git a/src/posting/widgets/request/request_scripts.py b/src/posting/widgets/request/request_scripts.py index 59b26769..f79a2095 100644 --- a/src/posting/widgets/request/request_scripts.py +++ b/src/posting/widgets/request/request_scripts.py @@ -1,8 +1,8 @@ from pathlib import Path from textual.app import ComposeResult -from textual.containers import Horizontal, Vertical, VerticalScroll +from textual.containers import VerticalScroll from textual.widget import Widget -from textual.widgets import Button, Input, Label, Static +from textual.widgets import Input, Label from textual_autocomplete import AutoComplete, DropdownItem, TargetState from posting.collection import Scripts @@ -25,8 +25,8 @@ class RequestScripts(VerticalScroll): Example: ``` - scripts/pre_request.py:prepare_auth - scripts/post_response.py:log_response + scripts/on_request.py:prepare_auth + scripts/on_response.py:log_response ``` The API for scripts is under development and will likely change. @@ -97,13 +97,13 @@ def get_script_candidates(self, state: TargetState) -> list[DropdownItem]: return scripts def load_scripts(self, scripts: Scripts) -> None: - self.query_one("#pre-request-script", Input).value = scripts.pre_request or "" + self.query_one("#pre-request-script", Input).value = scripts.on_request or "" self.query_one("#post-response-script", Input).value = ( scripts.post_response or "" ) def to_model(self) -> Scripts: return Scripts( - pre_request=self.query_one("#pre-request-script", Input).value or None, + on_request=self.query_one("#pre-request-script", Input).value or None, post_response=self.query_one("#post-response-script", Input).value or None, ) diff --git a/tests/sample-collections/echo.posting.yaml b/tests/sample-collections/echo.posting.yaml index bf8bd718..8ace4e5b 100644 --- a/tests/sample-collections/echo.posting.yaml +++ b/tests/sample-collections/echo.posting.yaml @@ -7,6 +7,6 @@ body: - name: something value: '123' scripts: - pre_request: scripts/my_script.py + on_request: scripts/my_script.py options: follow_redirects: false diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py index 12e5e054..b2a880ef 100644 --- a/tests/sample-collections/scripts/my_script.py +++ b/tests/sample-collections/scripts/my_script.py @@ -1,6 +1,6 @@ -def pre_request(): +def on_request(): pass -def post_response(): +def on_response(): pass From 932051014e56d9d18f2e746c4e510b2105f75512 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 21 Sep 2024 21:19:37 +0100 Subject: [PATCH 10/70] Finish rename --- src/posting/widgets/request/request_scripts.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/posting/widgets/request/request_scripts.py b/src/posting/widgets/request/request_scripts.py index f79a2095..5f1d4c9d 100644 --- a/src/posting/widgets/request/request_scripts.py +++ b/src/posting/widgets/request/request_scripts.py @@ -98,12 +98,10 @@ def get_script_candidates(self, state: TargetState) -> list[DropdownItem]: def load_scripts(self, scripts: Scripts) -> None: self.query_one("#pre-request-script", Input).value = scripts.on_request or "" - self.query_one("#post-response-script", Input).value = ( - scripts.post_response or "" - ) + self.query_one("#post-response-script", Input).value = scripts.on_response or "" def to_model(self) -> Scripts: return Scripts( on_request=self.query_one("#pre-request-script", Input).value or None, - post_response=self.query_one("#post-response-script", Input).value or None, + on_response=self.query_one("#post-response-script", Input).value or None, ) From 76f65911a72c84df5fbed52a1714b9a5945fd7d1 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 21 Sep 2024 22:20:06 +0100 Subject: [PATCH 11/70] Attaching scripts to requests --- src/posting/app.py | 87 +++++++++++++++++++ src/posting/scripts.py | 75 ++++++++-------- tests/sample-collections/scripts/my_script.py | 4 +- 3 files changed, 130 insertions(+), 36 deletions(-) diff --git a/src/posting/app.py b/src/posting/app.py index be902706..11912e66 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -1,3 +1,4 @@ +import inspect from pathlib import Path from typing import Any, Literal, cast import httpx @@ -37,6 +38,7 @@ from posting.help_screen import HelpScreen from posting.jump_overlay import JumpOverlay from posting.jumper import Jumper +from posting.scripts import clear_module_cache, execute_script from posting.themes import BUILTIN_THEMES, Theme, load_user_themes from posting.types import CertTypes, PostingLayout from posting.user_host import get_user_host_string @@ -178,6 +180,59 @@ def compose(self) -> ComposeResult: yield ResponseArea() yield Footer(show_command_palette=False) + def get_and_run_script( + self, script_path: str, default_function_name: str, *args: Any + ) -> None: + """ + Get and run a function from a script. + + Args: + script_path: Path to the script, relative to the collection path. + default_function_name: Default function name to use if not specified in the path. + *args: Arguments to pass to the script function. + """ + full_path = self.collection.path / Path(script_path) + path_name_parts = full_path.name.split(":") + if len(path_name_parts) == 2: + script_path, function_name = path_name_parts + else: + script_path = path_name_parts[0] + function_name = default_function_name + + full_path = full_path.parent / script_path + try: + script_function = execute_script(full_path, function_name) + except Exception as e: + log.error(f"Error loading script {function_name}: {e}") + self.notify( + severity="error", + title=f"Error loading script {function_name}", + message=f"The script at {full_path} could not be loaded.", + ) + return + + if script_function is not None: + try: + # If the script function takes arguments, pass the arguments to the script function. + if inspect.signature(script_function).parameters: + script_function(*args) + else: + script_function() + except Exception as e: + log.error(f"Error running {function_name} script: {e}") + self.notify( + severity="error", + title=f"Error running {function_name} script", + message=f"{e}", + ) + else: + log.warning(f"{function_name.capitalize()} script not found: {full_path}") + self.notify( + severity="error", + title=f"{function_name.capitalize()} script not found", + message=f"The {function_name} script at {full_path} could not be found.", + ) + async def send_request(self) -> None: self.url_bar.clear_events() request_options = self.request_options.to_model() @@ -231,6 +286,8 @@ async def send_request(self) -> None: print("auth =", request_model.auth) # If there's an associated pre-request script, run it. + if on_request := request_model.scripts.on_request: + self.get_and_run_script(on_request, "on_request", request) response = await client.send( request=request, @@ -238,6 +295,10 @@ async def send_request(self) -> None: ) print("response cookies =", response.cookies) self.post_message(HttpResponseReceived(response)) + + if on_response := request_model.scripts.on_response: + self.get_and_run_script(on_response, "on_response", response) + except httpx.ConnectTimeout as connect_timeout: log.error("Connect timeout", connect_timeout) self.notify( @@ -649,12 +710,19 @@ def __init__( @work(exclusive=True, group="environment-watcher") async def watch_environment_files(self) -> None: + """Watching files that were passed in as the environment.""" async for changes in awatch(*self.environment_files): + # Reload the variables from the environment files. await load_variables( self.environment_files, self.settings.use_host_environment, avoid_cache=True, ) + # Notify the app that the environment has changed, + # which will trigger a reload of the variables in the relevant widgets. + # Widgets subscribed to this signal can reload as needed. + # For example, AutoComplete dropdowns will want to reload their + # candidate variables when the environment changes. self.env_changed_signal.publish(None) self.notify( title="Environment changed", @@ -662,6 +730,23 @@ async def watch_environment_files(self) -> None: timeout=3, ) + @work(exclusive=True, group="collection-watcher") + async def watch_collection_files(self) -> None: + """Watching specific files within the collection directory.""" + async for changes in awatch(self.collection.path): + for _, file_name in changes: + if file_name.endswith(".py"): + # If a Python file was updated, then we want to clear + # the script module cache for the app so that modules + # are reloaded on the next request being sent. + # Without this, we'd hit the module cache and simply + # re-execute the previously cached module. + self.notify( + message="Reloaded scripts", + timeout=3, + ) + clear_module_cache() + def on_mount(self) -> None: self.jumper = Jumper( { @@ -687,6 +772,8 @@ def on_mount(self) -> None: if self.settings.watch_env_files: self.watch_environment_files() + self.watch_collection_files() + def get_default_screen(self) -> MainScreen: self.main_screen = MainScreen( collection=self.collection, diff --git a/src/posting/scripts.py b/src/posting/scripts.py index 0c2aed28..eb38a6c2 100644 --- a/src/posting/scripts.py +++ b/src/posting/scripts.py @@ -1,32 +1,35 @@ -"""Deals with running scripts that can be saved alongside a collection. - -These could be pre-request, post-response. -""" - from __future__ import annotations import sys from pathlib import Path from types import ModuleType -from typing import Callable, NamedTuple +from typing import Callable, Any +import threading -import httpx +# Global cache for loaded modules +_MODULE_CACHE: dict[str, ModuleType] = {} +_CACHE_LOCK = threading.Lock() -class ScriptFunctions(NamedTuple): - on_request: Callable[[httpx.Request], None] | None - on_response: Callable[[httpx.Response], None] | None +def clear_module_cache(): + """ + Clear the global module cache in a thread-safe manner. + """ + with _CACHE_LOCK: + _MODULE_CACHE.clear() -def execute_script(script_path: Path) -> ScriptFunctions: +def execute_script(script_path: Path, function_name: str) -> Callable[..., Any] | None: """ - Execute a Python script from the given path and extract on_request and on_response functions. + Execute a Python script from the given path and extract a specified function. + Uses caching to prevent multiple executions of the same script. Args: - script_path: Path to the Python script. + script_path: Path to the Python script file. + function_name: Name of the function to extract from the script. Returns: - ScriptFunctions: A named tuple containing the extracted functions. + The extracted function if found, None otherwise. Raises: FileNotFoundError: If the script file does not exist. @@ -37,31 +40,24 @@ def execute_script(script_path: Path) -> ScriptFunctions: script_dir = script_path.parent.resolve() module_name = script_path.stem + module_key = str(script_path.resolve()) try: sys.path.insert(0, str(script_dir)) - module = _import_script_as_module(script_path, module_name) - on_request = getattr(module, "on_request", None) - on_response = getattr(module, "on_response", None) - return ScriptFunctions(on_request=on_request, on_response=on_response) + module = _import_script_as_module(script_path, module_name, module_key) + return _validate_function(getattr(module, function_name, None)) finally: sys.path.remove(str(script_dir)) -def _import_script_as_module(script_path: Path, module_name: str) -> ModuleType: - """ - Import the script file as a module. - - Args: - script_path (Path): Path to the script file. - module_name (str): Name to use for the module. - - Returns: - ModuleType: The imported module. +def _import_script_as_module( + script_path: Path, module_name: str, module_key: str +) -> ModuleType: + """Import the script file as a module, using cache if available.""" + with _CACHE_LOCK: + if module_key in _MODULE_CACHE: + return _MODULE_CACHE[module_key] - Raises: - ImportError: If there's an error importing the module. - """ import importlib.util spec = importlib.util.spec_from_file_location(module_name, script_path) @@ -75,9 +71,20 @@ def _import_script_as_module(script_path: Path, module_name: str) -> ModuleType: raise ImportError(f"Could not load module {module_name} from {script_path}") spec.loader.exec_module(module) + with _CACHE_LOCK: + _MODULE_CACHE[module_key] = module + return module -# Usage example -if __name__ == "__main__": - script_path = Path("path/to/your/script.py") +def _validate_function(func: Any) -> Callable[..., Any] | None: + """ + Validate that the provided object is a callable function. + + Args: + func: The object to validate. + + Returns: + The function if it's callable, None otherwise. + """ + return func if callable(func) else None diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py index b2a880ef..56e03eca 100644 --- a/tests/sample-collections/scripts/my_script.py +++ b/tests/sample-collections/scripts/my_script.py @@ -1,5 +1,5 @@ -def on_request(): - pass +def on_request(request): + request.headers["X-Custom-Header"] = "Custom-Values!!!" def on_response(): From a2f0ab5507e97841ac5c57e507b80b97b1c7d90f Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sun, 22 Sep 2024 22:20:18 +0100 Subject: [PATCH 12/70] Opening scripts in PAGER and EDITOR --- .../widgets/request/request_scripts.py | 109 +++++++++++++++++- tests/sample-collections/scripts/my_script.py | 2 +- 2 files changed, 108 insertions(+), 3 deletions(-) diff --git a/src/posting/widgets/request/request_scripts.py b/src/posting/widgets/request/request_scripts.py index 5f1d4c9d..01f99543 100644 --- a/src/posting/widgets/request/request_scripts.py +++ b/src/posting/widgets/request/request_scripts.py @@ -1,11 +1,114 @@ from pathlib import Path +import shlex +import subprocess +from typing import Any from textual.app import ComposeResult +from textual.binding import Binding from textual.containers import VerticalScroll from textual.widget import Widget from textual.widgets import Input, Label from textual_autocomplete import AutoComplete, DropdownItem, TargetState from posting.collection import Scripts +from posting.config import SETTINGS + + +class ScriptPathInput(Input): + BINDINGS = [ + Binding("ctrl+e", "open_in_editor", "To editor"), + Binding("ctrl+p", "open_in_pager", "To pager"), + ] + + def __init__( + self, + collection_root: Path, + *args: Any, + **kwargs: Any, + ) -> None: + super().__init__(*args, **kwargs) + self.collection_root = collection_root + + def _get_script_path(self) -> Path | None: + """ + Get the script path from the input value. + + Handles the `path/to/script.py:function_name` syntax and resolves + relative paths against the collection root. + + Returns: + The resolved script path if it exists, None otherwise. + """ + # Handle the `path/to/script.py:function_name` syntax + value = self.value.strip() + if ":" in value: + value, _function_name = value.split(":") + + # Paths are interpreted relative to the collection root + script_path = Path(value) + if not script_path.is_absolute(): + script_path = self.collection_root / script_path + + # Ensure the script exists, and notify the user if it doesn't + if not script_path.exists(): + self.app.notify( + severity="error", + title="Invalid script path", + message=f"The script file '{script_path}' does not exist.", + ) + return None + + return script_path + + def _open_with_command(self, command_name: str, command_setting: str) -> None: + """ + Open the script in the specified command. + + Args: + command_name: The name of the command to use (for display purposes). + command_setting: The name of the setting to retrieve the command from. + """ + command = SETTINGS.get().__getattribute__(command_setting) + if not command: + self.app.notify( + severity="warning", + title=f"No {command_name} configured", + message=f"Set the [b]${command_setting.upper()}[/b] environment variable.", + ) + return + + script_path = self._get_script_path() + if not script_path: + return + + command_args = shlex.split(command) + command_args.append(str(script_path)) + + with self.app.suspend(): + try: + subprocess.call(command_args) + except OSError: + command_string = shlex.join(command_args) + self.app.notify( + severity="error", + title=f"Can't run {command_name} command", + message=f"The command [b]{command_string}[/b] failed to run.", + ) + + def action_open_in_editor(self) -> None: + """ + Open the script in the configured editor. + + This action is triggered when the user presses Ctrl+E. + """ + self._open_with_command("editor", "editor") + + def action_open_in_pager(self) -> None: + """ + Open the script in the configured pager. + + This action is triggered when the user presses Ctrl+P. + """ + self._open_with_command("pager", "pager") class RequestScripts(VerticalScroll): @@ -66,13 +169,15 @@ def compose(self) -> ComposeResult: self.can_focus = False yield Label("Pre-request script [dim]optional[/dim]") - yield Input( + yield ScriptPathInput( + collection_root=self.collection_root, placeholder="Collection-relative path to pre-request script", id="pre-request-script", ) yield Label("Post-response script [dim]optional[/dim]") - yield Input( + yield ScriptPathInput( + collection_root=self.collection_root, placeholder="Collection-relative path to post-response script", id="post-response-script", ) diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py index 56e03eca..72610c3a 100644 --- a/tests/sample-collections/scripts/my_script.py +++ b/tests/sample-collections/scripts/my_script.py @@ -1,5 +1,5 @@ def on_request(request): - request.headers["X-Custom-Header"] = "Custom-Values!!!" + request.headers["X-Custom-Header"] = "Custom-Values edited" def on_response(): From a410c9ffdd0e38e213fb0b0d70281779f47ca1ab Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sun, 22 Sep 2024 22:33:06 +0100 Subject: [PATCH 13/70] Add tooltip to open in editor/pager for scripts --- src/posting/posting.scss | 5 +++++ src/posting/widgets/request/request_scripts.py | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/posting/posting.scss b/src/posting/posting.scss index 9e6a7f4f..118282f7 100644 --- a/src/posting/posting.scss +++ b/src/posting/posting.scss @@ -12,6 +12,11 @@ } } +Tooltip { + background: $surface-darken-1; + border-left: wide $accent; +} + AutoComplete { border-left: wide $accent; background: $surface; diff --git a/src/posting/widgets/request/request_scripts.py b/src/posting/widgets/request/request_scripts.py index 01f99543..1198a9b4 100644 --- a/src/posting/widgets/request/request_scripts.py +++ b/src/posting/widgets/request/request_scripts.py @@ -15,8 +15,18 @@ class ScriptPathInput(Input): BINDINGS = [ - Binding("ctrl+e", "open_in_editor", "To editor"), - Binding("ctrl+p", "open_in_pager", "To pager"), + Binding( + "ctrl+e", + "open_in_editor", + "To editor", + tooltip="Open this script in the configured $EDITOR.", + ), + Binding( + "ctrl+p", + "open_in_pager", + "To pager", + tooltip="Open this script in the configured $PAGER.", + ), ] def __init__( From bcf889076ac9e41811ed42612914971a71f35092 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Mon, 23 Sep 2024 22:10:26 +0100 Subject: [PATCH 14/70] Only clear module cache on change or delete --- src/posting/app.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/posting/app.py b/src/posting/app.py index 11912e66..ae306485 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -24,7 +24,7 @@ ) from textual.widgets._tabbed_content import ContentTab from textual.widgets.text_area import TextAreaTheme -from watchfiles import awatch +from watchfiles import Change, awatch from posting.collection import ( Collection, Cookie, @@ -734,8 +734,11 @@ async def watch_environment_files(self) -> None: async def watch_collection_files(self) -> None: """Watching specific files within the collection directory.""" async for changes in awatch(self.collection.path): - for _, file_name in changes: - if file_name.endswith(".py"): + for change_type, file_name in changes: + if file_name.endswith(".py") and change_type in ( + Change.deleted, + Change.modified, + ): # If a Python file was updated, then we want to clear # the script module cache for the app so that modules # are reloaded on the next request being sent. From fc393990862b00318a46f4b465d6fbb0301c0ea4 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Mon, 23 Sep 2024 22:12:28 +0100 Subject: [PATCH 15/70] Improvements --- src/posting/app.py | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/posting/app.py b/src/posting/app.py index ae306485..248322b1 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -735,20 +735,25 @@ async def watch_collection_files(self) -> None: """Watching specific files within the collection directory.""" async for changes in awatch(self.collection.path): for change_type, file_name in changes: - if file_name.endswith(".py") and change_type in ( - Change.deleted, - Change.modified, - ): - # If a Python file was updated, then we want to clear - # the script module cache for the app so that modules - # are reloaded on the next request being sent. - # Without this, we'd hit the module cache and simply - # re-execute the previously cached module. - self.notify( - message="Reloaded scripts", - timeout=3, - ) - clear_module_cache() + if file_name.endswith(".py"): + if change_type in ( + Change.deleted, + Change.modified, + ): + # If a Python file was updated, then we want to clear + # the script module cache for the app so that modules + # are reloaded on the next request being sent. + # Without this, we'd hit the module cache and simply + # re-execute the previously cached module. + self.notify( + message="Reloaded scripts", + timeout=3, + ) + clear_module_cache() + elif change_type == Change.added: + # TODO - update the autocompletion + # of the available scripts. + pass def on_mount(self) -> None: self.jumper = Jumper( From d0644656f8c68140add315ef5c1178998706c739 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Tue, 24 Sep 2024 21:29:40 +0100 Subject: [PATCH 16/70] Begin script output --- src/posting/widgets/response/script_output.py | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/posting/widgets/response/script_output.py diff --git a/src/posting/widgets/response/script_output.py b/src/posting/widgets/response/script_output.py new file mode 100644 index 00000000..0bd7303c --- /dev/null +++ b/src/posting/widgets/response/script_output.py @@ -0,0 +1,28 @@ +"""Tab for displaying the output of a script. + +This could be test results, logs, or other output from pre-request or +post-response scripts. +""" + +from textual.app import ComposeResult +from textual.containers import VerticalScroll +from textual.widgets import RichLog, TabPane, TabbedContent + + +class ScriptOutput(VerticalScroll): + DEFAULT_CSS = """\ + ScriptOutput { + padding: 0 2; + } + """ + + def compose(self) -> ComposeResult: + # Tabs for test results, logs, etc. + with TabbedContent(id="script-output-tabs"): + with TabPane("Output"): + yield RichLog() + with TabPane("Logs"): + yield RichLog() + # TODO: Add tests tab + # with TabPane("Tests"): + # yield Label("Test results will appear here.") From 7193c38a618b9e880a2a5af68a38f5071c86a58b Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 25 Sep 2024 18:39:08 +0100 Subject: [PATCH 17/70] Watching and refreshing scripts, and initial UI skeleton for scripts in response section --- .coverage | Bin 53248 -> 53248 bytes src/posting/app.py | 46 +-- src/posting/config.py | 3 + src/posting/scripts.py | 74 ++++- .../widgets/request/request_scripts.py | 5 + src/posting/widgets/response/response_area.py | 3 + src/posting/widgets/response/script_output.py | 21 +- .../test_snapshots/TestConfig.test_config.svg | 240 +++++++-------- ...ghting_applied_from_custom_theme__json.svg | 238 +++++++-------- ...ighting_applied_from_custom_theme__url.svg | 210 ++++++------- ...ple.test_theme_sensible_defaults__json.svg | 236 +++++++-------- ...mple.test_theme_sensible_defaults__url.svg | 210 ++++++------- ...estHelpScreen.test_help_screen_appears.svg | 277 +++++++++--------- .../TestJumpMode.test_click_switch.svg | 176 +++++------ .../TestJumpMode.test_focus_switch.svg | 180 ++++++------ .../TestJumpMode.test_loads.svg | 190 ++++++------ ...st.test_request_loaded_into_view__auth.svg | 266 ++++++++--------- ...st.test_request_loaded_into_view__body.svg | 240 +++++++-------- ...test_request_loaded_into_view__headers.svg | 220 +++++++------- ...test_request_loaded_into_view__options.svg | 264 ++++++++--------- ...request_loaded_into_view__query_params.svg | 236 +++++++-------- ...ethodSelection.test_select_post_method.svg | 180 ++++++------ ...uest.test_dialog_loads_and_can_be_used.svg | 197 ++++++------- ..._tree_correctly_and_notification_shown.svg | 176 +++++------ ...elected__dialog_is_prefilled_correctly.svg | 197 ++++++------- .../TestSendRequest.test_send_request.svg | 240 +++++++-------- ...UrlBar.test_dropdown_appears_on_typing.svg | 192 ++++++------ ...down_completion_selected_via_enter_key.svg | 190 ++++++------ ...opdown_completion_selected_via_tab_key.svg | 190 ++++++------ ...UrlBar.test_dropdown_filters_on_typing.svg | 190 ++++++------ ...erfaceShortcuts.test_expand_then_reset.svg | 180 ++++++------ ...Shortcuts.test_hide_collection_browser.svg | 172 +++++------ ...solved_variables_highlight_and_preview.svg | 194 ++++++------ ....test_unresolved_variables_highlighted.svg | 230 +++++++-------- tests/sample-collections/echo.posting.yaml | 1 + tests/sample-collections/scripts/my_script.py | 12 +- tests/sample-configs/custom_theme.yaml | 1 + tests/sample-configs/custom_theme2.yaml | 3 +- tests/sample-configs/general.yaml | 3 +- tests/sample-configs/modified_config.yaml | 3 +- 40 files changed, 2985 insertions(+), 2901 deletions(-) diff --git a/.coverage b/.coverage index 43ce0bf487931f29d1e0ba82972b65febca601f2..bc6aff2a99d2b1f6a35bf34f173bbac0edf3ad60 100644 GIT binary patch delta 3293 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 CnV6dZ delta 3166 zcmaKu3slrq9>?#0?jQc|dk5q(z`Q^i-os-MrBK{chT?#`sYi{M2osXLV(@_mgIoP4 z4aK@`+isgt=j=IZZMw0Qn=N3i+e0(Y**b?kCFrrl9t-AHqQ=bLx#mWXv-ceC=lA{n z?t8wRnVx>w(+>~xi(sM9ON2#^viG%Dw4K_ov>Z)QKUI&Z�T!+toznTjih10cEGM zMk!K6c|_hXZOnKKiEOBF7IOqSY0Wv$uMQCnZz z5!x>+odlLT`Lr9yVY3xaePc&!J1sg>Nlj@smqPkz?;u08Po|5wEOQ{Zb>@>ad%WJ- z22bcsvS*XxWjS0DX*!fM?KRDf_4Q4mE6uh+P!_6?Ys)mw zNu$i#PZRh1~#u zg7@N1T!GG^H}Of-F8o8;C5$6Un?whd1!@w0UU*K}t$l#!qDQnN*o3B0x$?fYOS@Bj z9i?fx%Cx#!HmQphN&c67K<<=Fq>rUPOWjhM_^9}Iah;eUexrUSt<+TYS!JzqP}IQ9 zHV|)=1yZrvVlRw`h1|?Tes93}cDR@$T_xtQdC71&NA{H@Qa28-woo^YuFmK4b72EH zw>pLTPvBiQgq7UA#K`A;S5a>IE)O<_MoKsBmP63mbS|6pRhXiG;x=b!bnRWq)MzrF zbyEydk?DdPLlr#3V;N3ZOCr`7kA30Qr9|OC!~HWpk-y5A9RPAnhGw;x3mZ zIRW1KgL}_#*&MR4B8QtzS}SbSYJC-Hd}1nGMK2H?@ne(O$(NNTYA`j-mIRk_L~&br zYYz0V6P3D+yd?uxFtOdO@MaslEwl`I+AZ)2DR2c7LvGB)llLkUsnfo!oWq;wyR(9` zOypzdK`#@_%WPZ>X|2i%i#Edr9C@b96cZH(=l$Rk-#M%*Hp!=zg93Ra)b7x7H3zl8 z@8y;1UbRK_sLRw8HC{C;lgb6~wuD!3lBopm`_O$kxw(+LBLL9IdDx!AAR+Myy-Fb*oB_$TWIsrzrgmfuQsl|_zE{1^gVS5C#S+90CI+X@bteIyah(q z7d^0s=cFS2ZrX1noe$6V3I0eL8}lv;JTi!WL`9_YLJA+{7ipND`f4xS*YXQMH>EAA z&FBxK>7?XuPQbw1V<7n2)i}Y=hgO(#ii`9^8aZZL#lyj1@YzE)(AI6iegjR~le)Rf zXRcm;eC!LW;^%0_lo-L3>hWi1P$o`^5_tBup7VyxmE|mo*r>~FJoEC*d*^QNNe!q=>+AqdS;YS-tRz&!o4}RGu;5I_sM_b2N}VHMo!iJg6Rq;d(1AAJ#*4nlNgm(X!q|qZsv_6}KeviTXw=ZdbYwUmjogWb;VzlkXM;n_LMWzWk?` zxRIBq-yFwWtbPw2lOtDG(sy932iO5P&e2^OX$48LP2WI+MdE~OwA^v*wI}+<&z)^5 z)bCH&vjZlz#(~p5lb|=yAx5Fa(5icWV!GE({JiPBGfj7J3pL&6KQdj&c>m9IBh+-U zx~D#L1-``=*#mM0Yd|F!9s;1}kRs}Jv=Rv&PZ=Wh^)z%C-pO}Svt4;7h5HCgVR|hu zNhst#3n!HqjPgA^Fof<;ADT4-Smf}>(3#~08uKq>$v=xm zQ7-3sFlF{f(D;_zi7USg{Ucqxe*O4!*fCt z_ns6|y+@FX@6@-3KJqyx@|QhsFN(CP?3S2a!fx9D|dc**0naqQaGG@WujH&P;#@X5^`xu>Y4`U|mWz6uwhgpygcQK~Hos21v`NH6UI@8JULB=`o z0mdZwYsN&lgV7Fq7;W&zi&|h8(`I-dV*=dH7!S8Gn&4K(ideXX1u<|lV>H~vI173i zBVjvZ1iY8g2-_GjY-L2Sg;9gej4EtmRN%%J`{|F ComposeResult: yield Footer(show_command_palette=False) def get_and_run_script( - self, script_path: str, default_function_name: str, *args: Any + self, path_to_script: str, default_function_name: str, *args: Any ) -> None: """ Get and run a function from a script. @@ -191,23 +191,24 @@ def get_and_run_script( default_function_name: Default function name to use if not specified in the path. *args: Arguments to pass to the script function. """ - full_path = self.collection.path / Path(script_path) - path_name_parts = full_path.name.split(":") + script_path = Path(path_to_script) + path_name_parts = script_path.name.split(":") if len(path_name_parts) == 2: - script_path, function_name = path_name_parts + script_path = Path(path_name_parts[0]) + function_name = path_name_parts[1] else: - script_path = path_name_parts[0] function_name = default_function_name - full_path = full_path.parent / script_path try: - script_function = execute_script(full_path, function_name) + script_function = execute_script( + self.collection.path, script_path, function_name + ) except Exception as e: log.error(f"Error loading script {function_name}: {e}") self.notify( severity="error", title=f"Error loading script {function_name}", - message=f"The script at {full_path} could not be loaded.", + message=f"The script at {script_path} could not be loaded: {e}", ) return @@ -226,11 +227,11 @@ def get_and_run_script( message=f"{e}", ) else: - log.warning(f"{function_name.capitalize()} script not found: {full_path}") + log.warning(f"{function_name.capitalize()} script not found: {script_path}") self.notify( severity="error", title=f"{function_name.capitalize()} script not found", - message=f"The {function_name} script at {full_path} could not be found.", + message=f"The {function_name} script at {script_path} could not be found.", ) async def send_request(self) -> None: @@ -287,6 +288,7 @@ async def send_request(self) -> None: # If there's an associated pre-request script, run it. if on_request := request_model.scripts.on_request: + print("running on_request script...") self.get_and_run_script(on_request, "on_request", request) response = await client.send( @@ -297,6 +299,7 @@ async def send_request(self) -> None: self.post_message(HttpResponseReceived(response)) if on_response := request_model.scripts.on_response: + print("running on_response script...") self.get_and_run_script(on_response, "on_response", response) except httpx.ConnectTimeout as connect_timeout: @@ -734,8 +737,8 @@ async def watch_environment_files(self) -> None: async def watch_collection_files(self) -> None: """Watching specific files within the collection directory.""" async for changes in awatch(self.collection.path): - for change_type, file_name in changes: - if file_name.endswith(".py"): + for change_type, file_path in changes: + if file_path.endswith(".py"): if change_type in ( Change.deleted, Change.modified, @@ -745,12 +748,15 @@ async def watch_collection_files(self) -> None: # are reloaded on the next request being sent. # Without this, we'd hit the module cache and simply # re-execute the previously cached module. + uncache_module(file_path) + file_path_object = Path(file_path) + file_name = file_path_object.name self.notify( - message="Reloaded scripts", - timeout=3, + f"Reloaded {file_name!r}", + title="Script reloaded", + timeout=2, ) - clear_module_cache() - elif change_type == Change.added: + if change_type in (Change.added, Change.deleted): # TODO - update the autocompletion # of the available scripts. pass @@ -771,7 +777,8 @@ def on_mount(self) -> None: "--content-tab-response-body-pane": "a", "--content-tab-response-headers-pane": "s", "--content-tab-response-cookies-pane": "d", - "--content-tab-response-trace-pane": "f", + "--content-tab-response-scripts-pane": "f", + "--content-tab-response-trace-pane": "g", }, screen=self.screen, ) @@ -780,7 +787,8 @@ def on_mount(self) -> None: if self.settings.watch_env_files: self.watch_environment_files() - self.watch_collection_files() + if self.settings.watch_collection_files: + self.watch_collection_files() def get_default_screen(self) -> MainScreen: self.main_screen = MainScreen( diff --git a/src/posting/config.py b/src/posting/config.py index 7d3eeec0..6b9cfb59 100644 --- a/src/posting/config.py +++ b/src/posting/config.py @@ -128,6 +128,9 @@ class Settings(BaseSettings): watch_env_files: bool = Field(default=True) """If enabled, automatically reload environment files when they change.""" + watch_collection_files: bool = Field(default=True) + """If enabled, automatically reload collection files when they change.""" + text_input: TextInputSettings = Field(default_factory=TextInputSettings) """General configuration for inputs and text area widgets.""" diff --git a/src/posting/scripts.py b/src/posting/scripts.py index eb38a6c2..a5df3303 100644 --- a/src/posting/scripts.py +++ b/src/posting/scripts.py @@ -3,14 +3,43 @@ import sys from pathlib import Path from types import ModuleType -from typing import Callable, Any +from typing import TYPE_CHECKING, Callable, Any import threading +from httpx import Request, Response +from textual.app import App +from textual.notifications import SeverityLevel + +if TYPE_CHECKING: + from posting.app import Posting + # Global cache for loaded modules _MODULE_CACHE: dict[str, ModuleType] = {} _CACHE_LOCK = threading.Lock() +# class Context: +# def __init__(self, app: Posting): +# self._app: "Posting" = app +# self.request: Request | None = None +# self.response: Response | None = None + +# def notify( +# self, +# message: str, +# *, +# title: str = "", +# severity: SeverityLevel = "information", +# timeout: float | None = None, +# ): +# self._app.notify( +# message=message, +# title=title, +# severity=severity, +# timeout=timeout, +# ) + + def clear_module_cache(): """ Clear the global module cache in a thread-safe manner. @@ -19,32 +48,44 @@ def clear_module_cache(): _MODULE_CACHE.clear() -def execute_script(script_path: Path, function_name: str) -> Callable[..., Any] | None: +def execute_script( + collection_root: Path, script_path: Path, function_name: str +) -> Callable[..., Any] | None: """ Execute a Python script from the given path and extract a specified function. Uses caching to prevent multiple executions of the same script. Args: - script_path: Path to the Python script file. + collection_root: Path to the root of the collection. + script_path: Path to the Python script file, relative to the collection root. function_name: Name of the function to extract from the script. Returns: The extracted function if found, None otherwise. Raises: - FileNotFoundError: If the script file does not exist. + FileNotFoundError: If the script file does not exist or is outside the collection. Exception: If there's an error during script execution. """ - if not script_path.is_file(): - raise FileNotFoundError(f"Script not found: {script_path}") + # Ensure the script_path is relative to the collection root + full_script_path = (collection_root / script_path).resolve() - script_dir = script_path.parent.resolve() - module_name = script_path.stem - module_key = str(script_path.resolve()) + # Check if the script is within the collection root + if not full_script_path.is_relative_to(collection_root): + raise FileNotFoundError( + f"Script path {script_path} is outside the collection root" + ) + + if not full_script_path.is_file(): + raise FileNotFoundError(f"Script not found: {full_script_path}") + + script_dir = full_script_path.parent + module_name = full_script_path.stem + module_key = str(full_script_path) try: sys.path.insert(0, str(script_dir)) - module = _import_script_as_module(script_path, module_name, module_key) + module = _import_script_as_module(full_script_path, module_name, module_key) return _validate_function(getattr(module, function_name, None)) finally: sys.path.remove(str(script_dir)) @@ -88,3 +129,16 @@ def _validate_function(func: Any) -> Callable[..., Any] | None: The function if it's callable, None otherwise. """ return func if callable(func) else None + + +def uncache_module(script_path: str) -> None: + """ + Clear a specific module from the global module cache. + + Args: + script_path: Path to the script file. + """ + module_key = str(script_path) + with _CACHE_LOCK: + if module_key in _MODULE_CACHE: + del _MODULE_CACHE[module_key] diff --git a/src/posting/widgets/request/request_scripts.py b/src/posting/widgets/request/request_scripts.py index 1198a9b4..68633bc0 100644 --- a/src/posting/widgets/request/request_scripts.py +++ b/src/posting/widgets/request/request_scripts.py @@ -11,6 +11,7 @@ from posting.collection import Scripts from posting.config import SETTINGS +from posting.scripts import uncache_module class ScriptPathInput(Input): @@ -104,6 +105,10 @@ def _open_with_command(self, command_name: str, command_setting: str) -> None: message=f"The command [b]{command_string}[/b] failed to run.", ) + # We're back in Posting, uncache the edited module as it may have + # been updated, and notify the user that we're aware of the change. + uncache_module(str(script_path)) + def action_open_in_editor(self) -> None: """ Open the script in the configured editor. diff --git a/src/posting/widgets/response/response_area.py b/src/posting/widgets/response/response_area.py index ceb075e2..62c53463 100644 --- a/src/posting/widgets/response/response_area.py +++ b/src/posting/widgets/response/response_area.py @@ -3,6 +3,7 @@ from posting.config import SETTINGS from posting.widgets.response.response_trace import ResponseTrace +from posting.widgets.response.script_output import ScriptOutput from posting.widgets.tabbed_content import PostingTabbedContent from posting.widgets.text_area import TextAreaFooter, TextEditor from posting.widgets.response.cookies_table import CookiesTable @@ -76,6 +77,8 @@ def compose(self) -> ComposeResult: yield ResponseHeadersTable() with TabPane("Cookies", id="response-cookies-pane"): yield CookiesTable() + with TabPane("Scripts", id="response-scripts-pane"): + yield ScriptOutput() with TabPane("Trace", id="response-trace-pane"): yield ResponseTrace() diff --git a/src/posting/widgets/response/script_output.py b/src/posting/widgets/response/script_output.py index 0bd7303c..8de73fe5 100644 --- a/src/posting/widgets/response/script_output.py +++ b/src/posting/widgets/response/script_output.py @@ -5,8 +5,8 @@ """ from textual.app import ComposeResult -from textual.containers import VerticalScroll -from textual.widgets import RichLog, TabPane, TabbedContent +from textual.containers import Horizontal, Vertical, VerticalScroll +from textual.widgets import Label class ScriptOutput(VerticalScroll): @@ -17,12 +17,11 @@ class ScriptOutput(VerticalScroll): """ def compose(self) -> ComposeResult: - # Tabs for test results, logs, etc. - with TabbedContent(id="script-output-tabs"): - with TabPane("Output"): - yield RichLog() - with TabPane("Logs"): - yield RichLog() - # TODO: Add tests tab - # with TabPane("Tests"): - # yield Label("Test results will appear here.") + with Horizontal(): + with Vertical(): + yield Label("Pre-request") + yield Label("Status") + + with Vertical(): + yield Label("Post-request") + yield Label("Status") diff --git a/tests/__snapshots__/test_snapshots/TestConfig.test_config.svg b/tests/__snapshots__/test_snapshots/TestConfig.test_config.svg index 0b66de6f..073ed7cf 100644 --- a/tests/__snapshots__/test_snapshots/TestConfig.test_config.svg +++ b/tests/__snapshots__/test_snapshots/TestConfig.test_config.svg @@ -19,216 +19,216 @@ font-weight: 700; } - .terminal-143488697-matrix { + .terminal-3868227495-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-143488697-title { + .terminal-3868227495-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-143488697-r1 { fill: #c5c8c6 } -.terminal-143488697-r2 { fill: #15111e;text-decoration: underline; } -.terminal-143488697-r3 { fill: #15111e } -.terminal-143488697-r4 { fill: #43365c } -.terminal-143488697-r5 { fill: #ff69b4 } -.terminal-143488697-r6 { fill: #9393a3 } -.terminal-143488697-r7 { fill: #a684e8 } -.terminal-143488697-r8 { fill: #e1e1e6 } -.terminal-143488697-r9 { fill: #00fa9a } -.terminal-143488697-r10 { fill: #efe3fb } -.terminal-143488697-r11 { fill: #9f9fa5 } -.terminal-143488697-r12 { fill: #632e53 } -.terminal-143488697-r13 { fill: #dfdfe1 } -.terminal-143488697-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-143488697-r15 { fill: #002014;font-weight: bold } -.terminal-143488697-r16 { fill: #0ea5e9 } -.terminal-143488697-r17 { fill: #58d1eb;font-weight: bold } -.terminal-143488697-r18 { fill: #6a6a74 } -.terminal-143488697-r19 { fill: #252532 } -.terminal-143488697-r20 { fill: #22c55e } -.terminal-143488697-r21 { fill: #0f0f1f } -.terminal-143488697-r22 { fill: #ede2f7 } -.terminal-143488697-r23 { fill: #e1e0e4 } -.terminal-143488697-r24 { fill: #a2a2a8;font-weight: bold } -.terminal-143488697-r25 { fill: #210d17 } -.terminal-143488697-r26 { fill: #e0e0e2 } -.terminal-143488697-r27 { fill: #8b8b93 } -.terminal-143488697-r28 { fill: #8b8b93;font-weight: bold } -.terminal-143488697-r29 { fill: #e9e1f1 } -.terminal-143488697-r30 { fill: #6f6f78 } -.terminal-143488697-r31 { fill: #00b85f } -.terminal-143488697-r32 { fill: #e2e0e5 } -.terminal-143488697-r33 { fill: #f92672;font-weight: bold } -.terminal-143488697-r34 { fill: #ae81ff } -.terminal-143488697-r35 { fill: #e3e3e8;font-weight: bold } -.terminal-143488697-r36 { fill: #552956 } -.terminal-143488697-r37 { fill: #e6db74 } -.terminal-143488697-r38 { fill: #ef4444 } -.terminal-143488697-r39 { fill: #f59e0b } -.terminal-143488697-r40 { fill: #737387 } -.terminal-143488697-r41 { fill: #918d9d } -.terminal-143488697-r42 { fill: #87878f } -.terminal-143488697-r43 { fill: #a2a2a8 } -.terminal-143488697-r44 { fill: #30303b } -.terminal-143488697-r45 { fill: #00fa9a;font-weight: bold } -.terminal-143488697-r46 { fill: #ff7ec8;font-weight: bold } -.terminal-143488697-r47 { fill: #dbdbdd } + .terminal-3868227495-r1 { fill: #c5c8c6 } +.terminal-3868227495-r2 { fill: #15111e;text-decoration: underline; } +.terminal-3868227495-r3 { fill: #15111e } +.terminal-3868227495-r4 { fill: #43365c } +.terminal-3868227495-r5 { fill: #ff69b4 } +.terminal-3868227495-r6 { fill: #9393a3 } +.terminal-3868227495-r7 { fill: #a684e8 } +.terminal-3868227495-r8 { fill: #e1e1e6 } +.terminal-3868227495-r9 { fill: #00fa9a } +.terminal-3868227495-r10 { fill: #efe3fb } +.terminal-3868227495-r11 { fill: #9f9fa5 } +.terminal-3868227495-r12 { fill: #632e53 } +.terminal-3868227495-r13 { fill: #dfdfe1 } +.terminal-3868227495-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-3868227495-r15 { fill: #002014;font-weight: bold } +.terminal-3868227495-r16 { fill: #0ea5e9 } +.terminal-3868227495-r17 { fill: #58d1eb;font-weight: bold } +.terminal-3868227495-r18 { fill: #6a6a74 } +.terminal-3868227495-r19 { fill: #252532 } +.terminal-3868227495-r20 { fill: #22c55e } +.terminal-3868227495-r21 { fill: #0f0f1f } +.terminal-3868227495-r22 { fill: #ede2f7 } +.terminal-3868227495-r23 { fill: #e1e0e4 } +.terminal-3868227495-r24 { fill: #a2a2a8;font-weight: bold } +.terminal-3868227495-r25 { fill: #210d17 } +.terminal-3868227495-r26 { fill: #e0e0e2 } +.terminal-3868227495-r27 { fill: #8b8b93 } +.terminal-3868227495-r28 { fill: #8b8b93;font-weight: bold } +.terminal-3868227495-r29 { fill: #e9e1f1 } +.terminal-3868227495-r30 { fill: #6f6f78 } +.terminal-3868227495-r31 { fill: #00b85f } +.terminal-3868227495-r32 { fill: #e2e0e5 } +.terminal-3868227495-r33 { fill: #f92672;font-weight: bold } +.terminal-3868227495-r34 { fill: #ae81ff } +.terminal-3868227495-r35 { fill: #e3e3e8;font-weight: bold } +.terminal-3868227495-r36 { fill: #552956 } +.terminal-3868227495-r37 { fill: #e6db74 } +.terminal-3868227495-r38 { fill: #ef4444 } +.terminal-3868227495-r39 { fill: #f59e0b } +.terminal-3868227495-r40 { fill: #737387 } +.terminal-3868227495-r41 { fill: #918d9d } +.terminal-3868227495-r42 { fill: #87878f } +.terminal-3868227495-r43 { fill: #a2a2a8 } +.terminal-3868227495-r44 { fill: #30303b } +.terminal-3868227495-r45 { fill: #00fa9a;font-weight: bold } +.terminal-3868227495-r46 { fill: #ff7ec8;font-weight: bold } +.terminal-3868227495-r47 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -GEThttps://jsonplaceholder.typicode.com/posts                                        ■■■■■■■ Send  - -╭─ Collection ───────────────────────╮╭─────────────────────────── Request ─╮╭───────────────── Response  200 OK ─╮ -GET echo││HeadersBodyQueryAuthInfoSBodyHeadersCookiesTrace -GET get random user││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││ Content-Type     application/json   1  [ -▼ jsonplaceholder/││ Referer          https://example.c  2    {                           -▼ posts/││ Accept-Encoding  gzip               3  "userId"1,              -█ GET get all││ Cache-Control    no-cache           4  "id"1,                  -GET get one││  5  "title""sunt aut  -POS create││facere repellat provident  -DEL delete a post││occaecati excepturi optio  -▼ comments/││reprehenderit",               -GET get comments││  6  "body""quia et  -GET get comments (via param)││suscipit\nsuscipit  -PUT edit a comment││recusandae consequuntur  -▼ todos/││expedita et  -GET get all││cum\nreprehenderit  -GET get one││molestiae ut ut quas  -▼ users/││totam\nnostrum rerum est  -GET get a user││autem sunt rem eveniet  -GET get all users││architecto" -POS create a user││  7    },                          -PUT update a user││  8    {                           -DEL delete a user││  9  "userId"1,              -││ 10  "id"2,                  -││ 11  "title""qui est esse" -││Name 12  "body""est rerum  -│────────────────────────────────────││Valuetempore vitae\nsequi sint  -Retrieve all posts││ Add header 1:1read-onlyJSONWrap X -╰─────────────── sample-collections ─╯╰─────────────────────────────────────╯╰─────────────────────────────────────╯ - f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  + + + + +GEThttps://jsonplaceholder.typicode.com/posts                                        ■■■■■■■ Send  + +╭─ Collection ───────────────────────╮╭─────────────────────────── Request ─╮╭───────────────── Response  200 OK ─╮ +GET echo││HeadersBodyQueryAuthInfoSBodyHeadersCookiesScriptsTra +GET get random user││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││ Content-Type     application/json   1  [ +▼ jsonplaceholder/││ Referer          https://example.c  2    {                           +▼ posts/││ Accept-Encoding  gzip               3  "userId"1,              +█ GET get all││ Cache-Control    no-cache           4  "id"1,                  +GET get one││  5  "title""sunt aut  +POS create││facere repellat provident  +DEL delete a post││occaecati excepturi optio  +▼ comments/││reprehenderit",               +GET get comments││  6  "body""quia et  +GET get comments (via param)││suscipit\nsuscipit  +PUT edit a comment││recusandae consequuntur  +▼ todos/││expedita et  +GET get all││cum\nreprehenderit  +GET get one││molestiae ut ut quas  +▼ users/││totam\nnostrum rerum est  +GET get a user││autem sunt rem eveniet  +GET get all users││architecto" +POS create a user││  7    },                          +PUT update a user││  8    {                           +DEL delete a user││  9  "userId"1,              +││ 10  "id"2,                  +││ 11  "title""qui est esse" +││Name 12  "body""est rerum  +│────────────────────────────────────││Valuetempore vitae\nsequi sint  +Retrieve all posts││ Add header 1:1read-onlyJSONWrap X +╰─────────────── sample-collections ─╯╰─────────────────────────────────────╯╰─────────────────────────────────────╯ + f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  diff --git a/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__json.svg b/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__json.svg index 52aefef6..fe5bbcb5 100644 --- a/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__json.svg +++ b/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__json.svg @@ -19,211 +19,211 @@ font-weight: 700; } - .terminal-413142848-matrix { + .terminal-2014149565-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-413142848-title { + .terminal-2014149565-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-413142848-r1 { fill: #1e1f1f } -.terminal-413142848-r2 { fill: #c5c8c6 } -.terminal-413142848-r3 { fill: #c47fe0 } -.terminal-413142848-r4 { fill: #e4f0f9;text-decoration: underline; } -.terminal-413142848-r5 { fill: #e4f0f9 } -.terminal-413142848-r6 { fill: #acd3ed } -.terminal-413142848-r7 { fill: #9b59b6;font-weight: bold;text-decoration: underline; } -.terminal-413142848-r8 { fill: #de4e88;text-decoration: underline; } -.terminal-413142848-r9 { fill: #3498db;font-style: italic; } -.terminal-413142848-r10 { fill: #181919 } -.terminal-413142848-r11 { fill: #051a0e } -.terminal-413142848-r12 { fill: #5e6060 } -.terminal-413142848-r13 { fill: #cfbbdc } -.terminal-413142848-r14 { fill: #9b59b6 } -.terminal-413142848-r15 { fill: #1e1f1f;font-weight: bold } -.terminal-413142848-r16 { fill: #707273 } -.terminal-413142848-r17 { fill: #707273;font-weight: bold } -.terminal-413142848-r18 { fill: #929495 } -.terminal-413142848-r19 { fill: #58d1eb;font-weight: bold } -.terminal-413142848-r20 { fill: #007129 } -.terminal-413142848-r21 { fill: #0ea5e9 } -.terminal-413142848-r22 { fill: #d6d9da } -.terminal-413142848-r23 { fill: #1d1d1e } -.terminal-413142848-r24 { fill: #5a5c5c } -.terminal-413142848-r25 { fill: #181a1a;font-weight: bold } -.terminal-413142848-r26 { fill: #1a1a1a } -.terminal-413142848-r27 { fill: #ef4444 } -.terminal-413142848-r28 { fill: #ecf0f1;font-style: italic; } -.terminal-413142848-r29 { fill: #1e1f1f;font-style: italic; } -.terminal-413142848-r30 { fill: #8e44ad;font-weight: bold;font-style: italic; } -.terminal-413142848-r31 { fill: #27ae60;font-style: italic; } -.terminal-413142848-r32 { fill: #8e44ad;font-weight: bold } -.terminal-413142848-r33 { fill: #27ae60 } -.terminal-413142848-r34 { fill: #e67e22 } -.terminal-413142848-r35 { fill: #f59e0b } -.terminal-413142848-r36 { fill: #767878 } -.terminal-413142848-r37 { fill: #cbcece } -.terminal-413142848-r38 { fill: #27ae60;font-weight: bold } -.terminal-413142848-r39 { fill: #cccfd0;font-weight: bold } -.terminal-413142848-r40 { fill: #cccfd0 } -.terminal-413142848-r41 { fill: #5b5d5e } -.terminal-413142848-r42 { fill: #e0e4e5 } -.terminal-413142848-r43 { fill: #b386c7 } -.terminal-413142848-r44 { fill: #22c55e } -.terminal-413142848-r45 { fill: #595a5b } -.terminal-413142848-r46 { fill: #848787 } -.terminal-413142848-r47 { fill: #dbdfe0 } -.terminal-413142848-r48 { fill: #62c18b;font-weight: bold } -.terminal-413142848-r49 { fill: #af6cca;font-weight: bold } -.terminal-413142848-r50 { fill: #232424 } + .terminal-2014149565-r1 { fill: #1e1f1f } +.terminal-2014149565-r2 { fill: #c5c8c6 } +.terminal-2014149565-r3 { fill: #c47fe0 } +.terminal-2014149565-r4 { fill: #e4f0f9;text-decoration: underline; } +.terminal-2014149565-r5 { fill: #e4f0f9 } +.terminal-2014149565-r6 { fill: #acd3ed } +.terminal-2014149565-r7 { fill: #9b59b6;font-weight: bold;text-decoration: underline; } +.terminal-2014149565-r8 { fill: #de4e88;text-decoration: underline; } +.terminal-2014149565-r9 { fill: #3498db;font-style: italic; } +.terminal-2014149565-r10 { fill: #181919 } +.terminal-2014149565-r11 { fill: #051a0e } +.terminal-2014149565-r12 { fill: #5e6060 } +.terminal-2014149565-r13 { fill: #cfbbdc } +.terminal-2014149565-r14 { fill: #9b59b6 } +.terminal-2014149565-r15 { fill: #1e1f1f;font-weight: bold } +.terminal-2014149565-r16 { fill: #707273 } +.terminal-2014149565-r17 { fill: #707273;font-weight: bold } +.terminal-2014149565-r18 { fill: #929495 } +.terminal-2014149565-r19 { fill: #58d1eb;font-weight: bold } +.terminal-2014149565-r20 { fill: #007129 } +.terminal-2014149565-r21 { fill: #0ea5e9 } +.terminal-2014149565-r22 { fill: #d6d9da } +.terminal-2014149565-r23 { fill: #1d1d1e } +.terminal-2014149565-r24 { fill: #5a5c5c } +.terminal-2014149565-r25 { fill: #181a1a;font-weight: bold } +.terminal-2014149565-r26 { fill: #1a1a1a } +.terminal-2014149565-r27 { fill: #ef4444 } +.terminal-2014149565-r28 { fill: #ecf0f1;font-style: italic; } +.terminal-2014149565-r29 { fill: #1e1f1f;font-style: italic; } +.terminal-2014149565-r30 { fill: #8e44ad;font-weight: bold;font-style: italic; } +.terminal-2014149565-r31 { fill: #27ae60;font-style: italic; } +.terminal-2014149565-r32 { fill: #8e44ad;font-weight: bold } +.terminal-2014149565-r33 { fill: #27ae60 } +.terminal-2014149565-r34 { fill: #e67e22 } +.terminal-2014149565-r35 { fill: #f59e0b } +.terminal-2014149565-r36 { fill: #767878 } +.terminal-2014149565-r37 { fill: #cbcece } +.terminal-2014149565-r38 { fill: #27ae60;font-weight: bold } +.terminal-2014149565-r39 { fill: #cccfd0;font-weight: bold } +.terminal-2014149565-r40 { fill: #cccfd0 } +.terminal-2014149565-r41 { fill: #5b5d5e } +.terminal-2014149565-r42 { fill: #e0e4e5 } +.terminal-2014149565-r43 { fill: #b386c7 } +.terminal-2014149565-r44 { fill: #22c55e } +.terminal-2014149565-r45 { fill: #595a5b } +.terminal-2014149565-r46 { fill: #848787 } +.terminal-2014149565-r47 { fill: #dbdfe0 } +.terminal-2014149565-r48 { fill: #62c18b;font-weight: bold } +.terminal-2014149565-r49 { fill: #af6cca;font-weight: bold } +.terminal-2014149565-r50 { fill: #232424 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                                        - -POSThttps://jsonplaceholder.typicode.com/posts                              Send  - -╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ -▼ posts/HeadersBodyQueryAuthInfoScriptsOptions -GET get all━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get oneRaw (json, text, etc.) -█ POS create1  { -DEL delete a post2  "title""foo",                                          -▼ comments/3  "body""bar",                                           -GET get comments4  "userId"1 -GET get comments (via pa5  }                                                          -PUT edit a comment -▼ todos/2:1JSONWrap X -GET get all╰───────────────────────────────────────────────────────────────╯ -GET get one│╭──────────────────────────────────────────────────── Response ─╮ -▼ users/││BodyHeadersCookiesTrace -GET get a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get all users││ -POS create a user││ -PUT update a user││ -DEL delete a user││ -││ -││ -││ -│─────────────────────────────││ -Create a new post││1:1read-onlyJSONWrap X -╰─────────── jsonplaceholder ─╯╰───────────────────────────────────────────────────────────────╯ - f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Hel + + + + +Posting                                                                                        + +POSThttps://jsonplaceholder.typicode.com/posts                              Send  + +╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ +▼ posts/HeadersBodyQueryAuthInfoScriptsOptions +GET get all━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get oneRaw (json, text, etc.) +█ POS create1  { +DEL delete a post2  "title""foo",                                          +▼ comments/3  "body""bar",                                           +GET get comments4  "userId"1 +GET get comments (via pa5  }                                                          +PUT edit a comment +▼ todos/2:1JSONWrap X +GET get all╰───────────────────────────────────────────────────────────────╯ +GET get one│╭──────────────────────────────────────────────────── Response ─╮ +▼ users/││BodyHeadersCookiesScriptsTrace +GET get a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get all users││ +POS create a user││ +PUT update a user││ +DEL delete a user││ +││ +││ +││ +│─────────────────────────────││ +Create a new post││1:1read-onlyJSONWrap X +╰─────────── jsonplaceholder ─╯╰───────────────────────────────────────────────────────────────╯ + f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Hel diff --git a/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__url.svg b/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__url.svg index 292b06b5..c0ed87d9 100644 --- a/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__url.svg +++ b/tests/__snapshots__/test_snapshots/TestCustomThemeComplex.test_highlighting_applied_from_custom_theme__url.svg @@ -19,197 +19,197 @@ font-weight: 700; } - .terminal-33848362-matrix { + .terminal-280488103-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-33848362-title { + .terminal-280488103-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-33848362-r1 { fill: #1e1f1f } -.terminal-33848362-r2 { fill: #c5c8c6 } -.terminal-33848362-r3 { fill: #c47fe0 } -.terminal-33848362-r4 { fill: #e4f0f9;text-decoration: underline; } -.terminal-33848362-r5 { fill: #e4f0f9 } -.terminal-33848362-r6 { fill: #acd3ed } -.terminal-33848362-r7 { fill: #9b59b6;font-weight: bold;text-decoration: underline; } -.terminal-33848362-r8 { fill: #de4e88;text-decoration: underline; } -.terminal-33848362-r9 { fill: #3498db;font-style: italic; } -.terminal-33848362-r10 { fill: #181919 } -.terminal-33848362-r11 { fill: #1a1a1a } -.terminal-33848362-r12 { fill: #051a0e } -.terminal-33848362-r13 { fill: #5e6060 } -.terminal-33848362-r14 { fill: #cfbbdc } -.terminal-33848362-r15 { fill: #9b59b6 } -.terminal-33848362-r16 { fill: #1e1f1f;font-weight: bold } -.terminal-33848362-r17 { fill: #0ea5e9 } -.terminal-33848362-r18 { fill: #929495 } -.terminal-33848362-r19 { fill: #58d1eb;font-weight: bold } -.terminal-33848362-r20 { fill: #181a1a;font-weight: bold } -.terminal-33848362-r21 { fill: #c3a4d3 } -.terminal-33848362-r22 { fill: #1d1d1e } -.terminal-33848362-r23 { fill: #5a5c5c } -.terminal-33848362-r24 { fill: #d9dee1 } -.terminal-33848362-r25 { fill: #cccfd0;font-weight: bold } -.terminal-33848362-r26 { fill: #cccfd0 } -.terminal-33848362-r27 { fill: #5b5d5e } -.terminal-33848362-r28 { fill: #e0e4e5 } -.terminal-33848362-r29 { fill: #b386c7 } -.terminal-33848362-r30 { fill: #767878 } -.terminal-33848362-r31 { fill: #595a5b } -.terminal-33848362-r32 { fill: #848787 } -.terminal-33848362-r33 { fill: #dbdfe0 } -.terminal-33848362-r34 { fill: #62c18b;font-weight: bold } -.terminal-33848362-r35 { fill: #af6cca;font-weight: bold } -.terminal-33848362-r36 { fill: #232424 } + .terminal-280488103-r1 { fill: #1e1f1f } +.terminal-280488103-r2 { fill: #c5c8c6 } +.terminal-280488103-r3 { fill: #c47fe0 } +.terminal-280488103-r4 { fill: #e4f0f9;text-decoration: underline; } +.terminal-280488103-r5 { fill: #e4f0f9 } +.terminal-280488103-r6 { fill: #acd3ed } +.terminal-280488103-r7 { fill: #9b59b6;font-weight: bold;text-decoration: underline; } +.terminal-280488103-r8 { fill: #de4e88;text-decoration: underline; } +.terminal-280488103-r9 { fill: #3498db;font-style: italic; } +.terminal-280488103-r10 { fill: #181919 } +.terminal-280488103-r11 { fill: #1a1a1a } +.terminal-280488103-r12 { fill: #051a0e } +.terminal-280488103-r13 { fill: #5e6060 } +.terminal-280488103-r14 { fill: #cfbbdc } +.terminal-280488103-r15 { fill: #9b59b6 } +.terminal-280488103-r16 { fill: #1e1f1f;font-weight: bold } +.terminal-280488103-r17 { fill: #0ea5e9 } +.terminal-280488103-r18 { fill: #929495 } +.terminal-280488103-r19 { fill: #58d1eb;font-weight: bold } +.terminal-280488103-r20 { fill: #181a1a;font-weight: bold } +.terminal-280488103-r21 { fill: #c3a4d3 } +.terminal-280488103-r22 { fill: #1d1d1e } +.terminal-280488103-r23 { fill: #5a5c5c } +.terminal-280488103-r24 { fill: #d9dee1 } +.terminal-280488103-r25 { fill: #cccfd0;font-weight: bold } +.terminal-280488103-r26 { fill: #cccfd0 } +.terminal-280488103-r27 { fill: #5b5d5e } +.terminal-280488103-r28 { fill: #e0e4e5 } +.terminal-280488103-r29 { fill: #b386c7 } +.terminal-280488103-r30 { fill: #767878 } +.terminal-280488103-r31 { fill: #595a5b } +.terminal-280488103-r32 { fill: #848787 } +.terminal-280488103-r33 { fill: #dbdfe0 } +.terminal-280488103-r34 { fill: #62c18b;font-weight: bold } +.terminal-280488103-r35 { fill: #af6cca;font-weight: bold } +.terminal-280488103-r36 { fill: #232424 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                                        - -GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID/$lol/ Send  - -╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ -GET get allHeadersBodyQueryAuthInfoScriptsOptions -█ GET get one━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -None -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱The request doesn't have a body.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╰───────────────────────────────────────────────────────────────╯ -│╭──────────────────────────────────────────────────── Response ─╮ -││BodyHeadersCookiesTrace -││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -││ -││ -││ -││ -││ -││ -││ -│─────────────────────────────││ -Retrieve one todo││1:1read-onlyJSONWrap X -╰───────────────────── todos ─╯╰───────────────────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  + + + + +Posting                                                                                        + +GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID/$lol/ Send  + +╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ +GET get allHeadersBodyQueryAuthInfoScriptsOptions +█ GET get one━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +None +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱The request doesn't have a body.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╰───────────────────────────────────────────────────────────────╯ +│╭──────────────────────────────────────────────────── Response ─╮ +││BodyHeadersCookiesScriptsTrace +││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +││ +││ +││ +││ +││ +││ +││ +│─────────────────────────────││ +Retrieve one todo││1:1read-onlyJSONWrap X +╰───────────────────── todos ─╯╰───────────────────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  diff --git a/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__json.svg b/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__json.svg index e4e2d824..2929714c 100644 --- a/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__json.svg +++ b/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__json.svg @@ -19,210 +19,210 @@ font-weight: 700; } - .terminal-689556499-matrix { + .terminal-1861433486-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-689556499-title { + .terminal-1861433486-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-689556499-r1 { fill: #1d1f20 } -.terminal-689556499-r2 { fill: #c5c8c6 } -.terminal-689556499-r3 { fill: #ff5c51 } -.terminal-689556499-r4 { fill: #ddf3f5;text-decoration: underline; } -.terminal-689556499-r5 { fill: #ddf3f5 } -.terminal-689556499-r6 { fill: #99dbe3 } -.terminal-689556499-r7 { fill: #d32f2f } -.terminal-689556499-r8 { fill: #797979 } -.terminal-689556499-r9 { fill: #00acc1 } -.terminal-689556499-r10 { fill: #212121 } -.terminal-689556499-r11 { fill: #e1effb } -.terminal-689556499-r12 { fill: #5a6065 } -.terminal-689556499-r13 { fill: #ddadb4 } -.terminal-689556499-r14 { fill: #d22f2f } -.terminal-689556499-r15 { fill: #1d1f20;font-weight: bold } -.terminal-689556499-r16 { fill: #6c7378 } -.terminal-689556499-r17 { fill: #6c7378;font-weight: bold } -.terminal-689556499-r18 { fill: #8c969c } -.terminal-689556499-r19 { fill: #58d1eb;font-weight: bold } -.terminal-689556499-r20 { fill: #00640d } -.terminal-689556499-r21 { fill: #0ea5e9 } -.terminal-689556499-r22 { fill: #cfdbe3 } -.terminal-689556499-r23 { fill: #1c1e1f } -.terminal-689556499-r24 { fill: #575c61 } -.terminal-689556499-r25 { fill: #1f2021;font-weight: bold } -.terminal-689556499-r26 { fill: #889197 } -.terminal-689556499-r27 { fill: #1d1617 } -.terminal-689556499-r28 { fill: #ef4444 } -.terminal-689556499-r29 { fill: #575c61;font-weight: bold } -.terminal-689556499-r30 { fill: #f9e3e3 } -.terminal-689556499-r31 { fill: #569cd6;font-weight: bold } -.terminal-689556499-r32 { fill: #ce9178 } -.terminal-689556499-r33 { fill: #b5cea8 } -.terminal-689556499-r34 { fill: #f59e0b } -.terminal-689556499-r35 { fill: #71797e } -.terminal-689556499-r36 { fill: #c5cfd7 } -.terminal-689556499-r37 { fill: #43a047;font-weight: bold } -.terminal-689556499-r38 { fill: #c4d1da;font-weight: bold } -.terminal-689556499-r39 { fill: #c4d1da } -.terminal-689556499-r40 { fill: #585e62 } -.terminal-689556499-r41 { fill: #d9e6f0 } -.terminal-689556499-r42 { fill: #d7696c } -.terminal-689556499-r43 { fill: #22c55e } -.terminal-689556499-r44 { fill: #555b5f } -.terminal-689556499-r45 { fill: #7f888e } -.terminal-689556499-r46 { fill: #d4e0ea } -.terminal-689556499-r47 { fill: #73b87d;font-weight: bold } -.terminal-689556499-r48 { fill: #eb4640;font-weight: bold } -.terminal-689556499-r49 { fill: #222425 } + .terminal-1861433486-r1 { fill: #1d1f20 } +.terminal-1861433486-r2 { fill: #c5c8c6 } +.terminal-1861433486-r3 { fill: #ff5c51 } +.terminal-1861433486-r4 { fill: #ddf3f5;text-decoration: underline; } +.terminal-1861433486-r5 { fill: #ddf3f5 } +.terminal-1861433486-r6 { fill: #99dbe3 } +.terminal-1861433486-r7 { fill: #d32f2f } +.terminal-1861433486-r8 { fill: #797979 } +.terminal-1861433486-r9 { fill: #00acc1 } +.terminal-1861433486-r10 { fill: #212121 } +.terminal-1861433486-r11 { fill: #e1effb } +.terminal-1861433486-r12 { fill: #5a6065 } +.terminal-1861433486-r13 { fill: #ddadb4 } +.terminal-1861433486-r14 { fill: #d22f2f } +.terminal-1861433486-r15 { fill: #1d1f20;font-weight: bold } +.terminal-1861433486-r16 { fill: #6c7378 } +.terminal-1861433486-r17 { fill: #6c7378;font-weight: bold } +.terminal-1861433486-r18 { fill: #8c969c } +.terminal-1861433486-r19 { fill: #58d1eb;font-weight: bold } +.terminal-1861433486-r20 { fill: #00640d } +.terminal-1861433486-r21 { fill: #0ea5e9 } +.terminal-1861433486-r22 { fill: #cfdbe3 } +.terminal-1861433486-r23 { fill: #1c1e1f } +.terminal-1861433486-r24 { fill: #575c61 } +.terminal-1861433486-r25 { fill: #1f2021;font-weight: bold } +.terminal-1861433486-r26 { fill: #889197 } +.terminal-1861433486-r27 { fill: #1d1617 } +.terminal-1861433486-r28 { fill: #ef4444 } +.terminal-1861433486-r29 { fill: #575c61;font-weight: bold } +.terminal-1861433486-r30 { fill: #f9e3e3 } +.terminal-1861433486-r31 { fill: #569cd6;font-weight: bold } +.terminal-1861433486-r32 { fill: #ce9178 } +.terminal-1861433486-r33 { fill: #b5cea8 } +.terminal-1861433486-r34 { fill: #f59e0b } +.terminal-1861433486-r35 { fill: #71797e } +.terminal-1861433486-r36 { fill: #c5cfd7 } +.terminal-1861433486-r37 { fill: #43a047;font-weight: bold } +.terminal-1861433486-r38 { fill: #c4d1da;font-weight: bold } +.terminal-1861433486-r39 { fill: #c4d1da } +.terminal-1861433486-r40 { fill: #585e62 } +.terminal-1861433486-r41 { fill: #d9e6f0 } +.terminal-1861433486-r42 { fill: #d7696c } +.terminal-1861433486-r43 { fill: #22c55e } +.terminal-1861433486-r44 { fill: #555b5f } +.terminal-1861433486-r45 { fill: #7f888e } +.terminal-1861433486-r46 { fill: #d4e0ea } +.terminal-1861433486-r47 { fill: #73b87d;font-weight: bold } +.terminal-1861433486-r48 { fill: #eb4640;font-weight: bold } +.terminal-1861433486-r49 { fill: #222425 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                                        - -POSThttps://jsonplaceholder.typicode.com/posts                              Send  - -╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ -▼ posts/HeadersBodyQueryAuthInfoScriptsOptions -GET get all━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get oneRaw (json, text, etc.) -█ POS create1  { -DEL delete a post2  "title""foo",                                          -▼ comments/3  "body""bar",                                           -GET get comments4  "userId"1 -GET get comments (via pa5  }                                                          -PUT edit a comment -▼ todos/2:1JSONWrap X -GET get all╰───────────────────────────────────────────────────────────────╯ -GET get one│╭──────────────────────────────────────────────────── Response ─╮ -▼ users/││BodyHeadersCookiesTrace -GET get a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get all users││ -POS create a user││ -PUT update a user││ -DEL delete a user││ -││ -││ -││ -│─────────────────────────────││ -Create a new post││1:1read-onlyJSONWrap X -╰─────────── jsonplaceholder ─╯╰───────────────────────────────────────────────────────────────╯ - f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Hel + + + + +Posting                                                                                        + +POSThttps://jsonplaceholder.typicode.com/posts                              Send  + +╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ +▼ posts/HeadersBodyQueryAuthInfoScriptsOptions +GET get all━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get oneRaw (json, text, etc.) +█ POS create1  { +DEL delete a post2  "title""foo",                                          +▼ comments/3  "body""bar",                                           +GET get comments4  "userId"1 +GET get comments (via pa5  }                                                          +PUT edit a comment +▼ todos/2:1JSONWrap X +GET get all╰───────────────────────────────────────────────────────────────╯ +GET get one│╭──────────────────────────────────────────────────── Response ─╮ +▼ users/││BodyHeadersCookiesScriptsTrace +GET get a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get all users││ +POS create a user││ +PUT update a user││ +DEL delete a user││ +││ +││ +││ +│─────────────────────────────││ +Create a new post││1:1read-onlyJSONWrap X +╰─────────── jsonplaceholder ─╯╰───────────────────────────────────────────────────────────────╯ + f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Hel diff --git a/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__url.svg b/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__url.svg index 76be8659..7c45dcbb 100644 --- a/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__url.svg +++ b/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_sensible_defaults__url.svg @@ -19,197 +19,197 @@ font-weight: 700; } - .terminal-2876000028-matrix { + .terminal-2630792072-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2876000028-title { + .terminal-2630792072-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2876000028-r1 { fill: #1d1f20 } -.terminal-2876000028-r2 { fill: #c5c8c6 } -.terminal-2876000028-r3 { fill: #ff5c51 } -.terminal-2876000028-r4 { fill: #ddf3f5;text-decoration: underline; } -.terminal-2876000028-r5 { fill: #ddf3f5 } -.terminal-2876000028-r6 { fill: #99dbe3 } -.terminal-2876000028-r7 { fill: #d32f2f } -.terminal-2876000028-r8 { fill: #797979 } -.terminal-2876000028-r9 { fill: #00acc1 } -.terminal-2876000028-r10 { fill: #212121 } -.terminal-2876000028-r11 { fill: #43a047 } -.terminal-2876000028-r12 { fill: #e1effb } -.terminal-2876000028-r13 { fill: #5a6065 } -.terminal-2876000028-r14 { fill: #ddadb4 } -.terminal-2876000028-r15 { fill: #d22f2f } -.terminal-2876000028-r16 { fill: #1d1f20;font-weight: bold } -.terminal-2876000028-r17 { fill: #0ea5e9 } -.terminal-2876000028-r18 { fill: #8c969c } -.terminal-2876000028-r19 { fill: #58d1eb;font-weight: bold } -.terminal-2876000028-r20 { fill: #1f2021;font-weight: bold } -.terminal-2876000028-r21 { fill: #da9096 } -.terminal-2876000028-r22 { fill: #1c1e1f } -.terminal-2876000028-r23 { fill: #575c61 } -.terminal-2876000028-r24 { fill: #f6fbfe } -.terminal-2876000028-r25 { fill: #c4d1da;font-weight: bold } -.terminal-2876000028-r26 { fill: #c4d1da } -.terminal-2876000028-r27 { fill: #585e62 } -.terminal-2876000028-r28 { fill: #d9e6f0 } -.terminal-2876000028-r29 { fill: #d7696c } -.terminal-2876000028-r30 { fill: #71797e } -.terminal-2876000028-r31 { fill: #555b5f } -.terminal-2876000028-r32 { fill: #7f888e } -.terminal-2876000028-r33 { fill: #d4e0ea } -.terminal-2876000028-r34 { fill: #73b87d;font-weight: bold } -.terminal-2876000028-r35 { fill: #eb4640;font-weight: bold } -.terminal-2876000028-r36 { fill: #222425 } + .terminal-2630792072-r1 { fill: #1d1f20 } +.terminal-2630792072-r2 { fill: #c5c8c6 } +.terminal-2630792072-r3 { fill: #ff5c51 } +.terminal-2630792072-r4 { fill: #ddf3f5;text-decoration: underline; } +.terminal-2630792072-r5 { fill: #ddf3f5 } +.terminal-2630792072-r6 { fill: #99dbe3 } +.terminal-2630792072-r7 { fill: #d32f2f } +.terminal-2630792072-r8 { fill: #797979 } +.terminal-2630792072-r9 { fill: #00acc1 } +.terminal-2630792072-r10 { fill: #212121 } +.terminal-2630792072-r11 { fill: #43a047 } +.terminal-2630792072-r12 { fill: #e1effb } +.terminal-2630792072-r13 { fill: #5a6065 } +.terminal-2630792072-r14 { fill: #ddadb4 } +.terminal-2630792072-r15 { fill: #d22f2f } +.terminal-2630792072-r16 { fill: #1d1f20;font-weight: bold } +.terminal-2630792072-r17 { fill: #0ea5e9 } +.terminal-2630792072-r18 { fill: #8c969c } +.terminal-2630792072-r19 { fill: #58d1eb;font-weight: bold } +.terminal-2630792072-r20 { fill: #1f2021;font-weight: bold } +.terminal-2630792072-r21 { fill: #da9096 } +.terminal-2630792072-r22 { fill: #1c1e1f } +.terminal-2630792072-r23 { fill: #575c61 } +.terminal-2630792072-r24 { fill: #f6fbfe } +.terminal-2630792072-r25 { fill: #c4d1da;font-weight: bold } +.terminal-2630792072-r26 { fill: #c4d1da } +.terminal-2630792072-r27 { fill: #585e62 } +.terminal-2630792072-r28 { fill: #d9e6f0 } +.terminal-2630792072-r29 { fill: #d7696c } +.terminal-2630792072-r30 { fill: #71797e } +.terminal-2630792072-r31 { fill: #555b5f } +.terminal-2630792072-r32 { fill: #7f888e } +.terminal-2630792072-r33 { fill: #d4e0ea } +.terminal-2630792072-r34 { fill: #73b87d;font-weight: bold } +.terminal-2630792072-r35 { fill: #eb4640;font-weight: bold } +.terminal-2630792072-r36 { fill: #222425 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                                        - -GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID/$lol/ Send  - -╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ -GET get allHeadersBodyQueryAuthInfoScriptsOptions -█ GET get one━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -None -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱The request doesn't have a body.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╰───────────────────────────────────────────────────────────────╯ -│╭──────────────────────────────────────────────────── Response ─╮ -││BodyHeadersCookiesTrace -││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -││ -││ -││ -││ -││ -││ -││ -│─────────────────────────────││ -Retrieve one todo││1:1read-onlyJSONWrap X -╰───────────────────── todos ─╯╰───────────────────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  + + + + +Posting                                                                                        + +GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID/$lol/ Send  + +╭─ Collection ────────────────╮╭───────────────────────────────────────────────────── Request ─╮ +GET get allHeadersBodyQueryAuthInfoScriptsOptions +█ GET get one━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +None +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱The request doesn't have a body.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╰───────────────────────────────────────────────────────────────╯ +│╭──────────────────────────────────────────────────── Response ─╮ +││BodyHeadersCookiesScriptsTrace +││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +││ +││ +││ +││ +││ +││ +││ +│─────────────────────────────││ +Retrieve one todo││1:1read-onlyJSONWrap X +╰───────────────────── todos ─╯╰───────────────────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  diff --git a/tests/__snapshots__/test_snapshots/TestHelpScreen.test_help_screen_appears.svg b/tests/__snapshots__/test_snapshots/TestHelpScreen.test_help_screen_appears.svg index 81edc904..e5344844 100644 --- a/tests/__snapshots__/test_snapshots/TestHelpScreen.test_help_screen_appears.svg +++ b/tests/__snapshots__/test_snapshots/TestHelpScreen.test_help_screen_appears.svg @@ -19,250 +19,251 @@ font-weight: 700; } - .terminal-311536695-matrix { + .terminal-720057009-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-311536695-title { + .terminal-720057009-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-311536695-r1 { fill: #9c9c9d } -.terminal-311536695-r2 { fill: #c5c8c6 } -.terminal-311536695-r3 { fill: #dfdfe0 } -.terminal-311536695-r4 { fill: #b2669a } -.terminal-311536695-r5 { fill: #0e0b15;text-decoration: underline; } -.terminal-311536695-r6 { fill: #0e0b15 } -.terminal-311536695-r7 { fill: #2e2540 } -.terminal-311536695-r8 { fill: #50505e } -.terminal-311536695-r9 { fill: #9d9da1 } -.terminal-311536695-r10 { fill: #a79eaf } -.terminal-311536695-r11 { fill: #6f6f73 } -.terminal-311536695-r12 { fill: #2e2e3f } -.terminal-311536695-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-311536695-r14 { fill: #dfdfe1 } -.terminal-311536695-r15 { fill: #45203a } -.terminal-311536695-r16 { fill: #0f0f1f } -.terminal-311536695-r17 { fill: #9e9ea2;font-weight: bold } -.terminal-311536695-r18 { fill: #a5a5ab;font-weight: bold } -.terminal-311536695-r19 { fill: #4a4a51 } -.terminal-311536695-r20 { fill: #0973a3 } -.terminal-311536695-r21 { fill: #191923 } -.terminal-311536695-r22 { fill: #178941 } -.terminal-311536695-r23 { fill: #19192d } -.terminal-311536695-r24 { fill: #616166 } -.terminal-311536695-r25 { fill: #616166;font-weight: bold } -.terminal-311536695-r26 { fill: #8b8b93;font-weight: bold } -.terminal-311536695-r27 { fill: #008042 } -.terminal-311536695-r28 { fill: #a72f2f } -.terminal-311536695-r29 { fill: #a5a5ab } -.terminal-311536695-r30 { fill: #ab6e07 } -.terminal-311536695-r31 { fill: #e0e0e2;font-weight: bold } -.terminal-311536695-r32 { fill: #e0e0e2 } -.terminal-311536695-r33 { fill: #e1e0e4 } -.terminal-311536695-r34 { fill: #e1e0e4;font-weight: bold } -.terminal-311536695-r35 { fill: #e2e0e5 } -.terminal-311536695-r36 { fill: #65626d } -.terminal-311536695-r37 { fill: #e2e0e5;font-weight: bold } -.terminal-311536695-r38 { fill: #707074 } -.terminal-311536695-r39 { fill: #11111c } -.terminal-311536695-r40 { fill: #0d0e2e } -.terminal-311536695-r41 { fill: #6f6f78;font-weight: bold } -.terminal-311536695-r42 { fill: #6f6f78 } -.terminal-311536695-r43 { fill: #5e5e64 } -.terminal-311536695-r44 { fill: #727276 } -.terminal-311536695-r45 { fill: #535359 } -.terminal-311536695-r46 { fill: #15151f } -.terminal-311536695-r47 { fill: #027d51;font-weight: bold } -.terminal-311536695-r48 { fill: #b2588c;font-weight: bold } -.terminal-311536695-r49 { fill: #99999a } + .terminal-720057009-r1 { fill: #9c9c9d } +.terminal-720057009-r2 { fill: #c5c8c6 } +.terminal-720057009-r3 { fill: #dfdfe0 } +.terminal-720057009-r4 { fill: #b2669a } +.terminal-720057009-r5 { fill: #0e0b15;text-decoration: underline; } +.terminal-720057009-r6 { fill: #0e0b15 } +.terminal-720057009-r7 { fill: #2e2540 } +.terminal-720057009-r8 { fill: #50505e } +.terminal-720057009-r9 { fill: #9d9da1 } +.terminal-720057009-r10 { fill: #a79eaf } +.terminal-720057009-r11 { fill: #6f6f73 } +.terminal-720057009-r12 { fill: #2e2e3f } +.terminal-720057009-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-720057009-r14 { fill: #dfdfe1 } +.terminal-720057009-r15 { fill: #45203a } +.terminal-720057009-r16 { fill: #0f0f1f } +.terminal-720057009-r17 { fill: #9e9ea2;font-weight: bold } +.terminal-720057009-r18 { fill: #a5a5ab;font-weight: bold } +.terminal-720057009-r19 { fill: #4a4a51 } +.terminal-720057009-r20 { fill: #0973a3 } +.terminal-720057009-r21 { fill: #191923 } +.terminal-720057009-r22 { fill: #178941 } +.terminal-720057009-r23 { fill: #19192d } +.terminal-720057009-r24 { fill: #616166 } +.terminal-720057009-r25 { fill: #616166;font-weight: bold } +.terminal-720057009-r26 { fill: #8b8b93;font-weight: bold } +.terminal-720057009-r27 { fill: #008042 } +.terminal-720057009-r28 { fill: #a72f2f } +.terminal-720057009-r29 { fill: #a5a5ab } +.terminal-720057009-r30 { fill: #ab6e07 } +.terminal-720057009-r31 { fill: #e0e0e2;font-weight: bold } +.terminal-720057009-r32 { fill: #e0e0e2 } +.terminal-720057009-r33 { fill: #e1e0e4 } +.terminal-720057009-r34 { fill: #e1e0e4;font-weight: bold } +.terminal-720057009-r35 { fill: #e2e0e5 } +.terminal-720057009-r36 { fill: #65626d } +.terminal-720057009-r37 { fill: #e2e0e5;font-weight: bold } +.terminal-720057009-r38 { fill: #20202a } +.terminal-720057009-r39 { fill: #707074 } +.terminal-720057009-r40 { fill: #11111c } +.terminal-720057009-r41 { fill: #0d0e2e } +.terminal-720057009-r42 { fill: #6f6f78;font-weight: bold } +.terminal-720057009-r43 { fill: #6f6f78 } +.terminal-720057009-r44 { fill: #5e5e64 } +.terminal-720057009-r45 { fill: #727276 } +.terminal-720057009-r46 { fill: #535359 } +.terminal-720057009-r47 { fill: #15151f } +.terminal-720057009-r48 { fill: #027d51;font-weight: bold } +.terminal-720057009-r49 { fill: #b2588c;font-weight: bold } +.terminal-720057009-r50 { fill: #99999a } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  -▁▁Focused Widget Help (Address Bar)▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ -╭─ Collectio Request ─╮ - GET echoAddress BariptsOptio -GET get raEnter the URL to send a request to. Refer to ━━━━━━━━━━━ -POS echo pvariables from the environment (loaded via ╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplace--env) using $variable or ${variable} syntax. ╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/Resolved variables will be highlighted green. ╱╱╱╱╱╱╱╱╱╱╱ -GET geMove the cursor over a variable to preview the╱╱╱╱╱╱╱╱╱╱╱ -GET gevalue. Base URL suggestions are loaded based ╱╱╱╱╱╱╱╱╱╱╱ -POS cron the URLs found in the currently open ╱╱╱╱╱╱╱╱╱╱╱ -DEL decollection. Press ctrl+l to quickly focus this╱╱╱╱╱╱╱╱╱╱╱ -▼ commebar from elsewhere.╱╱╱╱╱╱╱╱╱╱╱ -GET╱╱╱╱╱╱╱╱╱╱╱ -GETAll Keybindings╱╱╱╱╱╱╱╱╱╱╱ -PUT Key   Description                   ╱╱╱╱╱╱╱╱╱╱╱ -▼ todos/ cursor left                   ╱╱╱╱╱╱╱╱╱╱╱ -GET ge^← cursor left word               header  -GET ge cursor right                  ───────────╯ -▼ users/^→ cursor right word              Response ─╮ -GET ge delete left                    -GET gehome home                          ━━━━━━━━━━━ -POS cr^a home                           -PUT upend end                            -DEL de^e end                            -del delete right                   -^d delete right                   - submit                         - -Press ESC to dismiss. -│───────────Note: This page relates to the widget that is  -This is ancurrently focused. -server we  -see exactl▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETEnter a URL... Send  +▁▁Focused Widget Help (Address Bar)▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ +╭─ Collectio Request ─╮ + GET echoAddress BariptsOptio +GET get raEnter the URL to send a request to. Refer to ━━━━━━━━━━━ +POS echo pvariables from the environment (loaded via ╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplace--env) using $variable or ${variable} syntax. ╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/Resolved variables will be highlighted green. ╱╱╱╱╱╱╱╱╱╱╱ +GET geMove the cursor over a variable to preview the╱╱╱╱╱╱╱╱╱╱╱ +GET gevalue. Base URL suggestions are loaded based ╱╱╱╱╱╱╱╱╱╱╱ +POS cron the URLs found in the currently open ╱╱╱╱╱╱╱╱╱╱╱ +DEL decollection. Press ctrl+l to quickly focus this╱╱╱╱╱╱╱╱╱╱╱ +▼ commebar from elsewhere.╱╱╱╱╱╱╱╱╱╱╱ +GET╱╱╱╱╱╱╱╱╱╱╱ +GETAll Keybindings╱╱╱╱╱╱╱╱╱╱╱ +PUT Key   Description                   ╱╱╱╱╱╱╱╱╱╱╱ +▼ todos/ cursor left                   ╱╱╱╱╱╱╱╱╱╱╱ +GET ge^← cursor left word               header  +GET ge cursor right                  ───────────╯ +▼ users/^→ cursor right word              Response ─╮ +GET ge delete left                   e +GET gehome home                          ━━━━━━━━━━━ +POS cr^a home                           +PUT upend end                            +DEL de^e end                            +del delete right                   +^d delete right                   + submit                         + +Press ESC to dismiss. +│───────────Note: This page relates to the widget that is  +This is ancurrently focused. +server we  +see exactl▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg b/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg index 129c5031..97560c6e 100644 --- a/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg +++ b/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg @@ -19,164 +19,164 @@ font-weight: 700; } - .terminal-2013397361-matrix { + .terminal-1340828524-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2013397361-title { + .terminal-1340828524-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2013397361-r1 { fill: #dfdfe1 } -.terminal-2013397361-r2 { fill: #c5c8c6 } -.terminal-2013397361-r3 { fill: #ff93dd } -.terminal-2013397361-r4 { fill: #15111e;text-decoration: underline; } -.terminal-2013397361-r5 { fill: #15111e } -.terminal-2013397361-r6 { fill: #43365c } -.terminal-2013397361-r7 { fill: #737387 } -.terminal-2013397361-r8 { fill: #e1e1e6 } -.terminal-2013397361-r9 { fill: #efe3fb } -.terminal-2013397361-r10 { fill: #9f9fa5 } -.terminal-2013397361-r11 { fill: #632e53 } -.terminal-2013397361-r12 { fill: #ff69b4 } -.terminal-2013397361-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-2013397361-r14 { fill: #e3e3e8;font-weight: bold } -.terminal-2013397361-r15 { fill: #6a6a74 } -.terminal-2013397361-r16 { fill: #0ea5e9 } -.terminal-2013397361-r17 { fill: #873c69 } -.terminal-2013397361-r18 { fill: #22c55e } -.terminal-2013397361-r19 { fill: #8b8b93 } -.terminal-2013397361-r20 { fill: #8b8b93;font-weight: bold } -.terminal-2013397361-r21 { fill: #0d0e2e } -.terminal-2013397361-r22 { fill: #00b85f } -.terminal-2013397361-r23 { fill: #ef4444 } -.terminal-2013397361-r24 { fill: #2e2e3c;font-weight: bold } -.terminal-2013397361-r25 { fill: #2e2e3c } -.terminal-2013397361-r26 { fill: #a0a0a6 } -.terminal-2013397361-r27 { fill: #191928 } -.terminal-2013397361-r28 { fill: #b74e87 } -.terminal-2013397361-r29 { fill: #87878f } -.terminal-2013397361-r30 { fill: #a3a3a9 } -.terminal-2013397361-r31 { fill: #777780 } -.terminal-2013397361-r32 { fill: #1f1f2d } -.terminal-2013397361-r33 { fill: #04b375;font-weight: bold } -.terminal-2013397361-r34 { fill: #ff7ec8;font-weight: bold } -.terminal-2013397361-r35 { fill: #dbdbdd } + .terminal-1340828524-r1 { fill: #dfdfe1 } +.terminal-1340828524-r2 { fill: #c5c8c6 } +.terminal-1340828524-r3 { fill: #ff93dd } +.terminal-1340828524-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1340828524-r5 { fill: #15111e } +.terminal-1340828524-r6 { fill: #43365c } +.terminal-1340828524-r7 { fill: #737387 } +.terminal-1340828524-r8 { fill: #e1e1e6 } +.terminal-1340828524-r9 { fill: #efe3fb } +.terminal-1340828524-r10 { fill: #9f9fa5 } +.terminal-1340828524-r11 { fill: #632e53 } +.terminal-1340828524-r12 { fill: #ff69b4 } +.terminal-1340828524-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-1340828524-r14 { fill: #e3e3e8;font-weight: bold } +.terminal-1340828524-r15 { fill: #6a6a74 } +.terminal-1340828524-r16 { fill: #0ea5e9 } +.terminal-1340828524-r17 { fill: #873c69 } +.terminal-1340828524-r18 { fill: #22c55e } +.terminal-1340828524-r19 { fill: #8b8b93 } +.terminal-1340828524-r20 { fill: #8b8b93;font-weight: bold } +.terminal-1340828524-r21 { fill: #0d0e2e } +.terminal-1340828524-r22 { fill: #00b85f } +.terminal-1340828524-r23 { fill: #ef4444 } +.terminal-1340828524-r24 { fill: #2e2e3c;font-weight: bold } +.terminal-1340828524-r25 { fill: #2e2e3c } +.terminal-1340828524-r26 { fill: #a0a0a6 } +.terminal-1340828524-r27 { fill: #191928 } +.terminal-1340828524-r28 { fill: #b74e87 } +.terminal-1340828524-r29 { fill: #87878f } +.terminal-1340828524-r30 { fill: #a3a3a9 } +.terminal-1340828524-r31 { fill: #777780 } +.terminal-1340828524-r32 { fill: #1f1f2d } +.terminal-1340828524-r33 { fill: #04b375;font-weight: bold } +.terminal-1340828524-r34 { fill: #ff7ec8;font-weight: bold } +.terminal-1340828524-r35 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echoadersBodyQueryAuthInfoScriptsOptions -GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━╺━━━━━━━━━ -POS echo postPre-request script optional -▼ jsonplaceholder/Collection-relative path to pre-request  -▼ posts/ -GET get allPost-response script optional -GET get one╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echoadersBodyQueryAuthInfoScriptsOptions +GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━╺━━━━━━━━━ +POS echo postPre-request script optional +▼ jsonplaceholder/Collection-relative path to pre-request  +▼ posts/ +GET get allPost-response script optional +GET get one╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestJumpMode.test_focus_switch.svg b/tests/__snapshots__/test_snapshots/TestJumpMode.test_focus_switch.svg index 34e47730..1fc84515 100644 --- a/tests/__snapshots__/test_snapshots/TestJumpMode.test_focus_switch.svg +++ b/tests/__snapshots__/test_snapshots/TestJumpMode.test_focus_switch.svg @@ -19,166 +19,166 @@ font-weight: 700; } - .terminal-1577605832-matrix { + .terminal-3849372867-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1577605832-title { + .terminal-3849372867-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1577605832-r1 { fill: #dfdfe1 } -.terminal-1577605832-r2 { fill: #c5c8c6 } -.terminal-1577605832-r3 { fill: #ff93dd } -.terminal-1577605832-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1577605832-r5 { fill: #15111e } -.terminal-1577605832-r6 { fill: #43365c } -.terminal-1577605832-r7 { fill: #737387 } -.terminal-1577605832-r8 { fill: #e1e1e6 } -.terminal-1577605832-r9 { fill: #efe3fb } -.terminal-1577605832-r10 { fill: #9f9fa5 } -.terminal-1577605832-r11 { fill: #ff69b4 } -.terminal-1577605832-r12 { fill: #dfdfe1;font-weight: bold } -.terminal-1577605832-r13 { fill: #632e53 } -.terminal-1577605832-r14 { fill: #210d17;font-weight: bold } -.terminal-1577605832-r15 { fill: #6a6a74 } -.terminal-1577605832-r16 { fill: #0ea5e9 } -.terminal-1577605832-r17 { fill: #252532 } -.terminal-1577605832-r18 { fill: #22c55e } -.terminal-1577605832-r19 { fill: #252441 } -.terminal-1577605832-r20 { fill: #8b8b93 } -.terminal-1577605832-r21 { fill: #8b8b93;font-weight: bold } -.terminal-1577605832-r22 { fill: #0d0e2e } -.terminal-1577605832-r23 { fill: #00b85f } -.terminal-1577605832-r24 { fill: #918d9d } -.terminal-1577605832-r25 { fill: #ef4444 } -.terminal-1577605832-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-1577605832-r27 { fill: #2e2e3c } -.terminal-1577605832-r28 { fill: #a0a0a6 } -.terminal-1577605832-r29 { fill: #191928 } -.terminal-1577605832-r30 { fill: #b74e87 } -.terminal-1577605832-r31 { fill: #87878f } -.terminal-1577605832-r32 { fill: #a3a3a9 } -.terminal-1577605832-r33 { fill: #777780 } -.terminal-1577605832-r34 { fill: #1f1f2d } -.terminal-1577605832-r35 { fill: #04b375;font-weight: bold } -.terminal-1577605832-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-1577605832-r37 { fill: #dbdbdd } + .terminal-3849372867-r1 { fill: #dfdfe1 } +.terminal-3849372867-r2 { fill: #c5c8c6 } +.terminal-3849372867-r3 { fill: #ff93dd } +.terminal-3849372867-r4 { fill: #15111e;text-decoration: underline; } +.terminal-3849372867-r5 { fill: #15111e } +.terminal-3849372867-r6 { fill: #43365c } +.terminal-3849372867-r7 { fill: #737387 } +.terminal-3849372867-r8 { fill: #e1e1e6 } +.terminal-3849372867-r9 { fill: #efe3fb } +.terminal-3849372867-r10 { fill: #9f9fa5 } +.terminal-3849372867-r11 { fill: #ff69b4 } +.terminal-3849372867-r12 { fill: #dfdfe1;font-weight: bold } +.terminal-3849372867-r13 { fill: #632e53 } +.terminal-3849372867-r14 { fill: #210d17;font-weight: bold } +.terminal-3849372867-r15 { fill: #6a6a74 } +.terminal-3849372867-r16 { fill: #0ea5e9 } +.terminal-3849372867-r17 { fill: #252532 } +.terminal-3849372867-r18 { fill: #22c55e } +.terminal-3849372867-r19 { fill: #252441 } +.terminal-3849372867-r20 { fill: #8b8b93 } +.terminal-3849372867-r21 { fill: #8b8b93;font-weight: bold } +.terminal-3849372867-r22 { fill: #0d0e2e } +.terminal-3849372867-r23 { fill: #00b85f } +.terminal-3849372867-r24 { fill: #918d9d } +.terminal-3849372867-r25 { fill: #ef4444 } +.terminal-3849372867-r26 { fill: #2e2e3c;font-weight: bold } +.terminal-3849372867-r27 { fill: #2e2e3c } +.terminal-3849372867-r28 { fill: #a0a0a6 } +.terminal-3849372867-r29 { fill: #191928 } +.terminal-3849372867-r30 { fill: #b74e87 } +.terminal-3849372867-r31 { fill: #87878f } +.terminal-3849372867-r32 { fill: #a3a3a9 } +.terminal-3849372867-r33 { fill: #777780 } +.terminal-3849372867-r34 { fill: #1f1f2d } +.terminal-3849372867-r35 { fill: #04b375;font-weight: bold } +.terminal-3849372867-r36 { fill: #ff7ec8;font-weight: bold } +.terminal-3849372867-r37 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echoHeadersBodyQueryAuthInfoScriptsOptio -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get allNameValue Add header  -GET get one╰─────────────────────────────────────────────────╯ -POS create╭────────────────────────────────────── Response ─╮ -DEL delete a postBodyHeadersCookiesTrace -───────────────────────━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo  -server we can use to  -see exactly what  -request is being  -sent.1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get allNameValue Add header  +GET get one╰─────────────────────────────────────────────────╯ +POS create╭────────────────────────────────────── Response ─╮ +DEL delete a postBodyHeadersCookiesScriptsTrace +───────────────────────━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo  +server we can use to  +see exactly what  +request is being  +sent.1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump diff --git a/tests/__snapshots__/test_snapshots/TestJumpMode.test_loads.svg b/tests/__snapshots__/test_snapshots/TestJumpMode.test_loads.svg index 2d0ffd99..c0d291a0 100644 --- a/tests/__snapshots__/test_snapshots/TestJumpMode.test_loads.svg +++ b/tests/__snapshots__/test_snapshots/TestJumpMode.test_loads.svg @@ -19,171 +19,171 @@ font-weight: 700; } - .terminal-2796704069-matrix { + .terminal-3355451680-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2796704069-title { + .terminal-3355451680-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2796704069-r1 { fill: #9c9c9d } -.terminal-2796704069-r2 { fill: #c5c8c6 } -.terminal-2796704069-r3 { fill: #dfdfe0 } -.terminal-2796704069-r4 { fill: #b2669a } -.terminal-2796704069-r5 { fill: #21131c;font-weight: bold } -.terminal-2796704069-r6 { fill: #0e0b15;text-decoration: underline; } -.terminal-2796704069-r7 { fill: #0e0b15 } -.terminal-2796704069-r8 { fill: #2e2540 } -.terminal-2796704069-r9 { fill: #50505e } -.terminal-2796704069-r10 { fill: #9d9da1 } -.terminal-2796704069-r11 { fill: #a79eaf } -.terminal-2796704069-r12 { fill: #6f6f73 } -.terminal-2796704069-r13 { fill: #45203a } -.terminal-2796704069-r14 { fill: #9e9ea2;font-weight: bold } -.terminal-2796704069-r15 { fill: #9c9c9d;font-weight: bold } -.terminal-2796704069-r16 { fill: #4a4a51 } -.terminal-2796704069-r17 { fill: #0973a3 } -.terminal-2796704069-r18 { fill: #191923 } -.terminal-2796704069-r19 { fill: #b2497e } -.terminal-2796704069-r20 { fill: #178941 } -.terminal-2796704069-r21 { fill: #19192d } -.terminal-2796704069-r22 { fill: #616166 } -.terminal-2796704069-r23 { fill: #616166;font-weight: bold } -.terminal-2796704069-r24 { fill: #090920 } -.terminal-2796704069-r25 { fill: #008042 } -.terminal-2796704069-r26 { fill: #65626d } -.terminal-2796704069-r27 { fill: #a72f2f } -.terminal-2796704069-r28 { fill: #20202a;font-weight: bold } -.terminal-2796704069-r29 { fill: #20202a } -.terminal-2796704069-r30 { fill: #707074 } -.terminal-2796704069-r31 { fill: #11111c } -.terminal-2796704069-r32 { fill: #80365e } -.terminal-2796704069-r33 { fill: #5e5e64 } -.terminal-2796704069-r34 { fill: #727276 } -.terminal-2796704069-r35 { fill: #535359 } -.terminal-2796704069-r36 { fill: #15151f } -.terminal-2796704069-r37 { fill: #027d51;font-weight: bold } -.terminal-2796704069-r38 { fill: #d13c8c } -.terminal-2796704069-r39 { fill: #210d17 } -.terminal-2796704069-r40 { fill: #707077 } -.terminal-2796704069-r41 { fill: #707077;font-weight: bold } + .terminal-3355451680-r1 { fill: #9c9c9d } +.terminal-3355451680-r2 { fill: #c5c8c6 } +.terminal-3355451680-r3 { fill: #dfdfe0 } +.terminal-3355451680-r4 { fill: #b2669a } +.terminal-3355451680-r5 { fill: #21131c;font-weight: bold } +.terminal-3355451680-r6 { fill: #0e0b15;text-decoration: underline; } +.terminal-3355451680-r7 { fill: #0e0b15 } +.terminal-3355451680-r8 { fill: #2e2540 } +.terminal-3355451680-r9 { fill: #50505e } +.terminal-3355451680-r10 { fill: #9d9da1 } +.terminal-3355451680-r11 { fill: #a79eaf } +.terminal-3355451680-r12 { fill: #6f6f73 } +.terminal-3355451680-r13 { fill: #45203a } +.terminal-3355451680-r14 { fill: #9e9ea2;font-weight: bold } +.terminal-3355451680-r15 { fill: #9c9c9d;font-weight: bold } +.terminal-3355451680-r16 { fill: #4a4a51 } +.terminal-3355451680-r17 { fill: #0973a3 } +.terminal-3355451680-r18 { fill: #191923 } +.terminal-3355451680-r19 { fill: #b2497e } +.terminal-3355451680-r20 { fill: #178941 } +.terminal-3355451680-r21 { fill: #19192d } +.terminal-3355451680-r22 { fill: #616166 } +.terminal-3355451680-r23 { fill: #616166;font-weight: bold } +.terminal-3355451680-r24 { fill: #090920 } +.terminal-3355451680-r25 { fill: #008042 } +.terminal-3355451680-r26 { fill: #65626d } +.terminal-3355451680-r27 { fill: #a72f2f } +.terminal-3355451680-r28 { fill: #20202a;font-weight: bold } +.terminal-3355451680-r29 { fill: #20202a } +.terminal-3355451680-r30 { fill: #707074 } +.terminal-3355451680-r31 { fill: #11111c } +.terminal-3355451680-r32 { fill: #80365e } +.terminal-3355451680-r33 { fill: #5e5e64 } +.terminal-3355451680-r34 { fill: #727276 } +.terminal-3355451680-r35 { fill: #535359 } +.terminal-3355451680-r36 { fill: #15151f } +.terminal-3355451680-r37 { fill: #027d51;font-weight: bold } +.terminal-3355451680-r38 { fill: #d13c8c } +.terminal-3355451680-r39 { fill: #210d17 } +.terminal-3355451680-r40 { fill: #707077 } +.terminal-3355451680-r41 { fill: #707077;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -1GET2Enter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -tabT echo││qHeaderswBodyeQueryrAuthtInfoyScriptsuOptio -GET get random user  ││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post        ││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all      ││NameValue Add header  -GET get one      │╰─────────────────────────────────────────────────╯ -POS create       │╭────────────────────────────────────── Response ─╮ -DEL delete a post││aBodysHeadersdCookiesfTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱Press a key to jump╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -ESC to dismiss                                  + + + + +Posting                                                                    + +1GET2Enter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +tabT echo││qHeaderswBodyeQueryrAuthtInfoyScriptsuOptio +GET get random user  ││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post        ││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all      ││NameValue Add header  +GET get one      │╰─────────────────────────────────────────────────╯ +POS create       │╭────────────────────────────────────── Response ─╮ +DEL delete a post││aBodysHeadersdCookiesfScriptsgTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱Press a key to jump╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +ESC to dismiss                                  diff --git a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__auth.svg b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__auth.svg index b4141ae1..c92e7900 100644 --- a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__auth.svg +++ b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__auth.svg @@ -19,249 +19,249 @@ font-weight: 700; } - .terminal-3023361312-matrix { + .terminal-245710634-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3023361312-title { + .terminal-245710634-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3023361312-r1 { fill: #dfdfe1 } -.terminal-3023361312-r2 { fill: #c5c8c6 } -.terminal-3023361312-r3 { fill: #ff93dd } -.terminal-3023361312-r4 { fill: #15111e;text-decoration: underline; } -.terminal-3023361312-r5 { fill: #15111e } -.terminal-3023361312-r6 { fill: #43365c } -.terminal-3023361312-r7 { fill: #ff69b4 } -.terminal-3023361312-r8 { fill: #9393a3 } -.terminal-3023361312-r9 { fill: #a684e8 } -.terminal-3023361312-r10 { fill: #e1e1e6 } -.terminal-3023361312-r11 { fill: #efe3fb } -.terminal-3023361312-r12 { fill: #9f9fa5 } -.terminal-3023361312-r13 { fill: #632e53 } -.terminal-3023361312-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-3023361312-r15 { fill: #0ea5e9 } -.terminal-3023361312-r16 { fill: #6a6a74 } -.terminal-3023361312-r17 { fill: #58d1eb;font-weight: bold } -.terminal-3023361312-r18 { fill: #873c69 } -.terminal-3023361312-r19 { fill: #e3e3e8;font-weight: bold } -.terminal-3023361312-r20 { fill: #8b8b93 } -.terminal-3023361312-r21 { fill: #8b8b93;font-weight: bold } -.terminal-3023361312-r22 { fill: #e0e0e2 } -.terminal-3023361312-r23 { fill: #a2a2a8 } -.terminal-3023361312-r24 { fill: #00b85f } -.terminal-3023361312-r25 { fill: #22c55e } -.terminal-3023361312-r26 { fill: #ef4444 } -.terminal-3023361312-r27 { fill: #ff4500 } -.terminal-3023361312-r28 { fill: #f59e0b } -.terminal-3023361312-r29 { fill: #2e2e3c;font-weight: bold } -.terminal-3023361312-r30 { fill: #2e2e3c } -.terminal-3023361312-r31 { fill: #a0a0a6 } -.terminal-3023361312-r32 { fill: #191928 } -.terminal-3023361312-r33 { fill: #b74e87 } -.terminal-3023361312-r34 { fill: #87878f } -.terminal-3023361312-r35 { fill: #a3a3a9 } -.terminal-3023361312-r36 { fill: #777780 } -.terminal-3023361312-r37 { fill: #1f1f2d } -.terminal-3023361312-r38 { fill: #04b375;font-weight: bold } -.terminal-3023361312-r39 { fill: #ff7ec8;font-weight: bold } -.terminal-3023361312-r40 { fill: #dbdbdd } + .terminal-245710634-r1 { fill: #dfdfe1 } +.terminal-245710634-r2 { fill: #c5c8c6 } +.terminal-245710634-r3 { fill: #ff93dd } +.terminal-245710634-r4 { fill: #15111e;text-decoration: underline; } +.terminal-245710634-r5 { fill: #15111e } +.terminal-245710634-r6 { fill: #43365c } +.terminal-245710634-r7 { fill: #ff69b4 } +.terminal-245710634-r8 { fill: #9393a3 } +.terminal-245710634-r9 { fill: #a684e8 } +.terminal-245710634-r10 { fill: #e1e1e6 } +.terminal-245710634-r11 { fill: #efe3fb } +.terminal-245710634-r12 { fill: #9f9fa5 } +.terminal-245710634-r13 { fill: #632e53 } +.terminal-245710634-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-245710634-r15 { fill: #0ea5e9 } +.terminal-245710634-r16 { fill: #6a6a74 } +.terminal-245710634-r17 { fill: #58d1eb;font-weight: bold } +.terminal-245710634-r18 { fill: #873c69 } +.terminal-245710634-r19 { fill: #e3e3e8;font-weight: bold } +.terminal-245710634-r20 { fill: #8b8b93 } +.terminal-245710634-r21 { fill: #8b8b93;font-weight: bold } +.terminal-245710634-r22 { fill: #e0e0e2 } +.terminal-245710634-r23 { fill: #a2a2a8 } +.terminal-245710634-r24 { fill: #00b85f } +.terminal-245710634-r25 { fill: #22c55e } +.terminal-245710634-r26 { fill: #ef4444 } +.terminal-245710634-r27 { fill: #ff4500 } +.terminal-245710634-r28 { fill: #f59e0b } +.terminal-245710634-r29 { fill: #2e2e3c;font-weight: bold } +.terminal-245710634-r30 { fill: #2e2e3c } +.terminal-245710634-r31 { fill: #a0a0a6 } +.terminal-245710634-r32 { fill: #191928 } +.terminal-245710634-r33 { fill: #b74e87 } +.terminal-245710634-r34 { fill: #87878f } +.terminal-245710634-r35 { fill: #a3a3a9 } +.terminal-245710634-r36 { fill: #777780 } +.terminal-245710634-r37 { fill: #1f1f2d } +.terminal-245710634-r38 { fill: #04b375;font-weight: bold } +.terminal-245710634-r39 { fill: #ff7ec8;font-weight: bold } +.terminal-245710634-r40 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -POSThttps://postman-echo.com/post                       Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echodersBodyQueryAuthInfoScriptsOption -GET get random user━━━━━━━━━━━━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━━━━━━━━ -█ POS echo postAuth type             Authorization headers -▼ jsonplaceholder/Basicwill be generated  -▼ posts/when the request is  -GET get allsent. -GET get one -POS createUsername                                      -DEL delete a postdarren                                      -▼ comments/ -GET get commentsPassword                                      -GET get comments$domain -PUT edit a comme -▼ todos/ -GET get all -GET get one -▼ users/╰─────────────────────────────────────────────────╯ -GET get a user│╭────────────────────────────────────── Response ─╮ -GET get all users││BodyHeadersCookiesTrace -POS create a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -PUT update a user││ -DEL delete a user││ -││ -││ -││ -││ -││ -││ -││ -││ -││ -││ -│───────────────────────││ -Echo server for post ││ -requests.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +POSThttps://postman-echo.com/post                       Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echodersBodyQueryAuthInfoScriptsOption +GET get random user━━━━━━━━━━━━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━━━━━━━━ +█ POS echo postAuth type             Authorization headers +▼ jsonplaceholder/Basicwill be generated  +▼ posts/when the request is  +GET get allsent. +GET get one +POS createUsername                                      +DEL delete a postdarren                                      +▼ comments/ +GET get commentsPassword                                      +GET get comments$domain +PUT edit a comme +▼ todos/ +GET get all +GET get one +▼ users/╰─────────────────────────────────────────────────╯ +GET get a user│╭────────────────────────────────────── Response ─╮ +GET get all users││BodyHeadersCookiesScriptsTrace +POS create a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +PUT update a user││ +DEL delete a user││ +││ +││ +││ +││ +││ +││ +││ +││ +││ +││ +│───────────────────────││ +Echo server for post ││ +requests.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__body.svg b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__body.svg index 14da0585..3357cc90 100644 --- a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__body.svg +++ b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__body.svg @@ -19,216 +19,216 @@ font-weight: 700; } - .terminal-1133807263-matrix { + .terminal-58454170-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1133807263-title { + .terminal-58454170-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1133807263-r1 { fill: #dfdfe1 } -.terminal-1133807263-r2 { fill: #c5c8c6 } -.terminal-1133807263-r3 { fill: #ff93dd } -.terminal-1133807263-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1133807263-r5 { fill: #15111e } -.terminal-1133807263-r6 { fill: #43365c } -.terminal-1133807263-r7 { fill: #ff69b4 } -.terminal-1133807263-r8 { fill: #9393a3 } -.terminal-1133807263-r9 { fill: #a684e8 } -.terminal-1133807263-r10 { fill: #e1e1e6 } -.terminal-1133807263-r11 { fill: #efe3fb } -.terminal-1133807263-r12 { fill: #9f9fa5 } -.terminal-1133807263-r13 { fill: #632e53 } -.terminal-1133807263-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-1133807263-r15 { fill: #0ea5e9 } -.terminal-1133807263-r16 { fill: #6a6a74 } -.terminal-1133807263-r17 { fill: #58d1eb;font-weight: bold } -.terminal-1133807263-r18 { fill: #873c69 } -.terminal-1133807263-r19 { fill: #22c55e } -.terminal-1133807263-r20 { fill: #e0e0e2 } -.terminal-1133807263-r21 { fill: #a2a2a8 } -.terminal-1133807263-r22 { fill: #8b8b93 } -.terminal-1133807263-r23 { fill: #8b8b93;font-weight: bold } -.terminal-1133807263-r24 { fill: #a2a2a8;font-weight: bold } -.terminal-1133807263-r25 { fill: #e8e8e9 } -.terminal-1133807263-r26 { fill: #00b85f } -.terminal-1133807263-r27 { fill: #6f6f78 } -.terminal-1133807263-r28 { fill: #f92672;font-weight: bold } -.terminal-1133807263-r29 { fill: #e6db74 } -.terminal-1133807263-r30 { fill: #ae81ff } -.terminal-1133807263-r31 { fill: #e3e3e8;font-weight: bold } -.terminal-1133807263-r32 { fill: #ef4444 } -.terminal-1133807263-r33 { fill: #87878f } -.terminal-1133807263-r34 { fill: #30303b } -.terminal-1133807263-r35 { fill: #00fa9a;font-weight: bold } -.terminal-1133807263-r36 { fill: #f59e0b } -.terminal-1133807263-r37 { fill: #2e2e3c;font-weight: bold } -.terminal-1133807263-r38 { fill: #2e2e3c } -.terminal-1133807263-r39 { fill: #a0a0a6 } -.terminal-1133807263-r40 { fill: #191928 } -.terminal-1133807263-r41 { fill: #b74e87 } -.terminal-1133807263-r42 { fill: #a3a3a9 } -.terminal-1133807263-r43 { fill: #777780 } -.terminal-1133807263-r44 { fill: #1f1f2d } -.terminal-1133807263-r45 { fill: #04b375;font-weight: bold } -.terminal-1133807263-r46 { fill: #ff7ec8;font-weight: bold } -.terminal-1133807263-r47 { fill: #dbdbdd } + .terminal-58454170-r1 { fill: #dfdfe1 } +.terminal-58454170-r2 { fill: #c5c8c6 } +.terminal-58454170-r3 { fill: #ff93dd } +.terminal-58454170-r4 { fill: #15111e;text-decoration: underline; } +.terminal-58454170-r5 { fill: #15111e } +.terminal-58454170-r6 { fill: #43365c } +.terminal-58454170-r7 { fill: #ff69b4 } +.terminal-58454170-r8 { fill: #9393a3 } +.terminal-58454170-r9 { fill: #a684e8 } +.terminal-58454170-r10 { fill: #e1e1e6 } +.terminal-58454170-r11 { fill: #efe3fb } +.terminal-58454170-r12 { fill: #9f9fa5 } +.terminal-58454170-r13 { fill: #632e53 } +.terminal-58454170-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-58454170-r15 { fill: #0ea5e9 } +.terminal-58454170-r16 { fill: #6a6a74 } +.terminal-58454170-r17 { fill: #58d1eb;font-weight: bold } +.terminal-58454170-r18 { fill: #873c69 } +.terminal-58454170-r19 { fill: #22c55e } +.terminal-58454170-r20 { fill: #e0e0e2 } +.terminal-58454170-r21 { fill: #a2a2a8 } +.terminal-58454170-r22 { fill: #8b8b93 } +.terminal-58454170-r23 { fill: #8b8b93;font-weight: bold } +.terminal-58454170-r24 { fill: #a2a2a8;font-weight: bold } +.terminal-58454170-r25 { fill: #e8e8e9 } +.terminal-58454170-r26 { fill: #00b85f } +.terminal-58454170-r27 { fill: #6f6f78 } +.terminal-58454170-r28 { fill: #f92672;font-weight: bold } +.terminal-58454170-r29 { fill: #e6db74 } +.terminal-58454170-r30 { fill: #ae81ff } +.terminal-58454170-r31 { fill: #e3e3e8;font-weight: bold } +.terminal-58454170-r32 { fill: #ef4444 } +.terminal-58454170-r33 { fill: #87878f } +.terminal-58454170-r34 { fill: #30303b } +.terminal-58454170-r35 { fill: #00fa9a;font-weight: bold } +.terminal-58454170-r36 { fill: #f59e0b } +.terminal-58454170-r37 { fill: #2e2e3c;font-weight: bold } +.terminal-58454170-r38 { fill: #2e2e3c } +.terminal-58454170-r39 { fill: #a0a0a6 } +.terminal-58454170-r40 { fill: #191928 } +.terminal-58454170-r41 { fill: #b74e87 } +.terminal-58454170-r42 { fill: #a3a3a9 } +.terminal-58454170-r43 { fill: #777780 } +.terminal-58454170-r44 { fill: #1f1f2d } +.terminal-58454170-r45 { fill: #04b375;font-weight: bold } +.terminal-58454170-r46 { fill: #ff7ec8;font-weight: bold } +.terminal-58454170-r47 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -POSThttps://jsonplaceholder.typicode.com/posts          Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoScriptsOpt -GET get random user━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo postRaw (json, text, etc.) -▼ jsonplaceholder/1  { -▼ posts/2  "title""foo",                            -GET get all3  "body""bar",                             -GET get one4  "userId"1 -█ POS create5  } -DEL delete a post -▼ comments/ -GET get comments1:1JSONWrap X -GET get comments╰─────────────────────────────────────────────────╯ -PUT edit a comme│╭────────────────────────────────────── Response ─╮ -▼ todos/││BodyHeadersCookiesTrace -GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get one││ -▼ users/││ -GET get a user││ -GET get all users││ -POS create a user││ -PUT update a user││ -DEL delete a user││ -││ -│───────────────────────││ -Create a new post││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +POSThttps://jsonplaceholder.typicode.com/posts          Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOpt +GET get random user━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo postRaw (json, text, etc.) +▼ jsonplaceholder/1  { +▼ posts/2  "title""foo",                            +GET get all3  "body""bar",                             +GET get one4  "userId"1 +█ POS create5  } +DEL delete a post +▼ comments/ +GET get comments1:1JSONWrap X +GET get comments╰─────────────────────────────────────────────────╯ +PUT edit a comme│╭────────────────────────────────────── Response ─╮ +▼ todos/││BodyHeadersCookiesScriptsTrace +GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get one││ +▼ users/││ +GET get a user││ +GET get all users││ +POS create a user││ +PUT update a user││ +DEL delete a user││ +││ +│───────────────────────││ +Create a new post││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__headers.svg b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__headers.svg index 29a523d0..154b4b74 100644 --- a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__headers.svg +++ b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__headers.svg @@ -19,206 +19,206 @@ font-weight: 700; } - .terminal-2179915091-matrix { + .terminal-4062463837-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2179915091-title { + .terminal-4062463837-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2179915091-r1 { fill: #dfdfe1 } -.terminal-2179915091-r2 { fill: #c5c8c6 } -.terminal-2179915091-r3 { fill: #ff93dd } -.terminal-2179915091-r4 { fill: #15111e;text-decoration: underline; } -.terminal-2179915091-r5 { fill: #15111e } -.terminal-2179915091-r6 { fill: #43365c } -.terminal-2179915091-r7 { fill: #737387 } -.terminal-2179915091-r8 { fill: #e1e1e6 } -.terminal-2179915091-r9 { fill: #efe3fb } -.terminal-2179915091-r10 { fill: #9f9fa5 } -.terminal-2179915091-r11 { fill: #ff69b4 } -.terminal-2179915091-r12 { fill: #dfdfe1;font-weight: bold } -.terminal-2179915091-r13 { fill: #632e53 } -.terminal-2179915091-r14 { fill: #0ea5e9 } -.terminal-2179915091-r15 { fill: #6a6a74 } -.terminal-2179915091-r16 { fill: #252532 } -.terminal-2179915091-r17 { fill: #22c55e } -.terminal-2179915091-r18 { fill: #252441 } -.terminal-2179915091-r19 { fill: #8b8b93 } -.terminal-2179915091-r20 { fill: #8b8b93;font-weight: bold } -.terminal-2179915091-r21 { fill: #00b85f } -.terminal-2179915091-r22 { fill: #210d17;font-weight: bold } -.terminal-2179915091-r23 { fill: #918d9d } -.terminal-2179915091-r24 { fill: #f59e0b } -.terminal-2179915091-r25 { fill: #ef4444 } -.terminal-2179915091-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-2179915091-r27 { fill: #2e2e3c } -.terminal-2179915091-r28 { fill: #a0a0a6 } -.terminal-2179915091-r29 { fill: #191928 } -.terminal-2179915091-r30 { fill: #b74e87 } -.terminal-2179915091-r31 { fill: #87878f } -.terminal-2179915091-r32 { fill: #a3a3a9 } -.terminal-2179915091-r33 { fill: #777780 } -.terminal-2179915091-r34 { fill: #1f1f2d } -.terminal-2179915091-r35 { fill: #04b375;font-weight: bold } -.terminal-2179915091-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-2179915091-r37 { fill: #dbdbdd } + .terminal-4062463837-r1 { fill: #dfdfe1 } +.terminal-4062463837-r2 { fill: #c5c8c6 } +.terminal-4062463837-r3 { fill: #ff93dd } +.terminal-4062463837-r4 { fill: #15111e;text-decoration: underline; } +.terminal-4062463837-r5 { fill: #15111e } +.terminal-4062463837-r6 { fill: #43365c } +.terminal-4062463837-r7 { fill: #737387 } +.terminal-4062463837-r8 { fill: #e1e1e6 } +.terminal-4062463837-r9 { fill: #efe3fb } +.terminal-4062463837-r10 { fill: #9f9fa5 } +.terminal-4062463837-r11 { fill: #ff69b4 } +.terminal-4062463837-r12 { fill: #dfdfe1;font-weight: bold } +.terminal-4062463837-r13 { fill: #632e53 } +.terminal-4062463837-r14 { fill: #0ea5e9 } +.terminal-4062463837-r15 { fill: #6a6a74 } +.terminal-4062463837-r16 { fill: #252532 } +.terminal-4062463837-r17 { fill: #22c55e } +.terminal-4062463837-r18 { fill: #252441 } +.terminal-4062463837-r19 { fill: #8b8b93 } +.terminal-4062463837-r20 { fill: #8b8b93;font-weight: bold } +.terminal-4062463837-r21 { fill: #00b85f } +.terminal-4062463837-r22 { fill: #210d17;font-weight: bold } +.terminal-4062463837-r23 { fill: #918d9d } +.terminal-4062463837-r24 { fill: #f59e0b } +.terminal-4062463837-r25 { fill: #ef4444 } +.terminal-4062463837-r26 { fill: #2e2e3c;font-weight: bold } +.terminal-4062463837-r27 { fill: #2e2e3c } +.terminal-4062463837-r28 { fill: #a0a0a6 } +.terminal-4062463837-r29 { fill: #191928 } +.terminal-4062463837-r30 { fill: #b74e87 } +.terminal-4062463837-r31 { fill: #87878f } +.terminal-4062463837-r32 { fill: #a3a3a9 } +.terminal-4062463837-r33 { fill: #777780 } +.terminal-4062463837-r34 { fill: #1f1f2d } +.terminal-4062463837-r35 { fill: #04b375;font-weight: bold } +.terminal-4062463837-r36 { fill: #ff7ec8;font-weight: bold } +.terminal-4062463837-r37 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoScriptsOptio -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▶ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ todos/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get one╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ users/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get a user╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all usersNameValue Add header  -POS create a user╰─────────────────────────────────────────────────╯ -PUT update a user╭────────────────────────────────────── Response ─╮ -DEL delete a userBodyHeadersCookiesTrace -━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - - - - - - - - -1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▶ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ todos/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get one╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ users/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get a user╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all usersNameValue Add header  +POS create a user╰─────────────────────────────────────────────────╯ +PUT update a user╭────────────────────────────────────── Response ─╮ +DEL delete a userBodyHeadersCookiesScriptsTrace +━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + + + + + + + + +1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump diff --git a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__options.svg b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__options.svg index 604cb43d..7fb06380 100644 --- a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__options.svg +++ b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__options.svg @@ -19,248 +19,248 @@ font-weight: 700; } - .terminal-297766357-matrix { + .terminal-3129341904-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-297766357-title { + .terminal-3129341904-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-297766357-r1 { fill: #dfdfe1 } -.terminal-297766357-r2 { fill: #c5c8c6 } -.terminal-297766357-r3 { fill: #ff93dd } -.terminal-297766357-r4 { fill: #15111e;text-decoration: underline; } -.terminal-297766357-r5 { fill: #15111e } -.terminal-297766357-r6 { fill: #43365c } -.terminal-297766357-r7 { fill: #ff69b4 } -.terminal-297766357-r8 { fill: #9393a3 } -.terminal-297766357-r9 { fill: #a684e8 } -.terminal-297766357-r10 { fill: #e1e1e6 } -.terminal-297766357-r11 { fill: #efe3fb } -.terminal-297766357-r12 { fill: #9f9fa5 } -.terminal-297766357-r13 { fill: #632e53 } -.terminal-297766357-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-297766357-r15 { fill: #0ea5e9 } -.terminal-297766357-r16 { fill: #6a6a74 } -.terminal-297766357-r17 { fill: #58d1eb;font-weight: bold } -.terminal-297766357-r18 { fill: #873c69 } -.terminal-297766357-r19 { fill: #e3e3e8;font-weight: bold } -.terminal-297766357-r20 { fill: #30303b } -.terminal-297766357-r21 { fill: #00fa9a;font-weight: bold } -.terminal-297766357-r22 { fill: #8b8b93 } -.terminal-297766357-r23 { fill: #8b8b93;font-weight: bold } -.terminal-297766357-r24 { fill: #00b85f } -.terminal-297766357-r25 { fill: #22c55e } -.terminal-297766357-r26 { fill: #ef4444 } -.terminal-297766357-r27 { fill: #f59e0b } -.terminal-297766357-r28 { fill: #2e2e3c;font-weight: bold } -.terminal-297766357-r29 { fill: #2e2e3c } -.terminal-297766357-r30 { fill: #a0a0a6 } -.terminal-297766357-r31 { fill: #191928 } -.terminal-297766357-r32 { fill: #b74e87 } -.terminal-297766357-r33 { fill: #87878f } -.terminal-297766357-r34 { fill: #a3a3a9 } -.terminal-297766357-r35 { fill: #777780 } -.terminal-297766357-r36 { fill: #1f1f2d } -.terminal-297766357-r37 { fill: #04b375;font-weight: bold } -.terminal-297766357-r38 { fill: #ff7ec8;font-weight: bold } -.terminal-297766357-r39 { fill: #dbdbdd } + .terminal-3129341904-r1 { fill: #dfdfe1 } +.terminal-3129341904-r2 { fill: #c5c8c6 } +.terminal-3129341904-r3 { fill: #ff93dd } +.terminal-3129341904-r4 { fill: #15111e;text-decoration: underline; } +.terminal-3129341904-r5 { fill: #15111e } +.terminal-3129341904-r6 { fill: #43365c } +.terminal-3129341904-r7 { fill: #ff69b4 } +.terminal-3129341904-r8 { fill: #9393a3 } +.terminal-3129341904-r9 { fill: #a684e8 } +.terminal-3129341904-r10 { fill: #e1e1e6 } +.terminal-3129341904-r11 { fill: #efe3fb } +.terminal-3129341904-r12 { fill: #9f9fa5 } +.terminal-3129341904-r13 { fill: #632e53 } +.terminal-3129341904-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-3129341904-r15 { fill: #0ea5e9 } +.terminal-3129341904-r16 { fill: #6a6a74 } +.terminal-3129341904-r17 { fill: #58d1eb;font-weight: bold } +.terminal-3129341904-r18 { fill: #873c69 } +.terminal-3129341904-r19 { fill: #e3e3e8;font-weight: bold } +.terminal-3129341904-r20 { fill: #30303b } +.terminal-3129341904-r21 { fill: #00fa9a;font-weight: bold } +.terminal-3129341904-r22 { fill: #8b8b93 } +.terminal-3129341904-r23 { fill: #8b8b93;font-weight: bold } +.terminal-3129341904-r24 { fill: #00b85f } +.terminal-3129341904-r25 { fill: #22c55e } +.terminal-3129341904-r26 { fill: #ef4444 } +.terminal-3129341904-r27 { fill: #f59e0b } +.terminal-3129341904-r28 { fill: #2e2e3c;font-weight: bold } +.terminal-3129341904-r29 { fill: #2e2e3c } +.terminal-3129341904-r30 { fill: #a0a0a6 } +.terminal-3129341904-r31 { fill: #191928 } +.terminal-3129341904-r32 { fill: #b74e87 } +.terminal-3129341904-r33 { fill: #87878f } +.terminal-3129341904-r34 { fill: #a3a3a9 } +.terminal-3129341904-r35 { fill: #777780 } +.terminal-3129341904-r36 { fill: #1f1f2d } +.terminal-3129341904-r37 { fill: #04b375;font-weight: bold } +.terminal-3129341904-r38 { fill: #ff7ec8;font-weight: bold } +.terminal-3129341904-r39 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -POSThttps://postman-echo.com/post                       Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echorsBodyQueryAuthInfoScriptsOptions -GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━ -█ POS echo postX Follow redirects -▼ jsonplaceholder/ -▼ posts/X Verify SSL certificates -GET get all -GET get oneX Attach cookies -POS create -DEL delete a postProxy URL                                      -▼ comments/ -GET get comments -GET get commentsTimeout                                        -PUT edit a comme0.2                                      -▼ todos/ -GET get all -GET get one -▼ users/╰─────────────────────────────────────────────────╯ -GET get a user│╭────────────────────────────────────── Response ─╮ -GET get all users││BodyHeadersCookiesTrace -POS create a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -PUT update a user││ -DEL delete a user││ -││ -││ -││ -││ -││ -││ -││ -││ -││ -││ -│───────────────────────││ -Echo server for post ││ -requests.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +POSThttps://postman-echo.com/post                       Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echorsBodyQueryAuthInfoScriptsOptions +GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━ +█ POS echo postX Follow redirects +▼ jsonplaceholder/ +▼ posts/X Verify SSL certificates +GET get all +GET get oneX Attach cookies +POS create +DEL delete a postProxy URL                                      +▼ comments/ +GET get comments +GET get commentsTimeout                                        +PUT edit a comme0.2                                      +▼ todos/ +GET get all +GET get one +▼ users/╰─────────────────────────────────────────────────╯ +GET get a user│╭────────────────────────────────────── Response ─╮ +GET get all users││BodyHeadersCookiesScriptsTrace +POS create a user││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +PUT update a user││ +DEL delete a user││ +││ +││ +││ +││ +││ +││ +││ +││ +││ +││ +│───────────────────────││ +Echo server for post ││ +requests.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__query_params.svg b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__query_params.svg index ff1f9c30..a62d9117 100644 --- a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__query_params.svg +++ b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__query_params.svg @@ -19,214 +19,214 @@ font-weight: 700; } - .terminal-1118652764-matrix { + .terminal-1427682135-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1118652764-title { + .terminal-1427682135-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1118652764-r1 { fill: #dfdfe1 } -.terminal-1118652764-r2 { fill: #c5c8c6 } -.terminal-1118652764-r3 { fill: #ff93dd } -.terminal-1118652764-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1118652764-r5 { fill: #15111e } -.terminal-1118652764-r6 { fill: #43365c } -.terminal-1118652764-r7 { fill: #ff69b4 } -.terminal-1118652764-r8 { fill: #9393a3 } -.terminal-1118652764-r9 { fill: #a684e8 } -.terminal-1118652764-r10 { fill: #e1e1e6 } -.terminal-1118652764-r11 { fill: #efe3fb } -.terminal-1118652764-r12 { fill: #9f9fa5 } -.terminal-1118652764-r13 { fill: #632e53 } -.terminal-1118652764-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-1118652764-r15 { fill: #0ea5e9 } -.terminal-1118652764-r16 { fill: #6a6a74 } -.terminal-1118652764-r17 { fill: #58d1eb;font-weight: bold } -.terminal-1118652764-r18 { fill: #873c69 } -.terminal-1118652764-r19 { fill: #22c55e } -.terminal-1118652764-r20 { fill: #0f0f1f } -.terminal-1118652764-r21 { fill: #ede2f7 } -.terminal-1118652764-r22 { fill: #e1e0e4 } -.terminal-1118652764-r23 { fill: #e2e0e5 } -.terminal-1118652764-r24 { fill: #8b8b93 } -.terminal-1118652764-r25 { fill: #8b8b93;font-weight: bold } -.terminal-1118652764-r26 { fill: #e9e1f1 } -.terminal-1118652764-r27 { fill: #00b85f } -.terminal-1118652764-r28 { fill: #ef4444 } -.terminal-1118652764-r29 { fill: #737387 } -.terminal-1118652764-r30 { fill: #918d9d } -.terminal-1118652764-r31 { fill: #e3e3e8;font-weight: bold } -.terminal-1118652764-r32 { fill: #f59e0b } -.terminal-1118652764-r33 { fill: #2e2e3c;font-weight: bold } -.terminal-1118652764-r34 { fill: #2e2e3c } -.terminal-1118652764-r35 { fill: #a0a0a6 } -.terminal-1118652764-r36 { fill: #191928 } -.terminal-1118652764-r37 { fill: #b74e87 } -.terminal-1118652764-r38 { fill: #0d0e2e } -.terminal-1118652764-r39 { fill: #87878f } -.terminal-1118652764-r40 { fill: #a3a3a9 } -.terminal-1118652764-r41 { fill: #777780 } -.terminal-1118652764-r42 { fill: #1f1f2d } -.terminal-1118652764-r43 { fill: #04b375;font-weight: bold } -.terminal-1118652764-r44 { fill: #ff7ec8;font-weight: bold } -.terminal-1118652764-r45 { fill: #dbdbdd } + .terminal-1427682135-r1 { fill: #dfdfe1 } +.terminal-1427682135-r2 { fill: #c5c8c6 } +.terminal-1427682135-r3 { fill: #ff93dd } +.terminal-1427682135-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1427682135-r5 { fill: #15111e } +.terminal-1427682135-r6 { fill: #43365c } +.terminal-1427682135-r7 { fill: #ff69b4 } +.terminal-1427682135-r8 { fill: #9393a3 } +.terminal-1427682135-r9 { fill: #a684e8 } +.terminal-1427682135-r10 { fill: #e1e1e6 } +.terminal-1427682135-r11 { fill: #efe3fb } +.terminal-1427682135-r12 { fill: #9f9fa5 } +.terminal-1427682135-r13 { fill: #632e53 } +.terminal-1427682135-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-1427682135-r15 { fill: #0ea5e9 } +.terminal-1427682135-r16 { fill: #6a6a74 } +.terminal-1427682135-r17 { fill: #58d1eb;font-weight: bold } +.terminal-1427682135-r18 { fill: #873c69 } +.terminal-1427682135-r19 { fill: #22c55e } +.terminal-1427682135-r20 { fill: #0f0f1f } +.terminal-1427682135-r21 { fill: #ede2f7 } +.terminal-1427682135-r22 { fill: #e1e0e4 } +.terminal-1427682135-r23 { fill: #e2e0e5 } +.terminal-1427682135-r24 { fill: #8b8b93 } +.terminal-1427682135-r25 { fill: #8b8b93;font-weight: bold } +.terminal-1427682135-r26 { fill: #e9e1f1 } +.terminal-1427682135-r27 { fill: #00b85f } +.terminal-1427682135-r28 { fill: #ef4444 } +.terminal-1427682135-r29 { fill: #737387 } +.terminal-1427682135-r30 { fill: #918d9d } +.terminal-1427682135-r31 { fill: #e3e3e8;font-weight: bold } +.terminal-1427682135-r32 { fill: #f59e0b } +.terminal-1427682135-r33 { fill: #2e2e3c;font-weight: bold } +.terminal-1427682135-r34 { fill: #2e2e3c } +.terminal-1427682135-r35 { fill: #a0a0a6 } +.terminal-1427682135-r36 { fill: #191928 } +.terminal-1427682135-r37 { fill: #b74e87 } +.terminal-1427682135-r38 { fill: #0d0e2e } +.terminal-1427682135-r39 { fill: #87878f } +.terminal-1427682135-r40 { fill: #a3a3a9 } +.terminal-1427682135-r41 { fill: #777780 } +.terminal-1427682135-r42 { fill: #1f1f2d } +.terminal-1427682135-r43 { fill: #04b375;font-weight: bold } +.terminal-1427682135-r44 { fill: #ff7ec8;font-weight: bold } +.terminal-1427682135-r45 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttps://jsonplaceholder.typicode.com/comments       Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoScriptsOpt -GET get random user━━━━━━━━━━━━━━━━╸━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post postId                            1       -▼ jsonplaceholder/ foo                               bar     -▼ posts/ beep                              boop    -GET get all onetwothree                       123     -GET get one areallyreallyreallyreallylongkey  avalue  -POS create -DEL delete a post -▼ comments/ -GET get commentKeyValue Add   -█ GET get commen╰─────────────────────────────────────────────────╯ -PUT edit a comm│╭────────────────────────────────────── Response ─╮ -▼ todos/││BodyHeadersCookiesTrace -GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get one││ -▼ users/││ -GET get a user││ -GET get all users││ -POS create a user││ -PUT update a user││ -│───────────────────────││ -Retrieve the comments││ -for a post using the ││ -query string││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttps://jsonplaceholder.typicode.com/comments       Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOpt +GET get random user━━━━━━━━━━━━━━━━╸━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post postId                            1       +▼ jsonplaceholder/ foo                               bar     +▼ posts/ beep                              boop    +GET get all onetwothree                       123     +GET get one areallyreallyreallyreallylongkey  avalue  +POS create +DEL delete a post +▼ comments/ +GET get commentKeyValue Add   +█ GET get commen╰─────────────────────────────────────────────────╯ +PUT edit a comm│╭────────────────────────────────────── Response ─╮ +▼ todos/││BodyHeadersCookiesScriptsTrace +GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get one││ +▼ users/││ +GET get a user││ +GET get all users││ +POS create a user││ +PUT update a user││ +│───────────────────────││ +Retrieve the comments││ +for a post using the ││ +query string││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestMethodSelection.test_select_post_method.svg b/tests/__snapshots__/test_snapshots/TestMethodSelection.test_select_post_method.svg index 148321f4..bf1cbbab 100644 --- a/tests/__snapshots__/test_snapshots/TestMethodSelection.test_select_post_method.svg +++ b/tests/__snapshots__/test_snapshots/TestMethodSelection.test_select_post_method.svg @@ -19,166 +19,166 @@ font-weight: 700; } - .terminal-672678399-matrix { + .terminal-928820218-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-672678399-title { + .terminal-928820218-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-672678399-r1 { fill: #dfdfe1 } -.terminal-672678399-r2 { fill: #c5c8c6 } -.terminal-672678399-r3 { fill: #ff93dd } -.terminal-672678399-r4 { fill: #21101a;text-decoration: underline; } -.terminal-672678399-r5 { fill: #21101a } -.terminal-672678399-r6 { fill: #663250 } -.terminal-672678399-r7 { fill: #737387 } -.terminal-672678399-r8 { fill: #e1e1e6 } -.terminal-672678399-r9 { fill: #efe3fb } -.terminal-672678399-r10 { fill: #9f9fa5 } -.terminal-672678399-r11 { fill: #632e53 } -.terminal-672678399-r12 { fill: #e3e3e8;font-weight: bold } -.terminal-672678399-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-672678399-r14 { fill: #6a6a74 } -.terminal-672678399-r15 { fill: #0ea5e9 } -.terminal-672678399-r16 { fill: #252532 } -.terminal-672678399-r17 { fill: #ff69b4 } -.terminal-672678399-r18 { fill: #22c55e } -.terminal-672678399-r19 { fill: #252441 } -.terminal-672678399-r20 { fill: #8b8b93 } -.terminal-672678399-r21 { fill: #8b8b93;font-weight: bold } -.terminal-672678399-r22 { fill: #0d0e2e } -.terminal-672678399-r23 { fill: #00b85f } -.terminal-672678399-r24 { fill: #918d9d } -.terminal-672678399-r25 { fill: #ef4444 } -.terminal-672678399-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-672678399-r27 { fill: #2e2e3c } -.terminal-672678399-r28 { fill: #a0a0a6 } -.terminal-672678399-r29 { fill: #191928 } -.terminal-672678399-r30 { fill: #b74e87 } -.terminal-672678399-r31 { fill: #87878f } -.terminal-672678399-r32 { fill: #a3a3a9 } -.terminal-672678399-r33 { fill: #777780 } -.terminal-672678399-r34 { fill: #1f1f2d } -.terminal-672678399-r35 { fill: #04b375;font-weight: bold } -.terminal-672678399-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-672678399-r37 { fill: #dbdbdd } + .terminal-928820218-r1 { fill: #dfdfe1 } +.terminal-928820218-r2 { fill: #c5c8c6 } +.terminal-928820218-r3 { fill: #ff93dd } +.terminal-928820218-r4 { fill: #21101a;text-decoration: underline; } +.terminal-928820218-r5 { fill: #21101a } +.terminal-928820218-r6 { fill: #663250 } +.terminal-928820218-r7 { fill: #737387 } +.terminal-928820218-r8 { fill: #e1e1e6 } +.terminal-928820218-r9 { fill: #efe3fb } +.terminal-928820218-r10 { fill: #9f9fa5 } +.terminal-928820218-r11 { fill: #632e53 } +.terminal-928820218-r12 { fill: #e3e3e8;font-weight: bold } +.terminal-928820218-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-928820218-r14 { fill: #6a6a74 } +.terminal-928820218-r15 { fill: #0ea5e9 } +.terminal-928820218-r16 { fill: #252532 } +.terminal-928820218-r17 { fill: #ff69b4 } +.terminal-928820218-r18 { fill: #22c55e } +.terminal-928820218-r19 { fill: #252441 } +.terminal-928820218-r20 { fill: #8b8b93 } +.terminal-928820218-r21 { fill: #8b8b93;font-weight: bold } +.terminal-928820218-r22 { fill: #0d0e2e } +.terminal-928820218-r23 { fill: #00b85f } +.terminal-928820218-r24 { fill: #918d9d } +.terminal-928820218-r25 { fill: #ef4444 } +.terminal-928820218-r26 { fill: #2e2e3c;font-weight: bold } +.terminal-928820218-r27 { fill: #2e2e3c } +.terminal-928820218-r28 { fill: #a0a0a6 } +.terminal-928820218-r29 { fill: #191928 } +.terminal-928820218-r30 { fill: #b74e87 } +.terminal-928820218-r31 { fill: #87878f } +.terminal-928820218-r32 { fill: #a3a3a9 } +.terminal-928820218-r33 { fill: #777780 } +.terminal-928820218-r34 { fill: #1f1f2d } +.terminal-928820218-r35 { fill: #04b375;font-weight: bold } +.terminal-928820218-r36 { fill: #ff7ec8;font-weight: bold } +.terminal-928820218-r37 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -POSTEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoScriptsOptio -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +POSTEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echo││HeadersBodyQueryAuthInfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestNewRequest.test_dialog_loads_and_can_be_used.svg b/tests/__snapshots__/test_snapshots/TestNewRequest.test_dialog_loads_and_can_be_used.svg index 81641988..e12c3923 100644 --- a/tests/__snapshots__/test_snapshots/TestNewRequest.test_dialog_loads_and_can_be_used.svg +++ b/tests/__snapshots__/test_snapshots/TestNewRequest.test_dialog_loads_and_can_be_used.svg @@ -19,174 +19,175 @@ font-weight: 700; } - .terminal-1363701403-matrix { + .terminal-789658086-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1363701403-title { + .terminal-789658086-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1363701403-r1 { fill: #9c9c9d } -.terminal-1363701403-r2 { fill: #c5c8c6 } -.terminal-1363701403-r3 { fill: #dfdfe0 } -.terminal-1363701403-r4 { fill: #b2669a } -.terminal-1363701403-r5 { fill: #0e0b15;text-decoration: underline; } -.terminal-1363701403-r6 { fill: #0e0b15 } -.terminal-1363701403-r7 { fill: #2e2540 } -.terminal-1363701403-r8 { fill: #50505e } -.terminal-1363701403-r9 { fill: #2e2e3f } -.terminal-1363701403-r10 { fill: #dfdfe1;font-weight: bold } -.terminal-1363701403-r11 { fill: #9d9da1 } -.terminal-1363701403-r12 { fill: #a79eaf } -.terminal-1363701403-r13 { fill: #6f6f73 } -.terminal-1363701403-r14 { fill: #0f0f1f } -.terminal-1363701403-r15 { fill: #45203a } -.terminal-1363701403-r16 { fill: #dfdfe1 } -.terminal-1363701403-r17 { fill: #0973a3 } -.terminal-1363701403-r18 { fill: #e1e1e6 } -.terminal-1363701403-r19 { fill: #4a4a51 } -.terminal-1363701403-r20 { fill: #191923 } -.terminal-1363701403-r21 { fill: #178941 } -.terminal-1363701403-r22 { fill: #8b8b93 } -.terminal-1363701403-r23 { fill: #19192d } -.terminal-1363701403-r24 { fill: #616166 } -.terminal-1363701403-r25 { fill: #616166;font-weight: bold } -.terminal-1363701403-r26 { fill: #a5a5b2 } -.terminal-1363701403-r27 { fill: #008042 } -.terminal-1363701403-r28 { fill: #9e9ea2;font-weight: bold } -.terminal-1363701403-r29 { fill: #65626d } -.terminal-1363701403-r30 { fill: #403e62 } -.terminal-1363701403-r31 { fill: #e3e3e8 } -.terminal-1363701403-r32 { fill: #e5e4e9 } -.terminal-1363701403-r33 { fill: #210d17 } -.terminal-1363701403-r34 { fill: #a72f2f } -.terminal-1363701403-r35 { fill: #0d0e2e } -.terminal-1363701403-r36 { fill: #707074 } -.terminal-1363701403-r37 { fill: #11111c } -.terminal-1363701403-r38 { fill: #ab6e07 } -.terminal-1363701403-r39 { fill: #5e5e64 } -.terminal-1363701403-r40 { fill: #727276 } -.terminal-1363701403-r41 { fill: #535359 } -.terminal-1363701403-r42 { fill: #15151f } -.terminal-1363701403-r43 { fill: #027d51;font-weight: bold } -.terminal-1363701403-r44 { fill: #ff7ec8;font-weight: bold } -.terminal-1363701403-r45 { fill: #dadadb } + .terminal-789658086-r1 { fill: #9c9c9d } +.terminal-789658086-r2 { fill: #c5c8c6 } +.terminal-789658086-r3 { fill: #dfdfe0 } +.terminal-789658086-r4 { fill: #b2669a } +.terminal-789658086-r5 { fill: #0e0b15;text-decoration: underline; } +.terminal-789658086-r6 { fill: #0e0b15 } +.terminal-789658086-r7 { fill: #2e2540 } +.terminal-789658086-r8 { fill: #50505e } +.terminal-789658086-r9 { fill: #2e2e3f } +.terminal-789658086-r10 { fill: #dfdfe1;font-weight: bold } +.terminal-789658086-r11 { fill: #9d9da1 } +.terminal-789658086-r12 { fill: #a79eaf } +.terminal-789658086-r13 { fill: #6f6f73 } +.terminal-789658086-r14 { fill: #0f0f1f } +.terminal-789658086-r15 { fill: #45203a } +.terminal-789658086-r16 { fill: #dfdfe1 } +.terminal-789658086-r17 { fill: #0973a3 } +.terminal-789658086-r18 { fill: #e1e1e6 } +.terminal-789658086-r19 { fill: #4a4a51 } +.terminal-789658086-r20 { fill: #191923 } +.terminal-789658086-r21 { fill: #178941 } +.terminal-789658086-r22 { fill: #8b8b93 } +.terminal-789658086-r23 { fill: #19192d } +.terminal-789658086-r24 { fill: #616166 } +.terminal-789658086-r25 { fill: #616166;font-weight: bold } +.terminal-789658086-r26 { fill: #a5a5b2 } +.terminal-789658086-r27 { fill: #008042 } +.terminal-789658086-r28 { fill: #9e9ea2;font-weight: bold } +.terminal-789658086-r29 { fill: #65626d } +.terminal-789658086-r30 { fill: #403e62 } +.terminal-789658086-r31 { fill: #e3e3e8 } +.terminal-789658086-r32 { fill: #e5e4e9 } +.terminal-789658086-r33 { fill: #210d17 } +.terminal-789658086-r34 { fill: #a72f2f } +.terminal-789658086-r35 { fill: #0d0e2e } +.terminal-789658086-r36 { fill: #20202a } +.terminal-789658086-r37 { fill: #707074 } +.terminal-789658086-r38 { fill: #11111c } +.terminal-789658086-r39 { fill: #ab6e07 } +.terminal-789658086-r40 { fill: #5e5e64 } +.terminal-789658086-r41 { fill: #727276 } +.terminal-789658086-r42 { fill: #535359 } +.terminal-789658086-r43 { fill: #15151f } +.terminal-789658086-r44 { fill: #027d51;font-weight: bold } +.terminal-789658086-r45 { fill: #ff7ec8;font-weight: bold } +.terminal-789658086-r46 { fill: #dadadb } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter▁▁ New request ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ Send  - -╭─ Collection ────Title                            ─────── Request ─╮ -GET echo        foo                            oScriptsOptio -GET get random u━━━━━━━━━━━━━━━━━ -POS echo post   File name optional╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholderfoo               .posting.yamlrs.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all Description optional Add header  -GET get one bar─────────────────╯ -POS create  ────── Response ─╮ -DEL delete aDirectory                         -▼ comments/jsonplaceholder/posts          ━━━━━━━━━━━━━━━━━ -GET get co -GET get co▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ -PUT edit a comm││ -▼ todos/││ -GET get all      ││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - f3 Pager  f4 Editor  esc Cancel  ^n Create  + + + + +Posting                                                                    + +GETEnter▁▁ New request ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ Send  + +╭─ Collection ────Title                            ─────── Request ─╮ +GET echo        foo                            oScriptsOptio +GET get random u━━━━━━━━━━━━━━━━━ +POS echo post   File name optional╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholderfoo               .posting.yamlrs.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all Description optional Add header  +GET get one bar─────────────────╯ +POS create  ────── Response ─╮ +DEL delete aDirectory                        Trace +▼ comments/jsonplaceholder/posts          ━━━━━━━━━━━━━━━━━ +GET get co +GET get co▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +PUT edit a comm││ +▼ todos/││ +GET get all      ││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + f3 Pager  f4 Editor  esc Cancel  ^n Create  diff --git a/tests/__snapshots__/test_snapshots/TestNewRequest.test_new_request_added_to_tree_correctly_and_notification_shown.svg b/tests/__snapshots__/test_snapshots/TestNewRequest.test_new_request_added_to_tree_correctly_and_notification_shown.svg index 495a1f50..aa89a3f1 100644 --- a/tests/__snapshots__/test_snapshots/TestNewRequest.test_new_request_added_to_tree_correctly_and_notification_shown.svg +++ b/tests/__snapshots__/test_snapshots/TestNewRequest.test_new_request_added_to_tree_correctly_and_notification_shown.svg @@ -19,164 +19,164 @@ font-weight: 700; } - .terminal-1214287203-matrix { + .terminal-3433822046-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1214287203-title { + .terminal-3433822046-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1214287203-r1 { fill: #dfdfe1 } -.terminal-1214287203-r2 { fill: #c5c8c6 } -.terminal-1214287203-r3 { fill: #ff93dd } -.terminal-1214287203-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1214287203-r5 { fill: #15111e } -.terminal-1214287203-r6 { fill: #43365c } -.terminal-1214287203-r7 { fill: #737387 } -.terminal-1214287203-r8 { fill: #e1e1e6 } -.terminal-1214287203-r9 { fill: #efe3fb } -.terminal-1214287203-r10 { fill: #9f9fa5 } -.terminal-1214287203-r11 { fill: #ff69b4 } -.terminal-1214287203-r12 { fill: #dfdfe1;font-weight: bold } -.terminal-1214287203-r13 { fill: #632e53 } -.terminal-1214287203-r14 { fill: #0ea5e9 } -.terminal-1214287203-r15 { fill: #6a6a74 } -.terminal-1214287203-r16 { fill: #252532 } -.terminal-1214287203-r17 { fill: #22c55e } -.terminal-1214287203-r18 { fill: #252441 } -.terminal-1214287203-r19 { fill: #8b8b93 } -.terminal-1214287203-r20 { fill: #8b8b93;font-weight: bold } -.terminal-1214287203-r21 { fill: #00b85f } -.terminal-1214287203-r22 { fill: #210d17;font-weight: bold } -.terminal-1214287203-r23 { fill: #918d9d } -.terminal-1214287203-r24 { fill: #0d0e2e } -.terminal-1214287203-r25 { fill: #2e2e3c;font-weight: bold } -.terminal-1214287203-r26 { fill: #2e2e3c } -.terminal-1214287203-r27 { fill: #a0a0a6 } -.terminal-1214287203-r28 { fill: #ef4444 } -.terminal-1214287203-r29 { fill: #191928 } -.terminal-1214287203-r30 { fill: #b74e87 } -.terminal-1214287203-r31 { fill: #0cfa9f } -.terminal-1214287203-r32 { fill: #0ce48c;font-weight: bold } -.terminal-1214287203-r33 { fill: #e3e3e6 } -.terminal-1214287203-r34 { fill: #ff7ec8;font-weight: bold } -.terminal-1214287203-r35 { fill: #dbdbdd } + .terminal-3433822046-r1 { fill: #dfdfe1 } +.terminal-3433822046-r2 { fill: #c5c8c6 } +.terminal-3433822046-r3 { fill: #ff93dd } +.terminal-3433822046-r4 { fill: #15111e;text-decoration: underline; } +.terminal-3433822046-r5 { fill: #15111e } +.terminal-3433822046-r6 { fill: #43365c } +.terminal-3433822046-r7 { fill: #737387 } +.terminal-3433822046-r8 { fill: #e1e1e6 } +.terminal-3433822046-r9 { fill: #efe3fb } +.terminal-3433822046-r10 { fill: #9f9fa5 } +.terminal-3433822046-r11 { fill: #ff69b4 } +.terminal-3433822046-r12 { fill: #dfdfe1;font-weight: bold } +.terminal-3433822046-r13 { fill: #632e53 } +.terminal-3433822046-r14 { fill: #0ea5e9 } +.terminal-3433822046-r15 { fill: #6a6a74 } +.terminal-3433822046-r16 { fill: #252532 } +.terminal-3433822046-r17 { fill: #22c55e } +.terminal-3433822046-r18 { fill: #252441 } +.terminal-3433822046-r19 { fill: #8b8b93 } +.terminal-3433822046-r20 { fill: #8b8b93;font-weight: bold } +.terminal-3433822046-r21 { fill: #00b85f } +.terminal-3433822046-r22 { fill: #210d17;font-weight: bold } +.terminal-3433822046-r23 { fill: #918d9d } +.terminal-3433822046-r24 { fill: #0d0e2e } +.terminal-3433822046-r25 { fill: #2e2e3c;font-weight: bold } +.terminal-3433822046-r26 { fill: #2e2e3c } +.terminal-3433822046-r27 { fill: #a0a0a6 } +.terminal-3433822046-r28 { fill: #ef4444 } +.terminal-3433822046-r29 { fill: #191928 } +.terminal-3433822046-r30 { fill: #b74e87 } +.terminal-3433822046-r31 { fill: #0cfa9f } +.terminal-3433822046-r32 { fill: #0ce48c;font-weight: bold } +.terminal-3433822046-r33 { fill: #e3e3e6 } +.terminal-3433822046-r34 { fill: #ff7ec8;font-weight: bold } +.terminal-3433822046-r35 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoScriptsOptio -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -█ GET fooNameValue Add header  -GET get all╰─────────────────────────────────────────────────╯ -GET get one╭────────────────────────────────────── Response ─╮ -POS createBodyHeadersCookiesTrace -DEL delete a post━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -▼ comments/ -GET get comment -GET get comment -───────────────────────Request saved -barjsonplaceholder/posts/foo.posting.ya -╰── sample-collections ─╯╰───────────ml - d Dupe  ⌫ Delete  ^j Send  ^t Method + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +█ GET fooNameValue Add header  +GET get all╰─────────────────────────────────────────────────╯ +GET get one╭────────────────────────────────────── Response ─╮ +POS createBodyHeadersCookiesScriptsTrace +DEL delete a post━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +▼ comments/ +GET get comment +GET get comment +───────────────────────Request saved +barjsonplaceholder/posts/foo.posting.ya +╰── sample-collections ─╯╰───────────ml + d Dupe  ⌫ Delete  ^j Send  ^t Method diff --git a/tests/__snapshots__/test_snapshots/TestSave.test_no_request_selected__dialog_is_prefilled_correctly.svg b/tests/__snapshots__/test_snapshots/TestSave.test_no_request_selected__dialog_is_prefilled_correctly.svg index 567b1cd6..f5f9f3bc 100644 --- a/tests/__snapshots__/test_snapshots/TestSave.test_no_request_selected__dialog_is_prefilled_correctly.svg +++ b/tests/__snapshots__/test_snapshots/TestSave.test_no_request_selected__dialog_is_prefilled_correctly.svg @@ -19,174 +19,175 @@ font-weight: 700; } - .terminal-2261479457-matrix { + .terminal-1299397484-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2261479457-title { + .terminal-1299397484-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2261479457-r1 { fill: #9c9c9d } -.terminal-2261479457-r2 { fill: #c5c8c6 } -.terminal-2261479457-r3 { fill: #dfdfe0 } -.terminal-2261479457-r4 { fill: #b2669a } -.terminal-2261479457-r5 { fill: #0e0b15;text-decoration: underline; } -.terminal-2261479457-r6 { fill: #0e0b15 } -.terminal-2261479457-r7 { fill: #2e2540 } -.terminal-2261479457-r8 { fill: #50505e } -.terminal-2261479457-r9 { fill: #2e2e3f } -.terminal-2261479457-r10 { fill: #dfdfe1;font-weight: bold } -.terminal-2261479457-r11 { fill: #9d9da1 } -.terminal-2261479457-r12 { fill: #a79eaf } -.terminal-2261479457-r13 { fill: #6f6f73 } -.terminal-2261479457-r14 { fill: #0f0f1f } -.terminal-2261479457-r15 { fill: #45203a } -.terminal-2261479457-r16 { fill: #dfdfe1 } -.terminal-2261479457-r17 { fill: #0973a3 } -.terminal-2261479457-r18 { fill: #403e62 } -.terminal-2261479457-r19 { fill: #e3e3e8 } -.terminal-2261479457-r20 { fill: #210d17 } -.terminal-2261479457-r21 { fill: #4a4a51 } -.terminal-2261479457-r22 { fill: #191923 } -.terminal-2261479457-r23 { fill: #178941 } -.terminal-2261479457-r24 { fill: #8b8b93 } -.terminal-2261479457-r25 { fill: #616166 } -.terminal-2261479457-r26 { fill: #616166;font-weight: bold } -.terminal-2261479457-r27 { fill: #e1e1e6 } -.terminal-2261479457-r28 { fill: #a5a5b2 } -.terminal-2261479457-r29 { fill: #3b1c3c } -.terminal-2261479457-r30 { fill: #008042 } -.terminal-2261479457-r31 { fill: #9e9ea1 } -.terminal-2261479457-r32 { fill: #9e9ea2;font-weight: bold } -.terminal-2261479457-r33 { fill: #e2e2e6 } -.terminal-2261479457-r34 { fill: #a72f2f } -.terminal-2261479457-r35 { fill: #0d0e2e } -.terminal-2261479457-r36 { fill: #707074 } -.terminal-2261479457-r37 { fill: #11111c } -.terminal-2261479457-r38 { fill: #ab6e07 } -.terminal-2261479457-r39 { fill: #5e5e64 } -.terminal-2261479457-r40 { fill: #727276 } -.terminal-2261479457-r41 { fill: #535359 } -.terminal-2261479457-r42 { fill: #15151f } -.terminal-2261479457-r43 { fill: #027d51;font-weight: bold } -.terminal-2261479457-r44 { fill: #ff7ec8;font-weight: bold } -.terminal-2261479457-r45 { fill: #dadadb } + .terminal-1299397484-r1 { fill: #9c9c9d } +.terminal-1299397484-r2 { fill: #c5c8c6 } +.terminal-1299397484-r3 { fill: #dfdfe0 } +.terminal-1299397484-r4 { fill: #b2669a } +.terminal-1299397484-r5 { fill: #0e0b15;text-decoration: underline; } +.terminal-1299397484-r6 { fill: #0e0b15 } +.terminal-1299397484-r7 { fill: #2e2540 } +.terminal-1299397484-r8 { fill: #50505e } +.terminal-1299397484-r9 { fill: #2e2e3f } +.terminal-1299397484-r10 { fill: #dfdfe1;font-weight: bold } +.terminal-1299397484-r11 { fill: #9d9da1 } +.terminal-1299397484-r12 { fill: #a79eaf } +.terminal-1299397484-r13 { fill: #6f6f73 } +.terminal-1299397484-r14 { fill: #0f0f1f } +.terminal-1299397484-r15 { fill: #45203a } +.terminal-1299397484-r16 { fill: #dfdfe1 } +.terminal-1299397484-r17 { fill: #0973a3 } +.terminal-1299397484-r18 { fill: #403e62 } +.terminal-1299397484-r19 { fill: #e3e3e8 } +.terminal-1299397484-r20 { fill: #210d17 } +.terminal-1299397484-r21 { fill: #4a4a51 } +.terminal-1299397484-r22 { fill: #191923 } +.terminal-1299397484-r23 { fill: #178941 } +.terminal-1299397484-r24 { fill: #8b8b93 } +.terminal-1299397484-r25 { fill: #616166 } +.terminal-1299397484-r26 { fill: #616166;font-weight: bold } +.terminal-1299397484-r27 { fill: #e1e1e6 } +.terminal-1299397484-r28 { fill: #a5a5b2 } +.terminal-1299397484-r29 { fill: #3b1c3c } +.terminal-1299397484-r30 { fill: #008042 } +.terminal-1299397484-r31 { fill: #9e9ea1 } +.terminal-1299397484-r32 { fill: #9e9ea2;font-weight: bold } +.terminal-1299397484-r33 { fill: #e2e2e6 } +.terminal-1299397484-r34 { fill: #a72f2f } +.terminal-1299397484-r35 { fill: #0d0e2e } +.terminal-1299397484-r36 { fill: #20202a } +.terminal-1299397484-r37 { fill: #707074 } +.terminal-1299397484-r38 { fill: #11111c } +.terminal-1299397484-r39 { fill: #ab6e07 } +.terminal-1299397484-r40 { fill: #5e5e64 } +.terminal-1299397484-r41 { fill: #727276 } +.terminal-1299397484-r42 { fill: #535359 } +.terminal-1299397484-r43 { fill: #15151f } +.terminal-1299397484-r44 { fill: #027d51;font-weight: bold } +.terminal-1299397484-r45 { fill: #ff7ec8;font-weight: bold } +.terminal-1299397484-r46 { fill: #dadadb } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter▁▁ New request ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ Send  - -╭─ Collection ────Title                            ─────── Request ─╮ -GET echo        Foo: BarScriptsOptions -GET get random u━━━━━━━━━━━━━━━━━ -POS echo post   File name optional -▼ jsonplaceholderfoo-bar           .posting.yaml -▼ posts/ - GET get allDescription optional -GET get one baz                             ─────────────────╯ -POS create  ────── Response ─╮ -DEL delete aDirectory                         -▼ comments/jsonplaceholder/posts          ━━━━━━━━━━━━━━━━━ -GET get co -GET get co▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ -PUT edit a comm││ -│───────────────────────││ -Retrieve all posts││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - esc Cancel  ^n Create  + + + + +Posting                                                                    + +GETEnter▁▁ New request ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ Send  + +╭─ Collection ────Title                            ─────── Request ─╮ +GET echo        Foo: BarScriptsOptions +GET get random u━━━━━━━━━━━━━━━━━ +POS echo post   File name optional +▼ jsonplaceholderfoo-bar           .posting.yaml +▼ posts/ + GET get allDescription optional +GET get one baz                             ─────────────────╯ +POS create  ────── Response ─╮ +DEL delete aDirectory                        Trace +▼ comments/jsonplaceholder/posts          ━━━━━━━━━━━━━━━━━ +GET get co +GET get co▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +PUT edit a comm││ +│───────────────────────││ +Retrieve all posts││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + esc Cancel  ^n Create  diff --git a/tests/__snapshots__/test_snapshots/TestSendRequest.test_send_request.svg b/tests/__snapshots__/test_snapshots/TestSendRequest.test_send_request.svg index da2b4f67..18c53cf8 100644 --- a/tests/__snapshots__/test_snapshots/TestSendRequest.test_send_request.svg +++ b/tests/__snapshots__/test_snapshots/TestSendRequest.test_send_request.svg @@ -19,216 +19,216 @@ font-weight: 700; } - .terminal-2954263752-matrix { + .terminal-442820388-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2954263752-title { + .terminal-442820388-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2954263752-r1 { fill: #dfdfe1 } -.terminal-2954263752-r2 { fill: #c5c8c6 } -.terminal-2954263752-r3 { fill: #ff93dd } -.terminal-2954263752-r4 { fill: #15111e;text-decoration: underline; } -.terminal-2954263752-r5 { fill: #15111e } -.terminal-2954263752-r6 { fill: #43365c } -.terminal-2954263752-r7 { fill: #ff69b4 } -.terminal-2954263752-r8 { fill: #9393a3 } -.terminal-2954263752-r9 { fill: #a684e8 } -.terminal-2954263752-r10 { fill: #e1e1e6 } -.terminal-2954263752-r11 { fill: #00fa9a } -.terminal-2954263752-r12 { fill: #efe3fb } -.terminal-2954263752-r13 { fill: #9f9fa5 } -.terminal-2954263752-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-2954263752-r15 { fill: #632e53 } -.terminal-2954263752-r16 { fill: #0ea5e9 } -.terminal-2954263752-r17 { fill: #58d1eb;font-weight: bold } -.terminal-2954263752-r18 { fill: #6a6a74 } -.terminal-2954263752-r19 { fill: #252532 } -.terminal-2954263752-r20 { fill: #22c55e } -.terminal-2954263752-r21 { fill: #0f0f1f } -.terminal-2954263752-r22 { fill: #ede2f7 } -.terminal-2954263752-r23 { fill: #e1e0e4 } -.terminal-2954263752-r24 { fill: #e2e0e5 } -.terminal-2954263752-r25 { fill: #8b8b93 } -.terminal-2954263752-r26 { fill: #8b8b93;font-weight: bold } -.terminal-2954263752-r27 { fill: #e9e1f1 } -.terminal-2954263752-r28 { fill: #00b85f } -.terminal-2954263752-r29 { fill: #210d17;font-weight: bold } -.terminal-2954263752-r30 { fill: #ef4444 } -.terminal-2954263752-r31 { fill: #737387 } -.terminal-2954263752-r32 { fill: #918d9d } -.terminal-2954263752-r33 { fill: #f59e0b } -.terminal-2954263752-r34 { fill: #002014 } -.terminal-2954263752-r35 { fill: #a2a2a8;font-weight: bold } -.terminal-2954263752-r36 { fill: #e8e8e9 } -.terminal-2954263752-r37 { fill: #e0e0e2 } -.terminal-2954263752-r38 { fill: #6f6f78 } -.terminal-2954263752-r39 { fill: #f92672;font-weight: bold } -.terminal-2954263752-r40 { fill: #ae81ff } -.terminal-2954263752-r41 { fill: #e6db74 } -.terminal-2954263752-r42 { fill: #87878f } -.terminal-2954263752-r43 { fill: #a2a2a8 } -.terminal-2954263752-r44 { fill: #30303b } -.terminal-2954263752-r45 { fill: #00fa9a;font-weight: bold } -.terminal-2954263752-r46 { fill: #ff7ec8;font-weight: bold } -.terminal-2954263752-r47 { fill: #dbdbdd } + .terminal-442820388-r1 { fill: #dfdfe1 } +.terminal-442820388-r2 { fill: #c5c8c6 } +.terminal-442820388-r3 { fill: #ff93dd } +.terminal-442820388-r4 { fill: #15111e;text-decoration: underline; } +.terminal-442820388-r5 { fill: #15111e } +.terminal-442820388-r6 { fill: #43365c } +.terminal-442820388-r7 { fill: #ff69b4 } +.terminal-442820388-r8 { fill: #9393a3 } +.terminal-442820388-r9 { fill: #a684e8 } +.terminal-442820388-r10 { fill: #e1e1e6 } +.terminal-442820388-r11 { fill: #00fa9a } +.terminal-442820388-r12 { fill: #efe3fb } +.terminal-442820388-r13 { fill: #9f9fa5 } +.terminal-442820388-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-442820388-r15 { fill: #632e53 } +.terminal-442820388-r16 { fill: #0ea5e9 } +.terminal-442820388-r17 { fill: #58d1eb;font-weight: bold } +.terminal-442820388-r18 { fill: #6a6a74 } +.terminal-442820388-r19 { fill: #252532 } +.terminal-442820388-r20 { fill: #22c55e } +.terminal-442820388-r21 { fill: #0f0f1f } +.terminal-442820388-r22 { fill: #ede2f7 } +.terminal-442820388-r23 { fill: #e1e0e4 } +.terminal-442820388-r24 { fill: #e2e0e5 } +.terminal-442820388-r25 { fill: #8b8b93 } +.terminal-442820388-r26 { fill: #8b8b93;font-weight: bold } +.terminal-442820388-r27 { fill: #e9e1f1 } +.terminal-442820388-r28 { fill: #00b85f } +.terminal-442820388-r29 { fill: #210d17;font-weight: bold } +.terminal-442820388-r30 { fill: #ef4444 } +.terminal-442820388-r31 { fill: #737387 } +.terminal-442820388-r32 { fill: #918d9d } +.terminal-442820388-r33 { fill: #f59e0b } +.terminal-442820388-r34 { fill: #002014 } +.terminal-442820388-r35 { fill: #a2a2a8;font-weight: bold } +.terminal-442820388-r36 { fill: #e8e8e9 } +.terminal-442820388-r37 { fill: #e0e0e2 } +.terminal-442820388-r38 { fill: #6f6f78 } +.terminal-442820388-r39 { fill: #f92672;font-weight: bold } +.terminal-442820388-r40 { fill: #ae81ff } +.terminal-442820388-r41 { fill: #e6db74 } +.terminal-442820388-r42 { fill: #87878f } +.terminal-442820388-r43 { fill: #a2a2a8 } +.terminal-442820388-r44 { fill: #30303b } +.terminal-442820388-r45 { fill: #00fa9a;font-weight: bold } +.terminal-442820388-r46 { fill: #ff7ec8;font-weight: bold } +.terminal-442820388-r47 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                            - -GEThttps://jsonplaceholder.typicode.com/posts        ■■■■■■■ Send  - -╭─ Collection ────────────╮╭───────────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoScriptsOptions -GET get random user━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post Content-Type     application/json      -▼ jsonplaceholder/ Referer          https://example.com/  -▼ posts/ Accept-Encoding  gzip                  -█ GET get all Cache-Control    no-cache              -GET get one -POS create -DEL delete a post -▼ comments/ -GET get commentsNameValue Add header  -GET get comments (╰───────────────────────────────────────────────────────╯ -PUT edit a comment╭─────────────────────────────────── Response  200 OK ─╮ -▼ todos/BodyHeadersCookiesTrace -GET get all━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get one  1  [ -▼ users/  2    {                                             -GET get a user  3  "userId"1,                                -GET get all users  4  "id"1,                                    -POS create a user  5  "title""sunt aut facere repellat  -PUT update a userprovident occaecati excepturi optio  -DEL delete a userreprehenderit",                                 -  6  "body""quia et suscipit\nsuscipit  -─────────────────────────recusandae consequuntur expedita et  -Retrieve all posts1:1read-onlyJSONWrap X -╰──── sample-collections ─╯╰───────────────────────────────────────────────────────╯ - d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Qui + + + + +Posting                                                                            + +GEThttps://jsonplaceholder.typicode.com/posts        ■■■■■■■ Send  + +╭─ Collection ────────────╮╭───────────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOptions +GET get random user━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post Content-Type     application/json      +▼ jsonplaceholder/ Referer          https://example.com/  +▼ posts/ Accept-Encoding  gzip                  +█ GET get all Cache-Control    no-cache              +GET get one +POS create +DEL delete a post +▼ comments/ +GET get commentsNameValue Add header  +GET get comments (╰───────────────────────────────────────────────────────╯ +PUT edit a comment╭─────────────────────────────────── Response  200 OK ─╮ +▼ todos/BodyHeadersCookiesScriptsTrace +GET get all━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get one  1  [ +▼ users/  2    {                                             +GET get a user  3  "userId"1,                                +GET get all users  4  "id"1,                                    +POS create a user  5  "title""sunt aut facere repellat  +PUT update a userprovident occaecati excepturi optio  +DEL delete a userreprehenderit",                                 +  6  "body""quia et suscipit\nsuscipit  +─────────────────────────recusandae consequuntur expedita et  +Retrieve all posts1:1read-onlyJSONWrap X +╰──── sample-collections ─╯╰───────────────────────────────────────────────────────╯ + d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Qui diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_appears_on_typing.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_appears_on_typing.svg index 8c5f0f97..db50181e 100644 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_appears_on_typing.svg +++ b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_appears_on_typing.svg @@ -19,172 +19,172 @@ font-weight: 700; } - .terminal-2226392025-matrix { + .terminal-1949332948-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2226392025-title { + .terminal-1949332948-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2226392025-r1 { fill: #dfdfe1 } -.terminal-2226392025-r2 { fill: #c5c8c6 } -.terminal-2226392025-r3 { fill: #ff93dd } -.terminal-2226392025-r4 { fill: #15111e;text-decoration: underline; } -.terminal-2226392025-r5 { fill: #15111e } -.terminal-2226392025-r6 { fill: #43365c } -.terminal-2226392025-r7 { fill: #403e62 } -.terminal-2226392025-r8 { fill: #e3e3e8 } -.terminal-2226392025-r9 { fill: #210d17 } -.terminal-2226392025-r10 { fill: #efe3fb } -.terminal-2226392025-r11 { fill: #9f9fa5 } -.terminal-2226392025-r12 { fill: #ff69b4 } -.terminal-2226392025-r13 { fill: #170b21;font-weight: bold } -.terminal-2226392025-r14 { fill: #e5e5ea;font-weight: bold } -.terminal-2226392025-r15 { fill: #632e53 } -.terminal-2226392025-r16 { fill: #170b21 } -.terminal-2226392025-r17 { fill: #a5a5b2 } -.terminal-2226392025-r18 { fill: #e3e3e8;font-weight: bold } -.terminal-2226392025-r19 { fill: #6a6a74 } -.terminal-2226392025-r20 { fill: #0ea5e9 } -.terminal-2226392025-r21 { fill: #252532 } -.terminal-2226392025-r22 { fill: #22c55e } -.terminal-2226392025-r23 { fill: #252441 } -.terminal-2226392025-r24 { fill: #8b8b93 } -.terminal-2226392025-r25 { fill: #8b8b93;font-weight: bold } -.terminal-2226392025-r26 { fill: #0d0e2e } -.terminal-2226392025-r27 { fill: #00b85f } -.terminal-2226392025-r28 { fill: #737387 } -.terminal-2226392025-r29 { fill: #e1e1e6 } -.terminal-2226392025-r30 { fill: #918d9d } -.terminal-2226392025-r31 { fill: #ef4444 } -.terminal-2226392025-r32 { fill: #2e2e3c;font-weight: bold } -.terminal-2226392025-r33 { fill: #2e2e3c } -.terminal-2226392025-r34 { fill: #a0a0a6 } -.terminal-2226392025-r35 { fill: #191928 } -.terminal-2226392025-r36 { fill: #b74e87 } -.terminal-2226392025-r37 { fill: #87878f } -.terminal-2226392025-r38 { fill: #a3a3a9 } -.terminal-2226392025-r39 { fill: #777780 } -.terminal-2226392025-r40 { fill: #1f1f2d } -.terminal-2226392025-r41 { fill: #04b375;font-weight: bold } -.terminal-2226392025-r42 { fill: #ff7ec8;font-weight: bold } -.terminal-2226392025-r43 { fill: #dbdbdd } + .terminal-1949332948-r1 { fill: #dfdfe1 } +.terminal-1949332948-r2 { fill: #c5c8c6 } +.terminal-1949332948-r3 { fill: #ff93dd } +.terminal-1949332948-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1949332948-r5 { fill: #15111e } +.terminal-1949332948-r6 { fill: #43365c } +.terminal-1949332948-r7 { fill: #403e62 } +.terminal-1949332948-r8 { fill: #e3e3e8 } +.terminal-1949332948-r9 { fill: #210d17 } +.terminal-1949332948-r10 { fill: #efe3fb } +.terminal-1949332948-r11 { fill: #9f9fa5 } +.terminal-1949332948-r12 { fill: #ff69b4 } +.terminal-1949332948-r13 { fill: #170b21;font-weight: bold } +.terminal-1949332948-r14 { fill: #e5e5ea;font-weight: bold } +.terminal-1949332948-r15 { fill: #632e53 } +.terminal-1949332948-r16 { fill: #170b21 } +.terminal-1949332948-r17 { fill: #a5a5b2 } +.terminal-1949332948-r18 { fill: #e3e3e8;font-weight: bold } +.terminal-1949332948-r19 { fill: #6a6a74 } +.terminal-1949332948-r20 { fill: #0ea5e9 } +.terminal-1949332948-r21 { fill: #252532 } +.terminal-1949332948-r22 { fill: #22c55e } +.terminal-1949332948-r23 { fill: #252441 } +.terminal-1949332948-r24 { fill: #8b8b93 } +.terminal-1949332948-r25 { fill: #8b8b93;font-weight: bold } +.terminal-1949332948-r26 { fill: #0d0e2e } +.terminal-1949332948-r27 { fill: #00b85f } +.terminal-1949332948-r28 { fill: #737387 } +.terminal-1949332948-r29 { fill: #e1e1e6 } +.terminal-1949332948-r30 { fill: #918d9d } +.terminal-1949332948-r31 { fill: #ef4444 } +.terminal-1949332948-r32 { fill: #2e2e3c;font-weight: bold } +.terminal-1949332948-r33 { fill: #2e2e3c } +.terminal-1949332948-r34 { fill: #a0a0a6 } +.terminal-1949332948-r35 { fill: #191928 } +.terminal-1949332948-r36 { fill: #b74e87 } +.terminal-1949332948-r37 { fill: #87878f } +.terminal-1949332948-r38 { fill: #a3a3a9 } +.terminal-1949332948-r39 { fill: #777780 } +.terminal-1949332948-r40 { fill: #1f1f2d } +.terminal-1949332948-r41 { fill: #04b375;font-weight: bold } +.terminal-1949332948-r42 { fill: #ff7ec8;font-weight: bold } +.terminal-1949332948-r43 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttp Send  -https://api.randomuser.me            -╭─ Collection ────https://jsonplaceholder.typicode.com────────── Request ─╮ - GET echohttps://postman-echo.com            InfoScriptsOptio -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttp Send  +https://api.randomuser.me            +╭─ Collection ────https://jsonplaceholder.typicode.com────────── Request ─╮ + GET echohttps://postman-echo.com            InfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_enter_key.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_enter_key.svg index a2aa2854..bc0bfd96 100644 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_enter_key.svg +++ b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_enter_key.svg @@ -19,171 +19,171 @@ font-weight: 700; } - .terminal-1573393762-matrix { + .terminal-1279950685-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1573393762-title { + .terminal-1279950685-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1573393762-r1 { fill: #dfdfe1 } -.terminal-1573393762-r2 { fill: #c5c8c6 } -.terminal-1573393762-r3 { fill: #ff93dd } -.terminal-1573393762-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1573393762-r5 { fill: #15111e } -.terminal-1573393762-r6 { fill: #43365c } -.terminal-1573393762-r7 { fill: #403e62 } -.terminal-1573393762-r8 { fill: #ff69b4 } -.terminal-1573393762-r9 { fill: #9b9aab } -.terminal-1573393762-r10 { fill: #a684e8 } -.terminal-1573393762-r11 { fill: #210d17 } -.terminal-1573393762-r12 { fill: #e3e3e8 } -.terminal-1573393762-r13 { fill: #efe3fb } -.terminal-1573393762-r14 { fill: #9f9fa5 } -.terminal-1573393762-r15 { fill: #632e53 } -.terminal-1573393762-r16 { fill: #e3e3e8;font-weight: bold } -.terminal-1573393762-r17 { fill: #dfdfe1;font-weight: bold } -.terminal-1573393762-r18 { fill: #6a6a74 } -.terminal-1573393762-r19 { fill: #0ea5e9 } -.terminal-1573393762-r20 { fill: #252532 } -.terminal-1573393762-r21 { fill: #22c55e } -.terminal-1573393762-r22 { fill: #252441 } -.terminal-1573393762-r23 { fill: #8b8b93 } -.terminal-1573393762-r24 { fill: #8b8b93;font-weight: bold } -.terminal-1573393762-r25 { fill: #0d0e2e } -.terminal-1573393762-r26 { fill: #00b85f } -.terminal-1573393762-r27 { fill: #737387 } -.terminal-1573393762-r28 { fill: #e1e1e6 } -.terminal-1573393762-r29 { fill: #918d9d } -.terminal-1573393762-r30 { fill: #ef4444 } -.terminal-1573393762-r31 { fill: #2e2e3c;font-weight: bold } -.terminal-1573393762-r32 { fill: #2e2e3c } -.terminal-1573393762-r33 { fill: #a0a0a6 } -.terminal-1573393762-r34 { fill: #191928 } -.terminal-1573393762-r35 { fill: #b74e87 } -.terminal-1573393762-r36 { fill: #87878f } -.terminal-1573393762-r37 { fill: #a3a3a9 } -.terminal-1573393762-r38 { fill: #777780 } -.terminal-1573393762-r39 { fill: #1f1f2d } -.terminal-1573393762-r40 { fill: #04b375;font-weight: bold } -.terminal-1573393762-r41 { fill: #ff7ec8;font-weight: bold } -.terminal-1573393762-r42 { fill: #dbdbdd } + .terminal-1279950685-r1 { fill: #dfdfe1 } +.terminal-1279950685-r2 { fill: #c5c8c6 } +.terminal-1279950685-r3 { fill: #ff93dd } +.terminal-1279950685-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1279950685-r5 { fill: #15111e } +.terminal-1279950685-r6 { fill: #43365c } +.terminal-1279950685-r7 { fill: #403e62 } +.terminal-1279950685-r8 { fill: #ff69b4 } +.terminal-1279950685-r9 { fill: #9b9aab } +.terminal-1279950685-r10 { fill: #a684e8 } +.terminal-1279950685-r11 { fill: #210d17 } +.terminal-1279950685-r12 { fill: #e3e3e8 } +.terminal-1279950685-r13 { fill: #efe3fb } +.terminal-1279950685-r14 { fill: #9f9fa5 } +.terminal-1279950685-r15 { fill: #632e53 } +.terminal-1279950685-r16 { fill: #e3e3e8;font-weight: bold } +.terminal-1279950685-r17 { fill: #dfdfe1;font-weight: bold } +.terminal-1279950685-r18 { fill: #6a6a74 } +.terminal-1279950685-r19 { fill: #0ea5e9 } +.terminal-1279950685-r20 { fill: #252532 } +.terminal-1279950685-r21 { fill: #22c55e } +.terminal-1279950685-r22 { fill: #252441 } +.terminal-1279950685-r23 { fill: #8b8b93 } +.terminal-1279950685-r24 { fill: #8b8b93;font-weight: bold } +.terminal-1279950685-r25 { fill: #0d0e2e } +.terminal-1279950685-r26 { fill: #00b85f } +.terminal-1279950685-r27 { fill: #737387 } +.terminal-1279950685-r28 { fill: #e1e1e6 } +.terminal-1279950685-r29 { fill: #918d9d } +.terminal-1279950685-r30 { fill: #ef4444 } +.terminal-1279950685-r31 { fill: #2e2e3c;font-weight: bold } +.terminal-1279950685-r32 { fill: #2e2e3c } +.terminal-1279950685-r33 { fill: #a0a0a6 } +.terminal-1279950685-r34 { fill: #191928 } +.terminal-1279950685-r35 { fill: #b74e87 } +.terminal-1279950685-r36 { fill: #87878f } +.terminal-1279950685-r37 { fill: #a3a3a9 } +.terminal-1279950685-r38 { fill: #777780 } +.terminal-1279950685-r39 { fill: #1f1f2d } +.terminal-1279950685-r40 { fill: #04b375;font-weight: bold } +.terminal-1279950685-r41 { fill: #ff7ec8;font-weight: bold } +.terminal-1279950685-r42 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttps://jsonplaceholder.typicode.com Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoScriptsOptio -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttps://jsonplaceholder.typicode.com Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echo││HeadersBodyQueryAuthInfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_tab_key.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_tab_key.svg index a2aa2854..bc0bfd96 100644 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_tab_key.svg +++ b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_tab_key.svg @@ -19,171 +19,171 @@ font-weight: 700; } - .terminal-1573393762-matrix { + .terminal-1279950685-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1573393762-title { + .terminal-1279950685-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1573393762-r1 { fill: #dfdfe1 } -.terminal-1573393762-r2 { fill: #c5c8c6 } -.terminal-1573393762-r3 { fill: #ff93dd } -.terminal-1573393762-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1573393762-r5 { fill: #15111e } -.terminal-1573393762-r6 { fill: #43365c } -.terminal-1573393762-r7 { fill: #403e62 } -.terminal-1573393762-r8 { fill: #ff69b4 } -.terminal-1573393762-r9 { fill: #9b9aab } -.terminal-1573393762-r10 { fill: #a684e8 } -.terminal-1573393762-r11 { fill: #210d17 } -.terminal-1573393762-r12 { fill: #e3e3e8 } -.terminal-1573393762-r13 { fill: #efe3fb } -.terminal-1573393762-r14 { fill: #9f9fa5 } -.terminal-1573393762-r15 { fill: #632e53 } -.terminal-1573393762-r16 { fill: #e3e3e8;font-weight: bold } -.terminal-1573393762-r17 { fill: #dfdfe1;font-weight: bold } -.terminal-1573393762-r18 { fill: #6a6a74 } -.terminal-1573393762-r19 { fill: #0ea5e9 } -.terminal-1573393762-r20 { fill: #252532 } -.terminal-1573393762-r21 { fill: #22c55e } -.terminal-1573393762-r22 { fill: #252441 } -.terminal-1573393762-r23 { fill: #8b8b93 } -.terminal-1573393762-r24 { fill: #8b8b93;font-weight: bold } -.terminal-1573393762-r25 { fill: #0d0e2e } -.terminal-1573393762-r26 { fill: #00b85f } -.terminal-1573393762-r27 { fill: #737387 } -.terminal-1573393762-r28 { fill: #e1e1e6 } -.terminal-1573393762-r29 { fill: #918d9d } -.terminal-1573393762-r30 { fill: #ef4444 } -.terminal-1573393762-r31 { fill: #2e2e3c;font-weight: bold } -.terminal-1573393762-r32 { fill: #2e2e3c } -.terminal-1573393762-r33 { fill: #a0a0a6 } -.terminal-1573393762-r34 { fill: #191928 } -.terminal-1573393762-r35 { fill: #b74e87 } -.terminal-1573393762-r36 { fill: #87878f } -.terminal-1573393762-r37 { fill: #a3a3a9 } -.terminal-1573393762-r38 { fill: #777780 } -.terminal-1573393762-r39 { fill: #1f1f2d } -.terminal-1573393762-r40 { fill: #04b375;font-weight: bold } -.terminal-1573393762-r41 { fill: #ff7ec8;font-weight: bold } -.terminal-1573393762-r42 { fill: #dbdbdd } + .terminal-1279950685-r1 { fill: #dfdfe1 } +.terminal-1279950685-r2 { fill: #c5c8c6 } +.terminal-1279950685-r3 { fill: #ff93dd } +.terminal-1279950685-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1279950685-r5 { fill: #15111e } +.terminal-1279950685-r6 { fill: #43365c } +.terminal-1279950685-r7 { fill: #403e62 } +.terminal-1279950685-r8 { fill: #ff69b4 } +.terminal-1279950685-r9 { fill: #9b9aab } +.terminal-1279950685-r10 { fill: #a684e8 } +.terminal-1279950685-r11 { fill: #210d17 } +.terminal-1279950685-r12 { fill: #e3e3e8 } +.terminal-1279950685-r13 { fill: #efe3fb } +.terminal-1279950685-r14 { fill: #9f9fa5 } +.terminal-1279950685-r15 { fill: #632e53 } +.terminal-1279950685-r16 { fill: #e3e3e8;font-weight: bold } +.terminal-1279950685-r17 { fill: #dfdfe1;font-weight: bold } +.terminal-1279950685-r18 { fill: #6a6a74 } +.terminal-1279950685-r19 { fill: #0ea5e9 } +.terminal-1279950685-r20 { fill: #252532 } +.terminal-1279950685-r21 { fill: #22c55e } +.terminal-1279950685-r22 { fill: #252441 } +.terminal-1279950685-r23 { fill: #8b8b93 } +.terminal-1279950685-r24 { fill: #8b8b93;font-weight: bold } +.terminal-1279950685-r25 { fill: #0d0e2e } +.terminal-1279950685-r26 { fill: #00b85f } +.terminal-1279950685-r27 { fill: #737387 } +.terminal-1279950685-r28 { fill: #e1e1e6 } +.terminal-1279950685-r29 { fill: #918d9d } +.terminal-1279950685-r30 { fill: #ef4444 } +.terminal-1279950685-r31 { fill: #2e2e3c;font-weight: bold } +.terminal-1279950685-r32 { fill: #2e2e3c } +.terminal-1279950685-r33 { fill: #a0a0a6 } +.terminal-1279950685-r34 { fill: #191928 } +.terminal-1279950685-r35 { fill: #b74e87 } +.terminal-1279950685-r36 { fill: #87878f } +.terminal-1279950685-r37 { fill: #a3a3a9 } +.terminal-1279950685-r38 { fill: #777780 } +.terminal-1279950685-r39 { fill: #1f1f2d } +.terminal-1279950685-r40 { fill: #04b375;font-weight: bold } +.terminal-1279950685-r41 { fill: #ff7ec8;font-weight: bold } +.terminal-1279950685-r42 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttps://jsonplaceholder.typicode.com Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoScriptsOptio -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttps://jsonplaceholder.typicode.com Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echo││HeadersBodyQueryAuthInfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_filters_on_typing.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_filters_on_typing.svg index 952c9947..0610fd46 100644 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_filters_on_typing.svg +++ b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_filters_on_typing.svg @@ -19,171 +19,171 @@ font-weight: 700; } - .terminal-1999896595-matrix { + .terminal-2529389070-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1999896595-title { + .terminal-2529389070-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1999896595-r1 { fill: #dfdfe1 } -.terminal-1999896595-r2 { fill: #c5c8c6 } -.terminal-1999896595-r3 { fill: #ff93dd } -.terminal-1999896595-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1999896595-r5 { fill: #15111e } -.terminal-1999896595-r6 { fill: #43365c } -.terminal-1999896595-r7 { fill: #403e62 } -.terminal-1999896595-r8 { fill: #e3e3e8 } -.terminal-1999896595-r9 { fill: #210d17 } -.terminal-1999896595-r10 { fill: #efe3fb } -.terminal-1999896595-r11 { fill: #9f9fa5 } -.terminal-1999896595-r12 { fill: #ff69b4 } -.terminal-1999896595-r13 { fill: #e5e5ea;font-weight: bold } -.terminal-1999896595-r14 { fill: #170b21;font-weight: bold } -.terminal-1999896595-r15 { fill: #632e53 } -.terminal-1999896595-r16 { fill: #e3e3e8;font-weight: bold } -.terminal-1999896595-r17 { fill: #dfdfe1;font-weight: bold } -.terminal-1999896595-r18 { fill: #6a6a74 } -.terminal-1999896595-r19 { fill: #0ea5e9 } -.terminal-1999896595-r20 { fill: #252532 } -.terminal-1999896595-r21 { fill: #22c55e } -.terminal-1999896595-r22 { fill: #252441 } -.terminal-1999896595-r23 { fill: #8b8b93 } -.terminal-1999896595-r24 { fill: #8b8b93;font-weight: bold } -.terminal-1999896595-r25 { fill: #0d0e2e } -.terminal-1999896595-r26 { fill: #00b85f } -.terminal-1999896595-r27 { fill: #737387 } -.terminal-1999896595-r28 { fill: #e1e1e6 } -.terminal-1999896595-r29 { fill: #918d9d } -.terminal-1999896595-r30 { fill: #ef4444 } -.terminal-1999896595-r31 { fill: #2e2e3c;font-weight: bold } -.terminal-1999896595-r32 { fill: #2e2e3c } -.terminal-1999896595-r33 { fill: #a0a0a6 } -.terminal-1999896595-r34 { fill: #191928 } -.terminal-1999896595-r35 { fill: #b74e87 } -.terminal-1999896595-r36 { fill: #87878f } -.terminal-1999896595-r37 { fill: #a3a3a9 } -.terminal-1999896595-r38 { fill: #777780 } -.terminal-1999896595-r39 { fill: #1f1f2d } -.terminal-1999896595-r40 { fill: #04b375;font-weight: bold } -.terminal-1999896595-r41 { fill: #ff7ec8;font-weight: bold } -.terminal-1999896595-r42 { fill: #dbdbdd } + .terminal-2529389070-r1 { fill: #dfdfe1 } +.terminal-2529389070-r2 { fill: #c5c8c6 } +.terminal-2529389070-r3 { fill: #ff93dd } +.terminal-2529389070-r4 { fill: #15111e;text-decoration: underline; } +.terminal-2529389070-r5 { fill: #15111e } +.terminal-2529389070-r6 { fill: #43365c } +.terminal-2529389070-r7 { fill: #403e62 } +.terminal-2529389070-r8 { fill: #e3e3e8 } +.terminal-2529389070-r9 { fill: #210d17 } +.terminal-2529389070-r10 { fill: #efe3fb } +.terminal-2529389070-r11 { fill: #9f9fa5 } +.terminal-2529389070-r12 { fill: #ff69b4 } +.terminal-2529389070-r13 { fill: #e5e5ea;font-weight: bold } +.terminal-2529389070-r14 { fill: #170b21;font-weight: bold } +.terminal-2529389070-r15 { fill: #632e53 } +.terminal-2529389070-r16 { fill: #e3e3e8;font-weight: bold } +.terminal-2529389070-r17 { fill: #dfdfe1;font-weight: bold } +.terminal-2529389070-r18 { fill: #6a6a74 } +.terminal-2529389070-r19 { fill: #0ea5e9 } +.terminal-2529389070-r20 { fill: #252532 } +.terminal-2529389070-r21 { fill: #22c55e } +.terminal-2529389070-r22 { fill: #252441 } +.terminal-2529389070-r23 { fill: #8b8b93 } +.terminal-2529389070-r24 { fill: #8b8b93;font-weight: bold } +.terminal-2529389070-r25 { fill: #0d0e2e } +.terminal-2529389070-r26 { fill: #00b85f } +.terminal-2529389070-r27 { fill: #737387 } +.terminal-2529389070-r28 { fill: #e1e1e6 } +.terminal-2529389070-r29 { fill: #918d9d } +.terminal-2529389070-r30 { fill: #ef4444 } +.terminal-2529389070-r31 { fill: #2e2e3c;font-weight: bold } +.terminal-2529389070-r32 { fill: #2e2e3c } +.terminal-2529389070-r33 { fill: #a0a0a6 } +.terminal-2529389070-r34 { fill: #191928 } +.terminal-2529389070-r35 { fill: #b74e87 } +.terminal-2529389070-r36 { fill: #87878f } +.terminal-2529389070-r37 { fill: #a3a3a9 } +.terminal-2529389070-r38 { fill: #777780 } +.terminal-2529389070-r39 { fill: #1f1f2d } +.terminal-2529389070-r40 { fill: #04b375;font-weight: bold } +.terminal-2529389070-r41 { fill: #ff7ec8;font-weight: bold } +.terminal-2529389070-r42 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETjson Send  -https://jsonplaceholder.typicode.com -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoScriptsOptio -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETjson Send  +https://jsonplaceholder.typicode.com +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echo││HeadersBodyQueryAuthInfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_then_reset.svg b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_then_reset.svg index c43e1ee6..912a3379 100644 --- a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_then_reset.svg +++ b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_then_reset.svg @@ -19,166 +19,166 @@ font-weight: 700; } - .terminal-2374199631-matrix { + .terminal-307614538-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2374199631-title { + .terminal-307614538-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2374199631-r1 { fill: #dfdfe1 } -.terminal-2374199631-r2 { fill: #c5c8c6 } -.terminal-2374199631-r3 { fill: #ff93dd } -.terminal-2374199631-r4 { fill: #15111e;text-decoration: underline; } -.terminal-2374199631-r5 { fill: #15111e } -.terminal-2374199631-r6 { fill: #43365c } -.terminal-2374199631-r7 { fill: #737387 } -.terminal-2374199631-r8 { fill: #e1e1e6 } -.terminal-2374199631-r9 { fill: #efe3fb } -.terminal-2374199631-r10 { fill: #9f9fa5 } -.terminal-2374199631-r11 { fill: #632e53 } -.terminal-2374199631-r12 { fill: #ff69b4 } -.terminal-2374199631-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-2374199631-r14 { fill: #e3e3e8;font-weight: bold } -.terminal-2374199631-r15 { fill: #6a6a74 } -.terminal-2374199631-r16 { fill: #0ea5e9 } -.terminal-2374199631-r17 { fill: #873c69 } -.terminal-2374199631-r18 { fill: #22c55e } -.terminal-2374199631-r19 { fill: #252441 } -.terminal-2374199631-r20 { fill: #8b8b93 } -.terminal-2374199631-r21 { fill: #8b8b93;font-weight: bold } -.terminal-2374199631-r22 { fill: #0d0e2e } -.terminal-2374199631-r23 { fill: #00b85f } -.terminal-2374199631-r24 { fill: #918d9d } -.terminal-2374199631-r25 { fill: #ef4444 } -.terminal-2374199631-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-2374199631-r27 { fill: #2e2e3c } -.terminal-2374199631-r28 { fill: #a0a0a6 } -.terminal-2374199631-r29 { fill: #191928 } -.terminal-2374199631-r30 { fill: #b74e87 } -.terminal-2374199631-r31 { fill: #87878f } -.terminal-2374199631-r32 { fill: #a3a3a9 } -.terminal-2374199631-r33 { fill: #777780 } -.terminal-2374199631-r34 { fill: #1f1f2d } -.terminal-2374199631-r35 { fill: #04b375;font-weight: bold } -.terminal-2374199631-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-2374199631-r37 { fill: #dbdbdd } + .terminal-307614538-r1 { fill: #dfdfe1 } +.terminal-307614538-r2 { fill: #c5c8c6 } +.terminal-307614538-r3 { fill: #ff93dd } +.terminal-307614538-r4 { fill: #15111e;text-decoration: underline; } +.terminal-307614538-r5 { fill: #15111e } +.terminal-307614538-r6 { fill: #43365c } +.terminal-307614538-r7 { fill: #737387 } +.terminal-307614538-r8 { fill: #e1e1e6 } +.terminal-307614538-r9 { fill: #efe3fb } +.terminal-307614538-r10 { fill: #9f9fa5 } +.terminal-307614538-r11 { fill: #632e53 } +.terminal-307614538-r12 { fill: #ff69b4 } +.terminal-307614538-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-307614538-r14 { fill: #e3e3e8;font-weight: bold } +.terminal-307614538-r15 { fill: #6a6a74 } +.terminal-307614538-r16 { fill: #0ea5e9 } +.terminal-307614538-r17 { fill: #873c69 } +.terminal-307614538-r18 { fill: #22c55e } +.terminal-307614538-r19 { fill: #252441 } +.terminal-307614538-r20 { fill: #8b8b93 } +.terminal-307614538-r21 { fill: #8b8b93;font-weight: bold } +.terminal-307614538-r22 { fill: #0d0e2e } +.terminal-307614538-r23 { fill: #00b85f } +.terminal-307614538-r24 { fill: #918d9d } +.terminal-307614538-r25 { fill: #ef4444 } +.terminal-307614538-r26 { fill: #2e2e3c;font-weight: bold } +.terminal-307614538-r27 { fill: #2e2e3c } +.terminal-307614538-r28 { fill: #a0a0a6 } +.terminal-307614538-r29 { fill: #191928 } +.terminal-307614538-r30 { fill: #b74e87 } +.terminal-307614538-r31 { fill: #87878f } +.terminal-307614538-r32 { fill: #a3a3a9 } +.terminal-307614538-r33 { fill: #777780 } +.terminal-307614538-r34 { fill: #1f1f2d } +.terminal-307614538-r35 { fill: #04b375;font-weight: bold } +.terminal-307614538-r36 { fill: #ff7ec8;font-weight: bold } +.terminal-307614538-r37 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echoHeadersBodyQueryAuthInfoScriptsOptio -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get allNameValue Add header  -GET get one╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get allNameValue Add header  +GET get one╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_hide_collection_browser.svg b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_hide_collection_browser.svg index 737755a0..101c7dfa 100644 --- a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_hide_collection_browser.svg +++ b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_hide_collection_browser.svg @@ -19,162 +19,162 @@ font-weight: 700; } - .terminal-2424990533-matrix { + .terminal-139384128-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2424990533-title { + .terminal-139384128-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2424990533-r1 { fill: #dfdfe1 } -.terminal-2424990533-r2 { fill: #c5c8c6 } -.terminal-2424990533-r3 { fill: #ff93dd } -.terminal-2424990533-r4 { fill: #15111e;text-decoration: underline; } -.terminal-2424990533-r5 { fill: #15111e } -.terminal-2424990533-r6 { fill: #43365c } -.terminal-2424990533-r7 { fill: #403e62 } -.terminal-2424990533-r8 { fill: #210d17 } -.terminal-2424990533-r9 { fill: #7e7c92 } -.terminal-2424990533-r10 { fill: #e3e3e8 } -.terminal-2424990533-r11 { fill: #efe3fb } -.terminal-2424990533-r12 { fill: #9f9fa5 } -.terminal-2424990533-r13 { fill: #632e53 } -.terminal-2424990533-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-2424990533-r15 { fill: #6a6a74 } -.terminal-2424990533-r16 { fill: #252532 } -.terminal-2424990533-r17 { fill: #ff69b4 } -.terminal-2424990533-r18 { fill: #252441 } -.terminal-2424990533-r19 { fill: #737387 } -.terminal-2424990533-r20 { fill: #e1e1e6 } -.terminal-2424990533-r21 { fill: #918d9d } -.terminal-2424990533-r22 { fill: #2e2e3c;font-weight: bold } -.terminal-2424990533-r23 { fill: #2e2e3c } -.terminal-2424990533-r24 { fill: #a0a0a6 } -.terminal-2424990533-r25 { fill: #191928 } -.terminal-2424990533-r26 { fill: #b74e87 } -.terminal-2424990533-r27 { fill: #87878f } -.terminal-2424990533-r28 { fill: #a3a3a9 } -.terminal-2424990533-r29 { fill: #777780 } -.terminal-2424990533-r30 { fill: #1f1f2d } -.terminal-2424990533-r31 { fill: #04b375;font-weight: bold } -.terminal-2424990533-r32 { fill: #ff7ec8;font-weight: bold } -.terminal-2424990533-r33 { fill: #dbdbdd } + .terminal-139384128-r1 { fill: #dfdfe1 } +.terminal-139384128-r2 { fill: #c5c8c6 } +.terminal-139384128-r3 { fill: #ff93dd } +.terminal-139384128-r4 { fill: #15111e;text-decoration: underline; } +.terminal-139384128-r5 { fill: #15111e } +.terminal-139384128-r6 { fill: #43365c } +.terminal-139384128-r7 { fill: #403e62 } +.terminal-139384128-r8 { fill: #210d17 } +.terminal-139384128-r9 { fill: #7e7c92 } +.terminal-139384128-r10 { fill: #e3e3e8 } +.terminal-139384128-r11 { fill: #efe3fb } +.terminal-139384128-r12 { fill: #9f9fa5 } +.terminal-139384128-r13 { fill: #632e53 } +.terminal-139384128-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-139384128-r15 { fill: #6a6a74 } +.terminal-139384128-r16 { fill: #252532 } +.terminal-139384128-r17 { fill: #ff69b4 } +.terminal-139384128-r18 { fill: #252441 } +.terminal-139384128-r19 { fill: #737387 } +.terminal-139384128-r20 { fill: #e1e1e6 } +.terminal-139384128-r21 { fill: #918d9d } +.terminal-139384128-r22 { fill: #2e2e3c;font-weight: bold } +.terminal-139384128-r23 { fill: #2e2e3c } +.terminal-139384128-r24 { fill: #a0a0a6 } +.terminal-139384128-r25 { fill: #191928 } +.terminal-139384128-r26 { fill: #b74e87 } +.terminal-139384128-r27 { fill: #87878f } +.terminal-139384128-r28 { fill: #a3a3a9 } +.terminal-139384128-r29 { fill: #777780 } +.terminal-139384128-r30 { fill: #1f1f2d } +.terminal-139384128-r31 { fill: #04b375;font-weight: bold } +.terminal-139384128-r32 { fill: #ff7ec8;font-weight: bold } +.terminal-139384128-r33 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭──────────────────────────────────────────────────────────────── Request ─╮ -HeadersBodyQueryAuthInfoScriptsOptions -━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -NameValue Add header  -╰──────────────────────────────────────────────────────────────────────────╯ -╭─────────────────────────────────────────────────────────────── Response ─╮ -BodyHeadersCookiesTrace -━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - - - -1:1read-onlyJSONWrap X -╰──────────────────────────────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭──────────────────────────────────────────────────────────────── Request ─╮ +HeadersBodyQueryAuthInfoScriptsOptions +━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +NameValue Add header  +╰──────────────────────────────────────────────────────────────────────────╯ +╭─────────────────────────────────────────────────────────────── Response ─╮ +BodyHeadersCookiesScriptsTrace +━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + + + +1:1read-onlyJSONWrap X +╰──────────────────────────────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestVariables.test_resolved_variables_highlight_and_preview.svg b/tests/__snapshots__/test_snapshots/TestVariables.test_resolved_variables_highlight_and_preview.svg index d0dc2d38..155e0d74 100644 --- a/tests/__snapshots__/test_snapshots/TestVariables.test_resolved_variables_highlight_and_preview.svg +++ b/tests/__snapshots__/test_snapshots/TestVariables.test_resolved_variables_highlight_and_preview.svg @@ -19,173 +19,173 @@ font-weight: 700; } - .terminal-1258613153-matrix { + .terminal-774853547-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1258613153-title { + .terminal-774853547-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1258613153-r1 { fill: #dfdfe1 } -.terminal-1258613153-r2 { fill: #c5c8c6 } -.terminal-1258613153-r3 { fill: #ff93dd } -.terminal-1258613153-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1258613153-r5 { fill: #15111e } -.terminal-1258613153-r6 { fill: #43365c } -.terminal-1258613153-r7 { fill: #403e62 } -.terminal-1258613153-r8 { fill: #ff69b4 } -.terminal-1258613153-r9 { fill: #9b9aab } -.terminal-1258613153-r10 { fill: #a684e8 } -.terminal-1258613153-r11 { fill: #e3e3e8 } -.terminal-1258613153-r12 { fill: #00fa9a;text-decoration: underline; } -.terminal-1258613153-r13 { fill: #210d17 } -.terminal-1258613153-r14 { fill: #efe3fb } -.terminal-1258613153-r15 { fill: #9f9fa5 } -.terminal-1258613153-r16 { fill: #170b21;font-weight: bold } -.terminal-1258613153-r17 { fill: #632e53 } -.terminal-1258613153-r18 { fill: #0ea5e9 } -.terminal-1258613153-r19 { fill: #dfdfe1;font-weight: bold } -.terminal-1258613153-r20 { fill: #58d1eb;font-weight: bold } -.terminal-1258613153-r21 { fill: #6a6a74 } -.terminal-1258613153-r22 { fill: #e3e3e8;font-weight: bold } -.terminal-1258613153-r23 { fill: #252532 } -.terminal-1258613153-r24 { fill: #0f0f1f } -.terminal-1258613153-r25 { fill: #ede2f7 } -.terminal-1258613153-r26 { fill: #e1e0e4 } -.terminal-1258613153-r27 { fill: #e2e0e5 } -.terminal-1258613153-r28 { fill: #e9e1f1 } -.terminal-1258613153-r29 { fill: #0d0e2e } -.terminal-1258613153-r30 { fill: #737387 } -.terminal-1258613153-r31 { fill: #e1e1e6 } -.terminal-1258613153-r32 { fill: #918d9d } -.terminal-1258613153-r33 { fill: #2e2e3c;font-weight: bold } -.terminal-1258613153-r34 { fill: #2e2e3c } -.terminal-1258613153-r35 { fill: #a0a0a6 } -.terminal-1258613153-r36 { fill: #191928 } -.terminal-1258613153-r37 { fill: #b74e87 } -.terminal-1258613153-r38 { fill: #87878f } -.terminal-1258613153-r39 { fill: #a3a3a9 } -.terminal-1258613153-r40 { fill: #777780 } -.terminal-1258613153-r41 { fill: #1f1f2d } -.terminal-1258613153-r42 { fill: #04b375;font-weight: bold } -.terminal-1258613153-r43 { fill: #ff7ec8;font-weight: bold } -.terminal-1258613153-r44 { fill: #dbdbdd } + .terminal-774853547-r1 { fill: #dfdfe1 } +.terminal-774853547-r2 { fill: #c5c8c6 } +.terminal-774853547-r3 { fill: #ff93dd } +.terminal-774853547-r4 { fill: #15111e;text-decoration: underline; } +.terminal-774853547-r5 { fill: #15111e } +.terminal-774853547-r6 { fill: #43365c } +.terminal-774853547-r7 { fill: #403e62 } +.terminal-774853547-r8 { fill: #ff69b4 } +.terminal-774853547-r9 { fill: #9b9aab } +.terminal-774853547-r10 { fill: #a684e8 } +.terminal-774853547-r11 { fill: #e3e3e8 } +.terminal-774853547-r12 { fill: #00fa9a;text-decoration: underline; } +.terminal-774853547-r13 { fill: #210d17 } +.terminal-774853547-r14 { fill: #efe3fb } +.terminal-774853547-r15 { fill: #9f9fa5 } +.terminal-774853547-r16 { fill: #170b21;font-weight: bold } +.terminal-774853547-r17 { fill: #632e53 } +.terminal-774853547-r18 { fill: #0ea5e9 } +.terminal-774853547-r19 { fill: #dfdfe1;font-weight: bold } +.terminal-774853547-r20 { fill: #58d1eb;font-weight: bold } +.terminal-774853547-r21 { fill: #6a6a74 } +.terminal-774853547-r22 { fill: #e3e3e8;font-weight: bold } +.terminal-774853547-r23 { fill: #252532 } +.terminal-774853547-r24 { fill: #0f0f1f } +.terminal-774853547-r25 { fill: #ede2f7 } +.terminal-774853547-r26 { fill: #e1e0e4 } +.terminal-774853547-r27 { fill: #e2e0e5 } +.terminal-774853547-r28 { fill: #e9e1f1 } +.terminal-774853547-r29 { fill: #0d0e2e } +.terminal-774853547-r30 { fill: #737387 } +.terminal-774853547-r31 { fill: #e1e1e6 } +.terminal-774853547-r32 { fill: #918d9d } +.terminal-774853547-r33 { fill: #2e2e3c;font-weight: bold } +.terminal-774853547-r34 { fill: #2e2e3c } +.terminal-774853547-r35 { fill: #a0a0a6 } +.terminal-774853547-r36 { fill: #191928 } +.terminal-774853547-r37 { fill: #b74e87 } +.terminal-774853547-r38 { fill: #87878f } +.terminal-774853547-r39 { fill: #a3a3a9 } +.terminal-774853547-r40 { fill: #777780 } +.terminal-774853547-r41 { fill: #1f1f2d } +.terminal-774853547-r42 { fill: #04b375;font-weight: bold } +.terminal-774853547-r43 { fill: #ff7ec8;font-weight: bold } +.terminal-774853547-r44 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID Send  -                               TODO_ID = 1                      $TODO_ID -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET get all││HeadersBodyQueryAuthInfoScriptsOpti -█ GET get one││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -││ Content-Type     application/json      -││ Referer          https://example.com/  -││ Accept-Encoding  gzip                  -││NameValue Add header  -│╰─────────────────────────────────────────────────╯ -│╭────────────────────────────────────── Response ─╮ -││BodyHeadersCookiesTrace -││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -││ -││ -││ -│───────────────────────││ -Retrieve one todo││1:1read-onlyJSONWrap X -╰─────────────── todos ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID Send  +                               TODO_ID = 1                      $TODO_ID +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET get all││HeadersBodyQueryAuthInfoScriptsOpti +█ GET get one││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +││ Content-Type     application/json      +││ Referer          https://example.com/  +││ Accept-Encoding  gzip                  +││NameValue Add header  +│╰─────────────────────────────────────────────────╯ +│╭────────────────────────────────────── Response ─╮ +││BodyHeadersCookiesScriptsTrace +││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +││ +││ +││ +│───────────────────────││ +Retrieve one todo││1:1read-onlyJSONWrap X +╰─────────────── todos ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestVariables.test_unresolved_variables_highlighted.svg b/tests/__snapshots__/test_snapshots/TestVariables.test_unresolved_variables_highlighted.svg index eaaa652a..2feb37a8 100644 --- a/tests/__snapshots__/test_snapshots/TestVariables.test_unresolved_variables_highlighted.svg +++ b/tests/__snapshots__/test_snapshots/TestVariables.test_unresolved_variables_highlighted.svg @@ -19,211 +19,211 @@ font-weight: 700; } - .terminal-1211479253-matrix { + .terminal-1660952287-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1211479253-title { + .terminal-1660952287-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1211479253-r1 { fill: #dfdfe1 } -.terminal-1211479253-r2 { fill: #c5c8c6 } -.terminal-1211479253-r3 { fill: #ff93dd } -.terminal-1211479253-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1211479253-r5 { fill: #15111e } -.terminal-1211479253-r6 { fill: #43365c } -.terminal-1211479253-r7 { fill: #ff69b4 } -.terminal-1211479253-r8 { fill: #9393a3 } -.terminal-1211479253-r9 { fill: #a684e8 } -.terminal-1211479253-r10 { fill: #e1e1e6 } -.terminal-1211479253-r11 { fill: #efe3fb } -.terminal-1211479253-r12 { fill: #9f9fa5 } -.terminal-1211479253-r13 { fill: #632e53 } -.terminal-1211479253-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-1211479253-r15 { fill: #0ea5e9 } -.terminal-1211479253-r16 { fill: #6a6a74 } -.terminal-1211479253-r17 { fill: #58d1eb;font-weight: bold } -.terminal-1211479253-r18 { fill: #252532 } -.terminal-1211479253-r19 { fill: #22c55e } -.terminal-1211479253-r20 { fill: #252441 } -.terminal-1211479253-r21 { fill: #8b8b93 } -.terminal-1211479253-r22 { fill: #8b8b93;font-weight: bold } -.terminal-1211479253-r23 { fill: #00b85f } -.terminal-1211479253-r24 { fill: #ef4444 } -.terminal-1211479253-r25 { fill: #403e62 } -.terminal-1211479253-r26 { fill: #ff4500 } -.terminal-1211479253-r27 { fill: #e3e3e8 } -.terminal-1211479253-r28 { fill: #210d17 } -.terminal-1211479253-r29 { fill: #f59e0b } -.terminal-1211479253-r30 { fill: #2e2e3c;font-weight: bold } -.terminal-1211479253-r31 { fill: #2e2e3c } -.terminal-1211479253-r32 { fill: #a0a0a6 } -.terminal-1211479253-r33 { fill: #e3e3e8;font-weight: bold } -.terminal-1211479253-r34 { fill: #191928 } -.terminal-1211479253-r35 { fill: #b74e87 } -.terminal-1211479253-r36 { fill: #87878f } -.terminal-1211479253-r37 { fill: #a3a3a9 } -.terminal-1211479253-r38 { fill: #777780 } -.terminal-1211479253-r39 { fill: #1f1f2d } -.terminal-1211479253-r40 { fill: #04b375;font-weight: bold } -.terminal-1211479253-r41 { fill: #ff7ec8;font-weight: bold } -.terminal-1211479253-r42 { fill: #dbdbdd } + .terminal-1660952287-r1 { fill: #dfdfe1 } +.terminal-1660952287-r2 { fill: #c5c8c6 } +.terminal-1660952287-r3 { fill: #ff93dd } +.terminal-1660952287-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1660952287-r5 { fill: #15111e } +.terminal-1660952287-r6 { fill: #43365c } +.terminal-1660952287-r7 { fill: #ff69b4 } +.terminal-1660952287-r8 { fill: #9393a3 } +.terminal-1660952287-r9 { fill: #a684e8 } +.terminal-1660952287-r10 { fill: #e1e1e6 } +.terminal-1660952287-r11 { fill: #efe3fb } +.terminal-1660952287-r12 { fill: #9f9fa5 } +.terminal-1660952287-r13 { fill: #632e53 } +.terminal-1660952287-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-1660952287-r15 { fill: #0ea5e9 } +.terminal-1660952287-r16 { fill: #6a6a74 } +.terminal-1660952287-r17 { fill: #58d1eb;font-weight: bold } +.terminal-1660952287-r18 { fill: #252532 } +.terminal-1660952287-r19 { fill: #22c55e } +.terminal-1660952287-r20 { fill: #252441 } +.terminal-1660952287-r21 { fill: #8b8b93 } +.terminal-1660952287-r22 { fill: #8b8b93;font-weight: bold } +.terminal-1660952287-r23 { fill: #00b85f } +.terminal-1660952287-r24 { fill: #ef4444 } +.terminal-1660952287-r25 { fill: #403e62 } +.terminal-1660952287-r26 { fill: #ff4500 } +.terminal-1660952287-r27 { fill: #e3e3e8 } +.terminal-1660952287-r28 { fill: #210d17 } +.terminal-1660952287-r29 { fill: #f59e0b } +.terminal-1660952287-r30 { fill: #2e2e3c;font-weight: bold } +.terminal-1660952287-r31 { fill: #2e2e3c } +.terminal-1660952287-r32 { fill: #a0a0a6 } +.terminal-1660952287-r33 { fill: #e3e3e8;font-weight: bold } +.terminal-1660952287-r34 { fill: #191928 } +.terminal-1660952287-r35 { fill: #b74e87 } +.terminal-1660952287-r36 { fill: #87878f } +.terminal-1660952287-r37 { fill: #a3a3a9 } +.terminal-1660952287-r38 { fill: #777780 } +.terminal-1660952287-r39 { fill: #1f1f2d } +.terminal-1660952287-r40 { fill: #04b375;font-weight: bold } +.terminal-1660952287-r41 { fill: #ff7ec8;font-weight: bold } +.terminal-1660952287-r42 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                                                          - -GEThttps://jsonplaceholder.typicode.com/todos                                                Send  - -╭─ Collection ──────────────────────╮╭───────────────────────────────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoScriptsOptions -GET get random user━━━━━━━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no parameters.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get one╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -POS create╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -DEL delete a post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ comments/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get commentsfoo                      $nope/${nope} Add   -GET get comments (via param)╰───────────────────────────────────────────────────────────────────────────╯ -PUT edit a comment│╭──────────────────────────────────────────────────────────────── Response ─╮ -▼ todos/││BodyHeadersCookiesTrace -█ GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get one││ -▼ users/││ -GET get a user││ -GET get all users││ -POS create a user││ -PUT update a user││ -DEL delete a user││ -││ -│───────────────────────────────────││ -Retrieve all todos││1:1read-onlyJSONWrap X -╰────────────── sample-collections ─╯╰───────────────────────────────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  + + + + +Posting                                                                                                          + +GEThttps://jsonplaceholder.typicode.com/todos                                                Send  + +╭─ Collection ──────────────────────╮╭───────────────────────────────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOptions +GET get random user━━━━━━━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no parameters.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get one╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +POS create╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +DEL delete a post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ comments/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get commentsfoo                      $nope/${nope} Add   +GET get comments (via param)╰───────────────────────────────────────────────────────────────────────────╯ +PUT edit a comment│╭──────────────────────────────────────────────────────────────── Response ─╮ +▼ todos/││BodyHeadersCookiesScriptsTrace +█ GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get one││ +▼ users/││ +GET get a user││ +GET get all users││ +POS create a user││ +PUT update a user││ +DEL delete a user││ +││ +│───────────────────────────────────││ +Retrieve all todos││1:1read-onlyJSONWrap X +╰────────────── sample-collections ─╯╰───────────────────────────────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  diff --git a/tests/sample-collections/echo.posting.yaml b/tests/sample-collections/echo.posting.yaml index 8ace4e5b..0d32ee4b 100644 --- a/tests/sample-collections/echo.posting.yaml +++ b/tests/sample-collections/echo.posting.yaml @@ -8,5 +8,6 @@ body: value: '123' scripts: on_request: scripts/my_script.py + on_response: scripts/my_script.py options: follow_redirects: false diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py index 72610c3a..96e76e52 100644 --- a/tests/sample-collections/scripts/my_script.py +++ b/tests/sample-collections/scripts/my_script.py @@ -1,6 +1,10 @@ -def on_request(request): - request.headers["X-Custom-Header"] = "Custom-Values edited" +import httpx +def on_request(request: httpx.Request) -> None: + new_header = "Foo-Bar-Baz!!!!!" + request.headers["X-Custom-Header"] = new_header + print(f"Set header to {new_header!r}!") -def on_response(): - pass + +def on_response(response: httpx.Response) -> None: + print(response.status_code) diff --git a/tests/sample-configs/custom_theme.yaml b/tests/sample-configs/custom_theme.yaml index e23bb27a..481d00d0 100644 --- a/tests/sample-configs/custom_theme.yaml +++ b/tests/sample-configs/custom_theme.yaml @@ -9,4 +9,5 @@ heading: text_input: blinking_cursor: false watch_env_files: false +watch_collection_files: false diff --git a/tests/sample-configs/custom_theme2.yaml b/tests/sample-configs/custom_theme2.yaml index 47bb8658..66c2cb24 100644 --- a/tests/sample-configs/custom_theme2.yaml +++ b/tests/sample-configs/custom_theme2.yaml @@ -8,4 +8,5 @@ heading: show_version: false text_input: blinking_cursor: false -watch_env_files: false \ No newline at end of file +watch_env_files: false +watch_collection_files: false \ No newline at end of file diff --git a/tests/sample-configs/general.yaml b/tests/sample-configs/general.yaml index 17049246..f8a62173 100644 --- a/tests/sample-configs/general.yaml +++ b/tests/sample-configs/general.yaml @@ -7,4 +7,5 @@ heading: show_version: false text_input: blinking_cursor: false -watch_env_files: false \ No newline at end of file +watch_env_files: false +watch_collection_files: false \ No newline at end of file diff --git a/tests/sample-configs/modified_config.yaml b/tests/sample-configs/modified_config.yaml index b80a810b..ec5c00dc 100644 --- a/tests/sample-configs/modified_config.yaml +++ b/tests/sample-configs/modified_config.yaml @@ -11,4 +11,5 @@ heading: visible: false text_input: blinking_cursor: false -watch_env_files: false \ No newline at end of file +watch_env_files: false +watch_collection_files: false \ No newline at end of file From e116666af07e978c02394cd9885222faf3f8104e Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 25 Sep 2024 19:53:21 +0100 Subject: [PATCH 18/70] Docstrings --- src/posting/app.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/posting/app.py b/src/posting/app.py index 03f5e5eb..e4e17e3e 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -695,6 +695,9 @@ def __init__( available_themes |= load_user_themes() self.themes = available_themes + """The themes that are available to the app, potentially including + themes loaded from the user's themes directory and xresources themes + if those configuration options are enabled.""" # We need to call super.__init__ after the themes are loaded, # because our `get_css_variables` override depends on @@ -702,14 +705,39 @@ def __init__( super().__init__() self.settings = settings + """Settings object which is built via pydantic-settings, + essentially a direct translation of the config.yaml file.""" + self.environment_files = environment_files + """A list of paths to dotenv files, in the order they're loaded.""" + self.collection = collection + """The loaded collection.""" + self.collection_specified = collection_specified + """Boolean indicating whether the user launched Posting explicitly + supplying a collection directory, or if they let Posting auto-discover + it in some way (likely just using the default collection).""" + self.animation_level = settings.animation + """The level of animation to use in the app. This is used by Textual.""" + self.env_changed_signal = Signal[None](self, "env-changed") + """Signal that is published when the environment has changed. + This means one or more of the loaded environment files (in + `self.environment_files`) have been modified.""" + + self.session_env: dict[str, object] = {} + """Users can set the value of variables for the duration of the + session (until the app is quit). This can be done via the scripting + interface: pre-request or post-response scripts.""" theme: Reactive[str] = reactive("galaxy", init=False) + """The currently selected theme. Changing this reactive should + trigger a complete refresh via the `watch_theme` method.""" + _jumping: Reactive[bool] = reactive(False, init=False, bindings=True) + """True if 'jump mode' is currently active, otherwise False.""" @work(exclusive=True, group="environment-watcher") async def watch_environment_files(self) -> None: From 7a421ed009aa18df3eb9f4139c22186d808ee816 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 25 Sep 2024 21:28:48 +0100 Subject: [PATCH 19/70] Overlaying session variables --- src/posting/app.py | 1 + src/posting/variables.py | 30 +++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/posting/app.py b/src/posting/app.py index e4e17e3e..b7926f57 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -748,6 +748,7 @@ async def watch_environment_files(self) -> None: self.environment_files, self.settings.use_host_environment, avoid_cache=True, + overlay_variables=self.session_env, ) # Notify the app that the environment has changed, # which will trigger a reload of the variables in the relevant widgets. diff --git a/src/posting/variables.py b/src/posting/variables.py index 4c6272fd..5aa24912 100644 --- a/src/posting/variables.py +++ b/src/posting/variables.py @@ -1,5 +1,4 @@ from __future__ import annotations -from contextvars import ContextVar from functools import lru_cache import re @@ -16,13 +15,13 @@ class SharedVariables: def __init__(self): - self._variables: dict[str, str | None] = {} + self._variables: dict[str, object] = {} self._lock = Lock() - def get(self) -> dict[str, str | None]: + def get(self) -> dict[str, object]: return self._variables.copy() - async def set(self, variables: dict[str, str | None]) -> None: + async def set(self, variables: dict[str, object]) -> None: async with self._lock: self._variables = variables @@ -30,7 +29,7 @@ async def set(self, variables: dict[str, str | None]) -> None: VARIABLES = SharedVariables() -def get_variables() -> dict[str, str | None]: +def get_variables() -> dict[str, object]: return VARIABLES.get() @@ -38,16 +37,26 @@ async def load_variables( environment_files: tuple[Path, ...], use_host_environment: bool, avoid_cache: bool = False, -) -> dict[str, str | None]: - """Load the variables that are currently available in the environment. + overlay_variables: dict[str, object] | None = None, +) -> dict[str, object]: + """Load the variables that are currently available in the environment, + optionally overlaying with additional variables which can be sourced + from anywhere. - This will make them available via the `get_variables` function.""" + This will make them available via the `get_variables` function. + + Args: + environment_files: The environment files to load variables from. + use_host_environment: Whether to use env vars from the host machine. + avoid_cache: Whether to avoid using cached variables (so do a full lookup). + overlay_variables: Additional variables to overlay on top of the result. + """ existing_variables = get_variables() if existing_variables and not avoid_cache: return {key: value for key, value in existing_variables} - variables: dict[str, str | None] = { + variables: dict[str, object] = { key: value for file in environment_files for key, value in dotenv_values(file).items() @@ -56,6 +65,9 @@ async def load_variables( host_env_variables = {key: value for key, value in os.environ.items()} variables = {**variables, **host_env_variables} + if overlay_variables: + variables = {**variables, **overlay_variables} + await VARIABLES.set(variables) return variables From 21302e7017512df8272a2b2558f2872a7aab5d40 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 25 Sep 2024 21:44:14 +0100 Subject: [PATCH 20/70] An API for scripting --- src/posting/scripts.py | 92 ++++++++++++++++++++++++++++++++---------- 1 file changed, 70 insertions(+), 22 deletions(-) diff --git a/src/posting/scripts.py b/src/posting/scripts.py index a5df3303..4bf0e09a 100644 --- a/src/posting/scripts.py +++ b/src/posting/scripts.py @@ -7,37 +7,85 @@ import threading from httpx import Request, Response -from textual.app import App from textual.notifications import SeverityLevel +from posting.variables import get_variables + if TYPE_CHECKING: - from posting.app import Posting + from posting.app import Posting as PostingApp # Global cache for loaded modules _MODULE_CACHE: dict[str, ModuleType] = {} _CACHE_LOCK = threading.Lock() -# class Context: -# def __init__(self, app: Posting): -# self._app: "Posting" = app -# self.request: Request | None = None -# self.response: Response | None = None - -# def notify( -# self, -# message: str, -# *, -# title: str = "", -# severity: SeverityLevel = "information", -# timeout: float | None = None, -# ): -# self._app.notify( -# message=message, -# title=title, -# severity=severity, -# timeout=timeout, -# ) +class Posting: + """A class that provides access to Posting's API from within a script.""" + + def __init__(self, app: PostingApp): + self._app: "PostingApp" = app + """The Textual App instance for Posting.""" + + self.request: Request | None = None + """The request that is currently being processed.""" + + self.response: Response | None = None + """The response received, if it's available.""" + + @property + def variables(self) -> dict[str, object]: + """Get the variables available in the environment. + + This includes variables loaded from the environment and + any variables that have been set in scripts for this session. + """ + return get_variables() + + def set_variable(self, name: str, value: object) -> None: + """Set a session variable, which persists until the app shuts + down, and overrides any variables loaded from the environment + with the same name. + + Args: + name: The name of the variable to set. + value: The value of the variable to set. + """ + self._app.session_env[name] = value + + def clear_variable(self, name: str) -> None: + """Clear a session variable. + + Args: + name: The name of the variable to clear. + """ + if name in self._app.session_env: + del self._app.session_env[name] + + def notify( + self, + message: str, + *, + title: str = "", + severity: SeverityLevel = "information", + timeout: float | None = None, + ): + """Send a toast message, which will appear at the bottom + right corner of Posting. This is useful for grabbing the + user's attention even if they're not directly viewing the + Scripts tab. + + Args: + message: The message to display in the toast body. + title: The title of the toast. + severity: The severity of the message. + timeout: Number of seconds the toast will be displayed for. + """ + self._app.notify( + message=message, + title=title, + severity=severity, + timeout=timeout, + ) def clear_module_cache(): From 92dfcd20f7a58e26f582c3afa5a4b6c0f69599cb Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 25 Sep 2024 22:30:09 +0100 Subject: [PATCH 21/70] Passing Posting context into on_request and on_response --- src/posting/app.py | 37 +++++++++++++++---- src/posting/scripts.py | 7 +++- src/posting/variables.py | 36 +++++++++++------- tests/sample-collections/scripts/my_script.py | 12 +++++- 4 files changed, 67 insertions(+), 25 deletions(-) diff --git a/src/posting/app.py b/src/posting/app.py index b7926f57..89f837d4 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -38,11 +38,11 @@ from posting.help_screen import HelpScreen from posting.jump_overlay import JumpOverlay from posting.jumper import Jumper -from posting.scripts import execute_script, uncache_module +from posting.scripts import execute_script, uncache_module, Posting as PostingContext from posting.themes import BUILTIN_THEMES, Theme, load_user_themes from posting.types import CertTypes, PostingLayout from posting.user_host import get_user_host_string -from posting.variables import SubstitutionError, get_variables +from posting.variables import SubstitutionError, get_variables, update_variables from posting.version import VERSION from posting.widgets.collection.browser import ( CollectionBrowser, @@ -214,9 +214,13 @@ def get_and_run_script( if script_function is not None: try: - # If the script function takes arguments, pass the arguments to the script function. - if inspect.signature(script_function).parameters: - script_function(*args) + # Get the number of parameters the script function expects + signature = inspect.signature(script_function) + num_params = len(signature.parameters) + + # Call the function with the appropriate number of arguments + if num_params > 0: + script_function(*args[:num_params]) else: script_function() except Exception as e: @@ -286,10 +290,19 @@ async def send_request(self) -> None: print("timeout =", request_model.options.timeout) print("auth =", request_model.auth) + app = cast("Posting", self.app) + script_context = PostingContext(app) + script_context.request = request + # If there's an associated pre-request script, run it. if on_request := request_model.scripts.on_request: print("running on_request script...") - self.get_and_run_script(on_request, "on_request", request) + self.get_and_run_script( + on_request, + "on_request", + request, + script_context, + ) response = await client.send( request=request, @@ -300,7 +313,13 @@ async def send_request(self) -> None: if on_response := request_model.scripts.on_response: print("running on_response script...") - self.get_and_run_script(on_response, "on_response", response) + script_context.response = response + self.get_and_run_script( + on_response, + "on_response", + response, + script_context, + ) except httpx.ConnectTimeout as connect_timeout: log.error("Connect timeout", connect_timeout) @@ -748,8 +767,10 @@ async def watch_environment_files(self) -> None: self.environment_files, self.settings.use_host_environment, avoid_cache=True, - overlay_variables=self.session_env, ) + # Overlay the session variables on top of the environment variables. + await update_variables(self.session_env) + # Notify the app that the environment has changed, # which will trigger a reload of the variables in the relevant widgets. # Widgets subscribed to this signal can reload as needed. diff --git a/src/posting/scripts.py b/src/posting/scripts.py index 4bf0e09a..0703f22e 100644 --- a/src/posting/scripts.py +++ b/src/posting/scripts.py @@ -1,5 +1,6 @@ from __future__ import annotations +import asyncio import sys from pathlib import Path from types import ModuleType @@ -9,7 +10,7 @@ from httpx import Request, Response from textual.notifications import SeverityLevel -from posting.variables import get_variables +from posting.variables import get_variables, update_variables if TYPE_CHECKING: from posting.app import Posting as PostingApp @@ -23,7 +24,7 @@ class Posting: """A class that provides access to Posting's API from within a script.""" def __init__(self, app: PostingApp): - self._app: "PostingApp" = app + self._app: PostingApp = app """The Textual App instance for Posting.""" self.request: Request | None = None @@ -51,6 +52,7 @@ def set_variable(self, name: str, value: object) -> None: value: The value of the variable to set. """ self._app.session_env[name] = value + update_variables(self._app.session_env) def clear_variable(self, name: str) -> None: """Clear a session variable. @@ -60,6 +62,7 @@ def clear_variable(self, name: str) -> None: """ if name in self._app.session_env: del self._app.session_env[name] + update_variables(self._app.session_env) def notify( self, diff --git a/src/posting/variables.py b/src/posting/variables.py index 5aa24912..9ae0d7fc 100644 --- a/src/posting/variables.py +++ b/src/posting/variables.py @@ -5,7 +5,6 @@ import os from pathlib import Path from dotenv import dotenv_values -from asyncio import Lock _VARIABLES_PATTERN = re.compile( @@ -16,14 +15,15 @@ class SharedVariables: def __init__(self): self._variables: dict[str, object] = {} - self._lock = Lock() def get(self) -> dict[str, object]: return self._variables.copy() - async def set(self, variables: dict[str, object]) -> None: - async with self._lock: - self._variables = variables + def set(self, variables: dict[str, object]) -> None: + self._variables = variables + + def update(self, new_variables: dict[str, object]) -> None: + self._variables.update(new_variables) VARIABLES = SharedVariables() @@ -37,11 +37,12 @@ async def load_variables( environment_files: tuple[Path, ...], use_host_environment: bool, avoid_cache: bool = False, - overlay_variables: dict[str, object] | None = None, ) -> dict[str, object]: - """Load the variables that are currently available in the environment, - optionally overlaying with additional variables which can be sourced - from anywhere. + """Load the variables that are currently available in the environment. + + This will likely involve reading from a set of environment files, + but it could also involve reading from the host machine's environment + if `use_host_environment` is True. This will make them available via the `get_variables` function. @@ -65,13 +66,22 @@ async def load_variables( host_env_variables = {key: value for key, value in os.environ.items()} variables = {**variables, **host_env_variables} - if overlay_variables: - variables = {**variables, **overlay_variables} - - await VARIABLES.set(variables) + VARIABLES.set(variables) return variables +def update_variables(new_variables: dict[str, object]) -> None: + """Update the current variables with new values. + + This function safely updates the shared variables with new key-value pairs. + If a key already exists, its value will be updated. If it doesn't exist, it will be added. + + Args: + new_variables: A dictionary containing the new variables to update or add. + """ + VARIABLES.update(new_variables) + + @lru_cache() def find_variables(template_str: str) -> list[tuple[str, int, int]]: return [ diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py index 96e76e52..b80902ff 100644 --- a/tests/sample-collections/scripts/my_script.py +++ b/tests/sample-collections/scripts/my_script.py @@ -1,10 +1,18 @@ import httpx -def on_request(request: httpx.Request) -> None: +from posting.scripts import Posting + + +def on_request(request: httpx.Request, posting: Posting) -> None: new_header = "Foo-Bar-Baz!!!!!" request.headers["X-Custom-Header"] = new_header print(f"Set header to {new_header!r}!") + posting.notify( + message="Hello from my_script.py!", + ) + posting.set_variable("set_in_script", "foo") -def on_response(response: httpx.Response) -> None: +def on_response(response: httpx.Response, posting: Posting) -> None: print(response.status_code) + print(posting.variables["set_in_script"]) # prints "foo" From 4f5736d000f513969f02ac8b83a0c24f3092f804 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 25 Sep 2024 22:31:09 +0100 Subject: [PATCH 22/70] Remove some redundant async --- src/posting/__main__.py | 2 +- src/posting/app.py | 4 ++-- src/posting/variables.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/posting/__main__.py b/src/posting/__main__.py index 94a3fa39..df5dcaef 100644 --- a/src/posting/__main__.py +++ b/src/posting/__main__.py @@ -134,6 +134,6 @@ def make_posting( env_paths = tuple(Path(e).resolve() for e in env) settings = Settings(_env_file=env_paths) # type: ignore[call-arg] - asyncio.run(load_variables(env_paths, settings.use_host_environment)) + load_variables(env_paths, settings.use_host_environment) return Posting(settings, env_paths, collection_tree, not using_default_collection) diff --git a/src/posting/app.py b/src/posting/app.py index 89f837d4..018ba2d4 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -763,13 +763,13 @@ async def watch_environment_files(self) -> None: """Watching files that were passed in as the environment.""" async for changes in awatch(*self.environment_files): # Reload the variables from the environment files. - await load_variables( + load_variables( self.environment_files, self.settings.use_host_environment, avoid_cache=True, ) # Overlay the session variables on top of the environment variables. - await update_variables(self.session_env) + update_variables(self.session_env) # Notify the app that the environment has changed, # which will trigger a reload of the variables in the relevant widgets. diff --git a/src/posting/variables.py b/src/posting/variables.py index 9ae0d7fc..4673562c 100644 --- a/src/posting/variables.py +++ b/src/posting/variables.py @@ -33,7 +33,7 @@ def get_variables() -> dict[str, object]: return VARIABLES.get() -async def load_variables( +def load_variables( environment_files: tuple[Path, ...], use_host_environment: bool, avoid_cache: bool = False, From 11a9481b413763c26090454079908f9613d01b3b Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 25 Sep 2024 22:59:07 +0100 Subject: [PATCH 23/70] Updating labels in Scripts tab of response section based on what happens with the scripts --- src/posting/app.py | 49 ++++++++++++----- src/posting/scripts.py | 5 ++ src/posting/widgets/response/script_output.py | 52 ++++++++++++++++++- 3 files changed, 91 insertions(+), 15 deletions(-) diff --git a/src/posting/app.py b/src/posting/app.py index 018ba2d4..0ffd5675 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -65,6 +65,7 @@ from posting.widgets.request.url_bar import UrlInput, UrlBar from posting.widgets.response.response_area import ResponseArea from posting.widgets.response.response_trace import Event, ResponseTrace +from posting.widgets.response.script_output import ScriptOutput from posting.xresources import load_xresources_themes @@ -210,7 +211,7 @@ def get_and_run_script( title=f"Error loading script {function_name}", message=f"The script at {script_path} could not be loaded: {e}", ) - return + raise if script_function is not None: try: @@ -230,6 +231,7 @@ def get_and_run_script( title=f"Error running {function_name} script", message=f"{e}", ) + raise else: log.warning(f"{function_name.capitalize()} script not found: {script_path}") self.notify( @@ -237,6 +239,7 @@ def get_and_run_script( title=f"{function_name.capitalize()} script not found", message=f"The {function_name} script at {script_path} could not be found.", ) + raise async def send_request(self) -> None: self.url_bar.clear_events() @@ -297,12 +300,20 @@ async def send_request(self) -> None: # If there's an associated pre-request script, run it. if on_request := request_model.scripts.on_request: print("running on_request script...") - self.get_and_run_script( - on_request, - "on_request", - request, - script_context, - ) + try: + self.get_and_run_script( + on_request, + "on_request", + request, + script_context, + ) + except Exception: + self.response_script_output.set_request_status("error") + # TODO - load the error into the response area, or log it. + else: + self.response_script_output.set_request_status("success") + else: + self.response_script_output.set_request_status("no-script") response = await client.send( request=request, @@ -314,12 +325,20 @@ async def send_request(self) -> None: if on_response := request_model.scripts.on_response: print("running on_response script...") script_context.response = response - self.get_and_run_script( - on_response, - "on_response", - response, - script_context, - ) + try: + self.get_and_run_script( + on_response, + "on_response", + response, + script_context, + ) + except Exception: + self.response_script_output.set_response_status("error") + # TODO - load the error into the response area, or log it. + else: + self.response_script_output.set_response_status("success") + else: + self.response_script_output.set_response_status("no-script") except httpx.ConnectTimeout as connect_timeout: log.error("Connect timeout", connect_timeout) @@ -667,6 +686,10 @@ def collection_tree(self) -> CollectionTree: def response_trace(self) -> ResponseTrace: return self.query_one(ResponseTrace) + @property + def response_script_output(self) -> ScriptOutput: + return self.query_one(ScriptOutput) + class Posting(App[None], inherit_bindings=False): AUTO_FOCUS = None diff --git a/src/posting/scripts.py b/src/posting/scripts.py index 0703f22e..76fee649 100644 --- a/src/posting/scripts.py +++ b/src/posting/scripts.py @@ -64,6 +64,11 @@ def clear_variable(self, name: str) -> None: del self._app.session_env[name] update_variables(self._app.session_env) + def clear_all_variables(self) -> None: + """Clear all session variables.""" + self._app.session_env.clear() + update_variables(self._app.session_env) + def notify( self, message: str, diff --git a/src/posting/widgets/response/script_output.py b/src/posting/widgets/response/script_output.py index 8de73fe5..1695468e 100644 --- a/src/posting/widgets/response/script_output.py +++ b/src/posting/widgets/response/script_output.py @@ -4,24 +4,72 @@ post-response scripts. """ +from typing import Literal from textual.app import ComposeResult from textual.containers import Horizontal, Vertical, VerticalScroll +from textual.reactive import Reactive, reactive from textual.widgets import Label +ScriptStatus = Literal["success", "error", "no-script"] + class ScriptOutput(VerticalScroll): DEFAULT_CSS = """\ ScriptOutput { padding: 0 2; + + & Label { + &.-success { + color: $success; + } + &.-error { + color: $error; + } + &.-no-script { + color: $text-muted; + } + } } """ + request_status: Reactive[ScriptStatus] = reactive("no-script") + response_status: Reactive[ScriptStatus] = reactive("no-script") + def compose(self) -> ComposeResult: with Horizontal(): with Vertical(): yield Label("Pre-request") - yield Label("Status") + yield Label(self.request_status, id="request-status") with Vertical(): yield Label("Post-request") - yield Label("Status") + yield Label(self.response_status, id="response-status") + + def set_request_status(self, status: ScriptStatus) -> None: + """Set the status of the request.""" + self.request_status = status + self.set_label_status("request-status", status) + + def set_response_status(self, status: ScriptStatus) -> None: + """Set the status of the response.""" + self.response_status = status + self.set_label_status("response-status", status) + + def set_label_status(self, label_id: str, status: ScriptStatus) -> None: + """Set the status of a label.""" + label = self.query_one(f"#{label_id}") + success = status == "success" + error = status == "error" + no_script = status == "no-script" + + if isinstance(label, Label): + label.set_class(success, "-success") + label.set_class(error, "-error") + label.set_class(no_script, "-no-script") + + if success: + label.update("Success") + elif error: + label.update("Error") + elif no_script: + label.update("No script") From 070867b8146a11169fb09aa5b7da13114fce288e Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sun, 29 Sep 2024 20:22:35 +0100 Subject: [PATCH 24/70] Logging from scripts --- src/posting/app.py | 48 ++++++++++++++----- src/posting/posting.scss | 4 ++ src/posting/widgets/response/script_output.py | 24 +++++++++- src/posting/widgets/rich_log.py | 33 +++++++++++++ tests/sample-collections/scripts/my_script.py | 4 ++ 5 files changed, 99 insertions(+), 14 deletions(-) create mode 100644 src/posting/widgets/rich_log.py diff --git a/src/posting/app.py b/src/posting/app.py index 0ffd5675..da91a800 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -1,7 +1,11 @@ import inspect +from contextlib import redirect_stdout, redirect_stderr +from io import StringIO from pathlib import Path from typing import Any, Literal, cast + import httpx + from rich.console import Group from rich.text import Text from textual import on, log, work @@ -20,6 +24,7 @@ Footer, Input, Label, + RichLog, TextArea, ) from textual.widgets._tabbed_content import ContentTab @@ -66,6 +71,7 @@ from posting.widgets.response.response_area import ResponseArea from posting.widgets.response.response_trace import Event, ResponseTrace from posting.widgets.response.script_output import ScriptOutput +from posting.widgets.rich_log import RichLogIO from posting.xresources import load_xresources_themes @@ -182,7 +188,10 @@ def compose(self) -> ComposeResult: yield Footer(show_command_palette=False) def get_and_run_script( - self, path_to_script: str, default_function_name: str, *args: Any + self, + path_to_script: str, + default_function_name: str, + *args: Any, ) -> None: """ Get and run a function from a script. @@ -215,15 +224,29 @@ def get_and_run_script( if script_function is not None: try: - # Get the number of parameters the script function expects - signature = inspect.signature(script_function) - num_params = len(signature.parameters) + script_output = self.response_script_output + script_output.log_function_call_start( + f"{script_path.name}:{function_name}" + ) + + rich_log = script_output.rich_log + stdout_log = RichLogIO(rich_log, "stdout") + stderr_log = RichLogIO(rich_log, "stderr") + + with redirect_stdout(stdout_log), redirect_stderr(stderr_log): + # Ensure we pass in the number of parameters the user has + # implicitly requested in their script. + signature = inspect.signature(script_function) + num_params = len(signature.parameters) + if num_params > 0: + script_function(*args[:num_params]) + else: + script_function() + + # Ensure any remaining content is flushed + stdout_log.flush() + stderr_log.flush() - # Call the function with the appropriate number of arguments - if num_params > 0: - script_function(*args[:num_params]) - else: - script_function() except Exception as e: log.error(f"Error running {function_name} script: {e}") self.notify( @@ -297,9 +320,11 @@ async def send_request(self) -> None: script_context = PostingContext(app) script_context.request = request + script_output = self.response_script_output + script_output.reset() + # If there's an associated pre-request script, run it. if on_request := request_model.scripts.on_request: - print("running on_request script...") try: self.get_and_run_script( on_request, @@ -322,9 +347,8 @@ async def send_request(self) -> None: print("response cookies =", response.cookies) self.post_message(HttpResponseReceived(response)) + script_context.response = response if on_response := request_model.scripts.on_response: - print("running on_response script...") - script_context.response = response try: self.get_and_run_script( on_response, diff --git a/src/posting/posting.scss b/src/posting/posting.scss index 118282f7..0d7fb28a 100644 --- a/src/posting/posting.scss +++ b/src/posting/posting.scss @@ -134,6 +134,10 @@ Footer { } } +RichLog { + background: $surface; +} + ContentTab { padding: 0 1; height: 1; diff --git a/src/posting/widgets/response/script_output.py b/src/posting/widgets/response/script_output.py index 1695468e..8b04eab7 100644 --- a/src/posting/widgets/response/script_output.py +++ b/src/posting/widgets/response/script_output.py @@ -5,10 +5,11 @@ """ from typing import Literal +from rich.rule import Rule from textual.app import ComposeResult from textual.containers import Horizontal, Vertical, VerticalScroll from textual.reactive import Reactive, reactive -from textual.widgets import Label +from textual.widgets import Label, RichLog ScriptStatus = Literal["success", "error", "no-script"] @@ -36,6 +37,7 @@ class ScriptOutput(VerticalScroll): response_status: Reactive[ScriptStatus] = reactive("no-script") def compose(self) -> ComposeResult: + self.can_focus = False with Horizontal(): with Vertical(): yield Label("Pre-request") @@ -45,6 +47,9 @@ def compose(self) -> ComposeResult: yield Label("Post-request") yield Label(self.response_status, id="response-status") + yield Label("Script Output") + yield RichLog(markup=True, highlight=True) + def set_request_status(self, status: ScriptStatus) -> None: """Set the status of the request.""" self.request_status = status @@ -72,4 +77,19 @@ def set_label_status(self, label_id: str, status: ScriptStatus) -> None: elif error: label.update("Error") elif no_script: - label.update("No script") + label.update("-") + + def reset(self) -> None: + """Reset the output.""" + self.rich_log.clear() + self.set_request_status("no-script") + self.set_response_status("no-script") + + def log_function_call_start(self, function: str) -> None: + """Log the start of a function call.""" + self.rich_log.write(f"[b dim]Running {function}:[/]") + + @property + def rich_log(self) -> RichLog: + """Get the RichLog widget which stdout and stderr are printed to.""" + return self.query_one(RichLog) diff --git a/src/posting/widgets/rich_log.py b/src/posting/widgets/rich_log.py new file mode 100644 index 00000000..12740d04 --- /dev/null +++ b/src/posting/widgets/rich_log.py @@ -0,0 +1,33 @@ +from io import StringIO +from typing import Literal +from textual.widgets import RichLog + + +class RichLogIO(StringIO): + def __init__(self, rich_log: RichLog, stream_type: Literal["stdout", "stderr"]): + super().__init__() + self.rich_log: RichLog = rich_log + self.stream_type: Literal["stdout", "stderr"] = stream_type + self._buffer: str = "" + + def write(self, s: str) -> int: + lines = (self._buffer + s).splitlines(True) + self._buffer = "" + for line in lines: + if line.endswith("\n"): + self._flush_line(line.rstrip("\n")) + else: + self._buffer = line + return len(s) + + def _flush_line(self, line: str) -> None: + if self.stream_type == "stdout": + self.rich_log.write(f"[green]out[/green] {line}") + else: + self.rich_log.write(f"[red]err[/red] {line}") + + def flush(self) -> None: + if self._buffer: + self._flush_line(self._buffer) + self._buffer = "" + super().flush() diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py index b80902ff..2b1b5b1b 100644 --- a/tests/sample-collections/scripts/my_script.py +++ b/tests/sample-collections/scripts/my_script.py @@ -1,3 +1,4 @@ +import sys import httpx from posting.scripts import Posting @@ -11,8 +12,11 @@ def on_request(request: httpx.Request, posting: Posting) -> None: message="Hello from my_script.py!", ) posting.set_variable("set_in_script", "foo") + sys.stderr.write("Hello from my_script.py:on_request - i'm an error!") def on_response(response: httpx.Response, posting: Posting) -> None: print(response.status_code) print(posting.variables["set_in_script"]) # prints "foo" + sys.stderr.write("Hello from my_script.py:on_response - i'm an error!") + sys.stdout.write("Hello from my_script.py!") From a201a66e60fc63a3d7003653a7d9c6aeb6c994f5 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sun, 29 Sep 2024 20:39:26 +0100 Subject: [PATCH 25/70] Improving script log output --- src/posting/posting.scss | 7 +++++++ src/posting/widgets/response/script_output.py | 8 +++++--- src/posting/widgets/rich_log.py | 4 ++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/posting/posting.scss b/src/posting/posting.scss index 0d7fb28a..9d63ed74 100644 --- a/src/posting/posting.scss +++ b/src/posting/posting.scss @@ -136,6 +136,13 @@ Footer { RichLog { background: $surface; + padding-left: 1; + + &:focus { + background: $surface-lighten-1; + border-left: wide $accent; + padding-left: 0; + } } ContentTab { diff --git a/src/posting/widgets/response/script_output.py b/src/posting/widgets/response/script_output.py index 8b04eab7..da95ff97 100644 --- a/src/posting/widgets/response/script_output.py +++ b/src/posting/widgets/response/script_output.py @@ -18,7 +18,9 @@ class ScriptOutput(VerticalScroll): DEFAULT_CSS = """\ ScriptOutput { padding: 0 2; - + & #status-bar { + height: 3; + } & Label { &.-success { color: $success; @@ -38,7 +40,7 @@ class ScriptOutput(VerticalScroll): def compose(self) -> ComposeResult: self.can_focus = False - with Horizontal(): + with Horizontal(id="status-bar"): with Vertical(): yield Label("Pre-request") yield Label(self.request_status, id="request-status") @@ -47,7 +49,7 @@ def compose(self) -> ComposeResult: yield Label("Post-request") yield Label(self.response_status, id="response-status") - yield Label("Script Output") + yield Label("Script output") yield RichLog(markup=True, highlight=True) def set_request_status(self, status: ScriptStatus) -> None: diff --git a/src/posting/widgets/rich_log.py b/src/posting/widgets/rich_log.py index 12740d04..e050d0bc 100644 --- a/src/posting/widgets/rich_log.py +++ b/src/posting/widgets/rich_log.py @@ -22,9 +22,9 @@ def write(self, s: str) -> int: def _flush_line(self, line: str) -> None: if self.stream_type == "stdout": - self.rich_log.write(f"[green]out[/green] {line}") + self.rich_log.write(f" [green]out[/green] {line}") else: - self.rich_log.write(f"[red]err[/red] {line}") + self.rich_log.write(f" [red]err[/red] {line}") def flush(self) -> None: if self._buffer: From d161f011d49b24ce0626ecdb9b7105b2a4ffb82d Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sun, 29 Sep 2024 21:40:18 +0100 Subject: [PATCH 26/70] Update roadmap, add scripting docs --- docs/guide/scripting.md | 67 +++++++++++++++++++++++++++++++++++++++++ docs/roadmap.md | 1 + mkdocs.yml | 1 + 3 files changed, 69 insertions(+) create mode 100644 docs/guide/scripting.md diff --git a/docs/guide/scripting.md b/docs/guide/scripting.md new file mode 100644 index 00000000..1e206647 --- /dev/null +++ b/docs/guide/scripting.md @@ -0,0 +1,67 @@ +## Overview + +You can attach simple Python scripts to requests, and have Posting run them before and/or after the request is made. This powerful feature allows you to: + +- Perform setup before a request (e.g. setting headers, preparing data) +- Print logs and messages +- Set variables to be used in later requests (e.g. authentication tokens) +- Inspect request and response objects, and manipulate them +- Pretty much anything else you can think of doing with Python! + +## Script Types + +Posting supports two types of scripts: + +1. **Pre-request Scripts**: Runs before the request is sent, but after variables have been substituted. +2. **Post-response Scripts**: Runs after the response is received. + +## Writing Scripts + +In the context of Posting, a "script" is a regular Python function. + +By default, if you specify a path to a Python file, Posting will look for and execute the `on_request` and `on_response` functions at the appropriate times. + +- `on_request(request: httpx.Request, posting: Posting) -> None` +- `on_response(response: httpx.Response, posting: Posting) -> None` + +You can also specify the name of the function using the format `path/to/script.py:function_to_run`. + +Note that you do not need to specify all of the arguments when writing these functions. Posting will only pass the number of arguments that you've specified when it calls your function. + +### The `Posting` Object + +The `Posting` object provides access to the application context and useful methods: + +- `set_variable(name: str, value: str) -> None`: Set a session variable +- `get_variable(name: str) -> str | None`: Get a session variable +- `clear_variable(name: str) -> None`: Clear a specific session variable +- `clear_all_variables() -> None`: Clear all session variables +- `notify(message: str, title: str = "", severity: str = "information", timeout: float | None = None)`: Send a notification to the user + +### Example: Pre-request Script + +```python +def on_request(request: httpx.Request, posting: Posting) -> None: + # Set a custom header on the request. + request.headers["X-Custom-Header"] = "foo" + + # This will be captured and written to the log. + print("Request is being sent!") + + # Make a notification pop-up in the UI. + posting.notify("Request is being sent!") +``` + +### Example: Post-response Script + +```python +def on_response(response: httpx.Response, posting: Posting) -> None: + # Print the status code of the response to the log. + print(response.status_code) + + # Set a variable to be used in later requests. + # You can write '$auth_token' in the UI and it will be substituted with + # the value of the $auth_token variable. + posting.set_variable("auth_token", response.headers["Authorization"]) +``` + diff --git a/docs/roadmap.md b/docs/roadmap.md index 1253cea1..16aafe60 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -14,6 +14,7 @@ If you have any feedback or suggestions, please open a new discussion on GitHub. - Watching environment files for changes & updating the UI. ✅ - Editing key/value editor rows without having to delete/re-add them. - Quickly open MDN links for headers. +- Templates. Create a `_template.posting.yaml` file (perhaps a checkbox in the new request modal for this). Any requests created in a collection will be based off of the nearest template (looking upwards to the collection root). Note that this is not "inheritance" - it's a means of quickly pre-filling values in requests based on a template request. - Saving recently used environments to a file. - Saving recently used collections to a file. - Viewing the currently loaded environment keys/values in a popup. diff --git a/mkdocs.yml b/mkdocs.yml index 3f3d7060..9de91133 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -35,6 +35,7 @@ nav: - "Help System": "guide/help_system.md" - "Themes": "guide/themes.md" - "Importing": "guide/importing.md" + - "Scripting": "guide/scripting.md" - Roadmap: "roadmap.md" - Changelog: "CHANGELOG.md" - FAQ: "faq.md" From 0fdb764245df4a51a391e67392a023e79063bec0 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 5 Oct 2024 20:40:54 +0100 Subject: [PATCH 27/70] Add setup scripts, polish docs, tidying things --- docs/guide/scripting.md | 75 +++++++++++++++---- src/posting/app.py | 29 +++++-- src/posting/collection.py | 3 + .../widgets/request/request_scripts.py | 14 ++++ src/posting/widgets/response/script_output.py | 18 +++-- tests/sample-collections/echo.posting.yaml | 4 + tests/sample-collections/scripts/my_script.py | 4 + 7 files changed, 120 insertions(+), 27 deletions(-) diff --git a/docs/guide/scripting.md b/docs/guide/scripting.md index 1e206647..cb9de84b 100644 --- a/docs/guide/scripting.md +++ b/docs/guide/scripting.md @@ -1,8 +1,9 @@ ## Overview -You can attach simple Python scripts to requests, and have Posting run them before and/or after the request is made. This powerful feature allows you to: +You can attach simple Python scripts to requests, and have Posting run them at various stages of the request lifecycle. This powerful feature allows you to: -- Perform setup before a request (e.g. setting headers, preparing data) +- Perform setup before a request (e.g. setting variables, preparing data) +- Set or modify headers, query parameters, and other request properties - Print logs and messages - Set variables to be used in later requests (e.g. authentication tokens) - Inspect request and response objects, and manipulate them @@ -10,36 +11,55 @@ You can attach simple Python scripts to requests, and have Posting run them befo ## Script Types -Posting supports two types of scripts: +Posting supports three types of scripts, which run at different points in the request/response lifecycle: -1. **Pre-request Scripts**: Runs before the request is sent, but after variables have been substituted. -2. **Post-response Scripts**: Runs after the response is received. +1. **Setup Scripts**: Runs before the request is constructed. This is useful for setting initial variables which may be substituted into the request. +2. **Pre-request Scripts**: Runs after the request has been constructed and variables have been substituted, but before the request is sent. You can directly modify the request object here. +3. **Post-response Scripts**: Runs after the response is received. This is useful for extracting data from the response, or for performing cleanup. ## Writing Scripts In the context of Posting, a "script" is a regular Python function. -By default, if you specify a path to a Python file, Posting will look for and execute the `on_request` and `on_response` functions at the appropriate times. +By default, if you specify a path to a Python file, Posting will look for and execute the following functions at the appropriate times: +- `setup(posting: Posting) -> None` - `on_request(request: httpx.Request, posting: Posting) -> None` - `on_response(response: httpx.Response, posting: Posting) -> None` -You can also specify the name of the function using the format `path/to/script.py:function_to_run`. +However, you can have Posting call any function you wish using the syntax `path/to/script.py:function_to_run`. -Note that you do not need to specify all of the arguments when writing these functions. Posting will only pass the number of arguments that you've specified when it calls your function. +Note that you do not need to specify all of the arguments when writing these functions. Posting will only pass the number of arguments that you've specified when it calls your function. For example, you could define a your `on_request` function as `def on_request(request: httpx.Request) -> None` and Posting would call it with `on_request(request: httpx.Request)` without passing the `posting` argument. -### The `Posting` Object +### Example: Setup Script -The `Posting` object provides access to the application context and useful methods: +The **setup script** is run before the request is built. +You can set variables in the setup script that can be used in the request. +For example, you could use `httpx` to fetch an access token, then set the token as a variable so that it may be substituted into the request. -- `set_variable(name: str, value: str) -> None`: Set a session variable -- `get_variable(name: str) -> str | None`: Get a session variable -- `clear_variable(name: str) -> None`: Clear a specific session variable -- `clear_all_variables() -> None`: Clear all session variables -- `notify(message: str, title: str = "", severity: str = "information", timeout: float | None = None)`: Send a notification to the user +```python +def setup(posting: Posting) -> None: + # Set a variable which may be used in this request + # (or other requests to follow) + posting.set_variable("auth_token", "1234567890") +``` + +With this setup script attached to a request, you can then reference the `auth_token` variable in the request UI by typing `$auth_token`. +The `$auth_token` variable will remain for the duration of the session, +so you may wish to add a check to see if it has already been set in this session: + +```python +def setup(posting: Posting) -> None: + if not posting.get_variable("auth_token"): + posting.set_variable("auth_token", "1234567890") +``` ### Example: Pre-request Script +The **pre-request script** is run after the request has been constructed and variables have been substituted, right before the request is sent. + +You can directly modify the `Request` object in this function, for example to set headers, query parameters, etc. + ```python def on_request(request: httpx.Request, posting: Posting) -> None: # Set a custom header on the request. @@ -54,6 +74,10 @@ def on_request(request: httpx.Request, posting: Posting) -> None: ### Example: Post-response Script +The **post-response script** is run after the response is received. +You can use this to extract data from the response, for example a JWT token, +and set it as a variable to be used in later requests. + ```python def on_response(response: httpx.Response, posting: Posting) -> None: # Print the status code of the response to the log. @@ -65,3 +89,24 @@ def on_response(response: httpx.Response, posting: Posting) -> None: posting.set_variable("auth_token", response.headers["Authorization"]) ``` +### The `Posting` Object + +The `Posting` object provides access to the application context and useful methods: + +- `set_variable(name: str, value: str) -> None`: Set a session variable +- `get_variable(name: str) -> str | None`: Get a session variable +- `clear_variable(name: str) -> None`: Clear a specific session variable +- `clear_all_variables() -> None`: Clear all session variables +- `notify(message: str, title: str = "", severity: str = "information", timeout: float | None = None)`: Send a notification to the user + +Note that variables are described as "session variables" because they persist for the duration of the session (until you close Posting). + +### Libraries + +You can make use of any library that is available in the Python environment that Posting is running in. This means you can use all of the Python standard library as well as any of Posting's dependencies (such as `httpx`, `pyyaml`, `pydantic`, etc). + +If you install Posting with `uv`, you can easily add extra dependencies which you can then use in your scripts: + +```bash +uv tool install posting --with +``` diff --git a/src/posting/app.py b/src/posting/app.py index da91a800..00b23645 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -24,7 +24,6 @@ Footer, Input, Label, - RichLog, TextArea, ) from textual.widgets._tabbed_content import ContentTab @@ -266,6 +265,9 @@ def get_and_run_script( async def send_request(self) -> None: self.url_bar.clear_events() + script_output = self.response_script_output + script_output.reset() + request_options = self.request_options.to_model() cert_config = SETTINGS.get().ssl @@ -277,10 +279,28 @@ async def send_request(self) -> None: if password := cert_config.password: httpx_cert_config.append(password.get_secret_value()) + app = cast("Posting", self.app) + script_context = PostingContext(app) + cert = cast(CertTypes, tuple(httpx_cert_config)) try: - # We must apply the template before we can do anything else. + # Run setup scripts first request_model = self.build_request_model(request_options) + if setup_script := request_model.scripts.setup: + try: + self.get_and_run_script( + setup_script, + "setup", + script_context, + ) + except Exception: + self.response_script_output.set_setup_status("error") + else: + self.response_script_output.set_setup_status("success") + else: + self.response_script_output.set_setup_status("no-script") + + # Now apply the template variables = get_variables() try: request_model.apply_template(variables) @@ -316,13 +336,8 @@ async def send_request(self) -> None: print("timeout =", request_model.options.timeout) print("auth =", request_model.auth) - app = cast("Posting", self.app) - script_context = PostingContext(app) script_context.request = request - script_output = self.response_script_output - script_output.reset() - # If there's an associated pre-request script, run it. if on_request := request_model.scripts.on_request: try: diff --git a/src/posting/collection.py b/src/posting/collection.py index 9f56143d..32fa5593 100644 --- a/src/posting/collection.py +++ b/src/posting/collection.py @@ -116,6 +116,9 @@ def request_sort_key(request: RequestModel) -> tuple[int, str]: class Scripts(BaseModel): + setup: str | None = Field(default=None) + """A relative path to a script that will be run before the template is applied.""" + on_request: str | None = Field(default=None) """A relative path to a script that will be run before the request is sent.""" diff --git a/src/posting/widgets/request/request_scripts.py b/src/posting/widgets/request/request_scripts.py index 68633bc0..a429545c 100644 --- a/src/posting/widgets/request/request_scripts.py +++ b/src/posting/widgets/request/request_scripts.py @@ -183,6 +183,13 @@ def __init__( def compose(self) -> ComposeResult: self.can_focus = False + yield Label("Setup script [dim]optional[/dim]") + yield ScriptPathInput( + collection_root=self.collection_root, + placeholder="Collection-relative path to setup script", + id="setup-script", + ) + yield Label("Pre-request script [dim]optional[/dim]") yield ScriptPathInput( collection_root=self.collection_root, @@ -198,6 +205,10 @@ def compose(self) -> ComposeResult: ) def on_mount(self) -> None: + auto_complete_setup = AutoComplete( + candidates=self.get_script_candidates, + target=self.query_one("#setup-script", Input), + ) auto_complete_pre_request = AutoComplete( candidates=self.get_script_candidates, target=self.query_one("#pre-request-script", Input), @@ -207,6 +218,7 @@ def on_mount(self) -> None: target=self.query_one("#post-response-script", Input), ) + self.screen.mount(auto_complete_setup) self.screen.mount(auto_complete_pre_request) self.screen.mount(auto_complete_post_response) @@ -217,11 +229,13 @@ def get_script_candidates(self, state: TargetState) -> list[DropdownItem]: return scripts def load_scripts(self, scripts: Scripts) -> None: + self.query_one("#setup-script", Input).value = scripts.setup or "" self.query_one("#pre-request-script", Input).value = scripts.on_request or "" self.query_one("#post-response-script", Input).value = scripts.on_response or "" def to_model(self) -> Scripts: return Scripts( + setup=self.query_one("#setup-script", Input).value or None, on_request=self.query_one("#pre-request-script", Input).value or None, on_response=self.query_one("#post-response-script", Input).value or None, ) diff --git a/src/posting/widgets/response/script_output.py b/src/posting/widgets/response/script_output.py index da95ff97..bcafeedd 100644 --- a/src/posting/widgets/response/script_output.py +++ b/src/posting/widgets/response/script_output.py @@ -1,11 +1,10 @@ """Tab for displaying the output of a script. - +https://github.com/sergeyklay/gohugo-theme-ed/blob/main/exampleSite/hugo.toml This could be test results, logs, or other output from pre-request or post-response scripts. """ from typing import Literal -from rich.rule import Rule from textual.app import ComposeResult from textual.containers import Horizontal, Vertical, VerticalScroll from textual.reactive import Reactive, reactive @@ -35,23 +34,31 @@ class ScriptOutput(VerticalScroll): } """ + setup_status: Reactive[ScriptStatus] = reactive("no-script") request_status: Reactive[ScriptStatus] = reactive("no-script") response_status: Reactive[ScriptStatus] = reactive("no-script") def compose(self) -> ComposeResult: self.can_focus = False with Horizontal(id="status-bar"): + with Vertical(): + yield Label("Setup") + yield Label(self.setup_status, id="setup-status") with Vertical(): yield Label("Pre-request") yield Label(self.request_status, id="request-status") - with Vertical(): - yield Label("Post-request") + yield Label("Post-response") yield Label(self.response_status, id="response-status") yield Label("Script output") yield RichLog(markup=True, highlight=True) + def set_setup_status(self, status: ScriptStatus) -> None: + """Set the status of the setup script.""" + self.setup_status = status + self.set_label_status("setup-status", status) + def set_request_status(self, status: ScriptStatus) -> None: """Set the status of the request.""" self.request_status = status @@ -84,12 +91,13 @@ def set_label_status(self, label_id: str, status: ScriptStatus) -> None: def reset(self) -> None: """Reset the output.""" self.rich_log.clear() + self.set_setup_status("no-script") self.set_request_status("no-script") self.set_response_status("no-script") def log_function_call_start(self, function: str) -> None: """Log the start of a function call.""" - self.rich_log.write(f"[b dim]Running {function}:[/]") + self.rich_log.write(f"[b dim]Running {function}[/]") @property def rich_log(self) -> RichLog: diff --git a/tests/sample-collections/echo.posting.yaml b/tests/sample-collections/echo.posting.yaml index 0d32ee4b..406afdbf 100644 --- a/tests/sample-collections/echo.posting.yaml +++ b/tests/sample-collections/echo.posting.yaml @@ -6,7 +6,11 @@ body: form_data: - name: something value: '123' +headers: +- name: X-Setup-Var + value: $setup_var scripts: + setup: scripts/my_script.py on_request: scripts/my_script.py on_response: scripts/my_script.py options: diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py index 2b1b5b1b..82aaa557 100644 --- a/tests/sample-collections/scripts/my_script.py +++ b/tests/sample-collections/scripts/my_script.py @@ -4,6 +4,10 @@ from posting.scripts import Posting +def setup(posting: Posting) -> None: + posting.set_variable("setup_var", "ADDED IN SETUP") + + def on_request(request: httpx.Request, posting: Posting) -> None: new_header = "Foo-Bar-Baz!!!!!" request.headers["X-Custom-Header"] = new_header From 7b29b18e16402c96f67cf2ab3c5a4072ba4c7d08 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 5 Oct 2024 20:43:43 +0100 Subject: [PATCH 28/70] Fixing test --- .coverage | Bin 53248 -> 53248 bytes tests/test_snapshots.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.coverage b/.coverage index bc6aff2a99d2b1f6a35bf34f173bbac0edf3ad60..86db2fe22a79dacae9be6bbbeab62a3a2a8fe12a 100644 GIT binary patch delta 2209 zcmZ9NdrVYU9>>qUznQr+ckVrBM1%pEVHo96R0N?g2n%c)OV?U4?Y2;Pjp759m#83G zW=3q!xQamcc8y7QU9#CtOw&~>+0-}FG^Vy1H2dhbOeEs0-hrWe^_5FmG1nVd6-xouHl&eW4O{VkGhteMD=Th##Jj*$Q zm{6cqmD+@r+P+eUkgt7Mnk=}q&q@t**Ydp?T}TKT6Y$=><|ABHxle z(m^WmUHk>Pfm@|F&COC9HmMW%BePSH$j9nmr93TTU5Q1ypxiX&E8i)8bCJ1M`Za5L z-k?>M+w=tvSS4tkr3w0#$xtR}CrXo8_dvN#=UN1>YInpEolX8ywEA?G#Q%N>IMLY&# zEi*>%0W+=A3#P6Z{gse6D1>{P!&?P(>ADy$_Iy9sQRh7^%`Hdh(y0b;_&*PaUPZSW zkp-b)+vmF;zFBQ<`gn;WOF-zO_PUE#?p?g_w-wJu*Noox?Qee`V}nz#4IWc-?%cKx zuyugYWO#7xm7)*&y~-p)0TfnCKAm!d`-mXX8l7OWNKK-iR_IJ7ESNiyQ7}1{5~sG-5{+C`mR+PP>!LHR458YT zz;~i+tm8zxCj$*No@g9sTzKc}%jl^CJt(fUp!dh}$8JuvM7mks=SF`PF8ZKBumodi zWn>OrQ(}}4WnQU8RVXlskngnFNY}GU6r}t{jG}KdnIe9blg$o#YBgd{BiqO;nAYZN z+q;u$=8`Dasqk|@I&a9~bIjS6+{a{2MZcJF4^2OJa~?-70ox-jyK6b1U}$vxj?3i_ zuZnYS;fnDTzlHVXEf%dMk!d0gOn%JdTm#9kG977P@+%RSH<0}1h|3zx_sdNEe*>G} zqYe`4ry}xZA>zWd5 zejRfPmwB?;m@LL-XGV5;>!t3a!b#u6__*R1Sv`J9D1Q(=Nro7|z|xHL(6h1|Ml_wc zp?x&eJ~5tA6zxZ>kp9AjZaC5O)5wXkh;Fe_Z)E$l(2yCX+YT^$C~@R`EV82=D0CP3 zo?z->3+$;QaYEqf#xJMM7TU=SXUY%PA@t=a3SXLui=z9Pm9p4wJQEIwe|I_&wRmiV z?qjB7kw#sLIHk%ee%)IMd+(=L_KDOoO?BQ=pUQ$?y*6V%X2Q2=;L%!Cp=Wv~wmx z8>b!ia3;Vm&V}2dm5X@T$r%SNoUzcv83T=+3!s5B8g_6-!8Xo$P|s~dME&-4vY*rh5rIKb})?q delta 2015 zcma*odu&rx90%}o@2~CceVtRvUftSmE3Cu8y3LKPo48F4PL06S#0RhOh@eIh3^*X! zx`}Y)u?@I7c?b*yD)H~yNO!f#0P)YqjoSk|xN9jZr@$S(bR zX`JD!EXUdzxmdfVQMFWUk~-J|A&XJ;oXcF21|tRIg$k#+I0MEA#{7zOv)=_}g3(gp z2wr$@@Q?sP$gkvxN{Kc~$?@KWUB&0Ly0z2VZf%pY zLTgs2wp5$KmgQH_Vat)H)+~xQ3v&H@b0jLc`=a5S8_cNBr{0Z*e~A9taPJWCxm~-j zboaGKzsg4FQg71wajn0NojG-auvkW@@=(gT8?Mj~A2(l)PU|m}&L8;u`Xh8_Yt_kz z+jZmj#jXS^1(P7#!Mjd0Q^6$5SjeD>#?{7@K=5#R*Qi-g*4rylolUaoPsCfO%o3Ir ziAu4SG((hVVJsD1ClW1)rGo2{L^EP3n(Rh|^@y*0SiK&o{6TwX}>y_fj$pkAyX)2BMGI0I>%sH71D#D8 zK`m^?d`qNi+Ocb*zh~b1>RKN<{Y~(-eXmVD_eEk|stMhjuJ&i&9MN<4whPCW2kq9K z5M7y#L}v{(|I1Sv`F|hNg#UU>#qx+mYGQYqYnqX2uS27{j53KZ!BDz?zPe)R@jSnN3Aj)&SKnf-_Iy4)BIS@e=9$XUG#oq z&a%|FJl65#m9n3g<=&yHen}rnbB%4wvh#9c-;ncbrpZHnEI#UsR7Xnt&1^r!*ro`A zCHCImT2p#;*nY`Hvkhy5>p?5Mz3Sdlb!N)7+Vz4x!`jl;dI5M!l@z@!mWM zk>ep0J$Tz;r-NC`JJ@aA6OBeUwWgw(wJt&jv1Zz!TH*SI+t-^zSKKa|W?XJ?i!{}c z8;gpmn~i6=BQ@@>s@k$;AlBU;If-c0$=bM#~I zK9fk3Sl^ozIrVATg)=96dlrOlnJ3T$Be5ydwyWbsp|9_9Vz|#fsO#dHAC1vXUdW?y zMtxIWSppr%KIt3S?_>LBwZ^uvoV~k)yUJquJvp zmfi{^QJZn8$r&bqyhioG)cph2B z4$pT;9iBzzl9}WsG6}y-o+p*$F;b2v6F>4 zS$qt4um%6Qf=*kr9*7+SqJ}=f0b~&+UP-72FF+=qMIjltu@OJ7{IH*!4?(UEc60B8 z?cBkznVSk5xXG}F8xQYsZLpjx0Y8333j`MNh8Y%eP4G4sU;$Tzw=C>X6QQ1$MerH7 z5cYA0!>8N=_=I~u?B(V`8#fpBaC4xQn++dxhrurHPzdbgAq#eJhrl*&CVa&8!d7ku zY~c=q54j%L#7&2d+%#z6x?w%n1?#v@_<)-NYq<_s%}s(;+{9PleI62^nHvZ1atDIJ zwZls809e5#(8R^i$km~NtHCm^3QM^PEaA$qm}`Z1_O_VPpagdsQpX(jhdKoZJ5PIr FzX0OrB((ql diff --git a/tests/test_snapshots.py b/tests/test_snapshots.py index 03ee3b09..d7d6cd8e 100644 --- a/tests/test_snapshots.py +++ b/tests/test_snapshots.py @@ -60,7 +60,7 @@ def test_click_switch(self, snap_compare): async def run_before(pilot: Pilot): await pilot.press("ctrl+o") # enter jump mode - await pilot.press("y") # target "Options" tab + await pilot.press("u") # target "Options" tab assert snap_compare(POSTING_MAIN, run_before=run_before) From aaa88a873f7233dbf007edc37994306e4e3c2112 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Tue, 8 Oct 2024 18:15:26 +0100 Subject: [PATCH 29/70] Add scripting note --- docs/guide/scripting.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/guide/scripting.md b/docs/guide/scripting.md index cb9de84b..9e0d006d 100644 --- a/docs/guide/scripting.md +++ b/docs/guide/scripting.md @@ -29,6 +29,10 @@ By default, if you specify a path to a Python file, Posting will look for and ex However, you can have Posting call any function you wish using the syntax `path/to/script.py:function_to_run`. +Note that relative paths are relative to the collection directory. +This ensures that if you place scripts inside your collection directory, +they're included when you share a collection with others. + Note that you do not need to specify all of the arguments when writing these functions. Posting will only pass the number of arguments that you've specified when it calls your function. For example, you could define a your `on_request` function as `def on_request(request: httpx.Request) -> None` and Posting would call it with `on_request(request: httpx.Request)` without passing the `posting` argument. ### Example: Setup Script From 1137dfa6ee041278ec44c7fd0472e956d8c53ddd Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Tue, 8 Oct 2024 18:29:42 +0100 Subject: [PATCH 30/70] Better docs --- docs/guide/scripting.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/guide/scripting.md b/docs/guide/scripting.md index 9e0d006d..4f38e118 100644 --- a/docs/guide/scripting.md +++ b/docs/guide/scripting.md @@ -35,6 +35,17 @@ they're included when you share a collection with others. Note that you do not need to specify all of the arguments when writing these functions. Posting will only pass the number of arguments that you've specified when it calls your function. For example, you could define a your `on_request` function as `def on_request(request: httpx.Request) -> None` and Posting would call it with `on_request(request: httpx.Request)` without passing the `posting` argument. +## Editing Scripts + +When you edit a script, it'll automatically be reloaded. +This means you can keep Posting open while editing it. + +Posting also allows you to quickly jump to your editor (assuming you've set the `$EDITOR` or `$POSTING_EDITOR` environment variables) to edit a script. +Press ++ctrl+e++ while a script input field inside the `Scripts` tab is focused to open the path in your editor. + +!!! warning + As of version 2.0.0, the script file must exist *before* pressing ++ctrl+e++. Posting will not create the file for you. + ### Example: Setup Script The **setup script** is run before the request is built. @@ -105,7 +116,11 @@ The `Posting` object provides access to the application context and useful metho Note that variables are described as "session variables" because they persist for the duration of the session (until you close Posting). -### Libraries +### Execution Environment + +Scripts run in the same process and environment as Posting, so you should take care to avoid performing damaging global operations such as monkey-patching standard library modules. + +#### Libraries You can make use of any library that is available in the Python environment that Posting is running in. This means you can use all of the Python standard library as well as any of Posting's dependencies (such as `httpx`, `pyyaml`, `pydantic`, etc). From f4fbecbbf18ca627e4792414687129201fb0eddb Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Tue, 8 Oct 2024 18:54:58 +0100 Subject: [PATCH 31/70] Update snapshots --- .coverage | Bin 53248 -> 53248 bytes .../TestJumpMode.test_click_switch.svg | 178 +++++++++--------- 2 files changed, 90 insertions(+), 88 deletions(-) diff --git a/.coverage b/.coverage index 86db2fe22a79dacae9be6bbbeab62a3a2a8fe12a..da16981ae14ba1c2b42efe71188f88bef6a8a79d 100644 GIT binary patch delta 1483 zcmXBTdu&rx90%}o@2_in@9n+4bnVt|>to&8!p6Fey%=om6i_kp5Q*^*VABXDh9E?R zNW$91$S=S)9v1;cbj}wlFrJDIwt=F+7RDbW{vms)L9&S3GNW`;ZaqERr1^Z$_jk@| z)24}bNVLPAT+X#OZvp2z)z}e_M@Wq@O2nC#Da)AUmSvGJYMF1zvdGe3(tvbXIxiiR z+N4*dMrpYevGz+r>v~ZaN3Gf7px7^76wiuBlp%4O_?oy*Tq(wsTgoNnq_RhOLupi= zR$_`*PRf7EJ@PTRMcyn{$}h`}@=AHJ>?04KGfwrU+0ZO)FVME_*yX6*zS_VETa9`x zW<3lI>#l0*uH5*|S5DonxjQhvF@4V2cz!q)-M^kwM>24RK@b#9R!9bC!iDsdS}|#| zVFgXWLXY`mDwXQ!^pcHDZY!44(pS*LO%6^?9vHsok#G)eoPPZd*OW12#4@^4@=v=l zLPM=jUrXO?Vo7TJftGAlUbJJF)C%%s?IP_dj_1k+ETV-yXHE1{g$-xY9CYga=VF5cePegu9KN3sz>qfHmK#6Q zT|cs96U4^GOcLVK5+u^yKvt37 z9zqhGk{L7U#0J45ybWzM2Knn1U z%=kq5=-d-2vw)A&Xs^EEOZZIq7|m+cq*cI0>9#Wb8%bv30&TgJ!2Q9IUX%Uc~h&edLO^+d3mZu5kO zTwL#eFI-DXDpt|LAN;2e^lQT;bz#b7!b)1Hfg4;EmTE#<6|BHn+FNZaU^ND{?A;;t zSnpbHVq!EqIbkapxij#Swsdz8%CJyt-d%QjPfUsbV4^qhWpIf(8!j+I@HNv9r!#*SZ-}12cS+=f$ zYs|TDm01lxGArQH_g_&@k z8HBHx0XWAjgtN>7IK#|`Q%oP6WO|{K>46i>JUGV8g)f;o@CDNapEI-JGiDZinsy=Y lfKOOqhmV;y=wQx(51A^oGp+CeQ-&i<3%tja;BZHK(YS1xnVPu78&~gm0r3XnrKhNS z&jc#Cvl+8whLCLW%jTw8vQ1I8#1CEqiA&rE2gNMPk{QfMHWBr7?|JIJ>`i)p&-;Jg zK0Rqq8t;dAKlEjB?sM5IIQO@W1G1b+DyT181T&W?FCL ztPXRFA%ku(TCEaiJ3%a*HBe|*fOP_eV;({Ze!G0_8kp&E{cLEMGton=lDwQqcd;Vd z*%o>D^zSvr78Bi}H|(5`ZdX6+_Iv0y{Vn3kIXvCUs=30Q58lc#=Flzb{qA6hZf02t zUtjy?21%R*2)V_9i8ktUtbC9*sGgpnTt(|xaMYwVgopkzES>1M*dB|J;pU6YSDUjQ zJ{Tmg0_2bC8V5NyQ8_X4tW_WAZu~x(ihi<}bBxcUHTowRTl~&ADY?-=YRS+|LgJTg z7P^UboDlxp;G`Q_88+N0FXIS#zLK!3h0T#Us~S$^ZcLZXrC+Dsq^>2yfp{PtJ1VB^ z>B_Y@@;jM+la^1J(^Y=i$zmYmT5{8#!S#RMGNjY0MU!F0q2?y?SKIa5&}Ul}iIwTu zW<_MRKHI7YdWy5nicL@1?AZ#>s{haSDps{O;dfbBFIXA{LQJm*8)nSnLdC59oG21Z ztl=zvl4qQ+WT-C_VcE!ns-jpKyDPRPW?qaPl$*>w3GPz-+2o|47+61Zp;md5ybQry zg=5=Df%baMJqwxkZ*EU&?awA7QI|qkqhP_0J#evQx&HOB+U+DsU4P+m(qk+N&-Yor zNu^Q)m;IzQ=C#wKEDYqvxT(<>Q|FUUeKy*`5_eF0%*8UsO!NrbNjX=%v|WvNd7*-~ zsgKT9fQueh`@3Al0zJqMWM)TTyqcQVd7kN#A?mbR*y zy=&c0x{qaHw|4Kl>d}$AlM|B2`Rc-GMSvJA``N>%KWAhadl{BFXcOxPXKA+_ z@284t>!Z(QH{HpiMGmcOT%H`griG?&L^)z4^+Rx_uUe85X4W>8!bfN!oI>*;h6bSn z^}-?44g1j9up5@-g45_iIEfZOCn_(1I2QRJqhUCK zhTu3lAC959a1_mfBWM8HQ9rbyJ~)hK!$C9)4xpK^AN4>hIuBaVxzMcpwqXwJ#lQu7 eP$%p{XF(I{fSsrvcAz3`Lj~B1+F;8-f62c%G<2W< diff --git a/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg b/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg index 97560c6e..91781e50 100644 --- a/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg +++ b/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg @@ -19,164 +19,166 @@ font-weight: 700; } - .terminal-1340828524-matrix { + .terminal-1529731282-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1340828524-title { + .terminal-1529731282-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1340828524-r1 { fill: #dfdfe1 } -.terminal-1340828524-r2 { fill: #c5c8c6 } -.terminal-1340828524-r3 { fill: #ff93dd } -.terminal-1340828524-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1340828524-r5 { fill: #15111e } -.terminal-1340828524-r6 { fill: #43365c } -.terminal-1340828524-r7 { fill: #737387 } -.terminal-1340828524-r8 { fill: #e1e1e6 } -.terminal-1340828524-r9 { fill: #efe3fb } -.terminal-1340828524-r10 { fill: #9f9fa5 } -.terminal-1340828524-r11 { fill: #632e53 } -.terminal-1340828524-r12 { fill: #ff69b4 } -.terminal-1340828524-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-1340828524-r14 { fill: #e3e3e8;font-weight: bold } -.terminal-1340828524-r15 { fill: #6a6a74 } -.terminal-1340828524-r16 { fill: #0ea5e9 } -.terminal-1340828524-r17 { fill: #873c69 } -.terminal-1340828524-r18 { fill: #22c55e } -.terminal-1340828524-r19 { fill: #8b8b93 } -.terminal-1340828524-r20 { fill: #8b8b93;font-weight: bold } -.terminal-1340828524-r21 { fill: #0d0e2e } -.terminal-1340828524-r22 { fill: #00b85f } -.terminal-1340828524-r23 { fill: #ef4444 } -.terminal-1340828524-r24 { fill: #2e2e3c;font-weight: bold } -.terminal-1340828524-r25 { fill: #2e2e3c } -.terminal-1340828524-r26 { fill: #a0a0a6 } -.terminal-1340828524-r27 { fill: #191928 } -.terminal-1340828524-r28 { fill: #b74e87 } -.terminal-1340828524-r29 { fill: #87878f } -.terminal-1340828524-r30 { fill: #a3a3a9 } -.terminal-1340828524-r31 { fill: #777780 } -.terminal-1340828524-r32 { fill: #1f1f2d } -.terminal-1340828524-r33 { fill: #04b375;font-weight: bold } -.terminal-1340828524-r34 { fill: #ff7ec8;font-weight: bold } -.terminal-1340828524-r35 { fill: #dbdbdd } + .terminal-1529731282-r1 { fill: #dfdfe1 } +.terminal-1529731282-r2 { fill: #c5c8c6 } +.terminal-1529731282-r3 { fill: #ff93dd } +.terminal-1529731282-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1529731282-r5 { fill: #15111e } +.terminal-1529731282-r6 { fill: #43365c } +.terminal-1529731282-r7 { fill: #737387 } +.terminal-1529731282-r8 { fill: #e1e1e6 } +.terminal-1529731282-r9 { fill: #efe3fb } +.terminal-1529731282-r10 { fill: #9f9fa5 } +.terminal-1529731282-r11 { fill: #632e53 } +.terminal-1529731282-r12 { fill: #ff69b4 } +.terminal-1529731282-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-1529731282-r14 { fill: #e3e3e8;font-weight: bold } +.terminal-1529731282-r15 { fill: #6a6a74 } +.terminal-1529731282-r16 { fill: #0ea5e9 } +.terminal-1529731282-r17 { fill: #873c69 } +.terminal-1529731282-r18 { fill: #22c55e } +.terminal-1529731282-r19 { fill: #30303b } +.terminal-1529731282-r20 { fill: #00fa9a;font-weight: bold } +.terminal-1529731282-r21 { fill: #8b8b93 } +.terminal-1529731282-r22 { fill: #8b8b93;font-weight: bold } +.terminal-1529731282-r23 { fill: #0d0e2e } +.terminal-1529731282-r24 { fill: #00b85f } +.terminal-1529731282-r25 { fill: #ef4444 } +.terminal-1529731282-r26 { fill: #2e2e3c;font-weight: bold } +.terminal-1529731282-r27 { fill: #2e2e3c } +.terminal-1529731282-r28 { fill: #a0a0a6 } +.terminal-1529731282-r29 { fill: #191928 } +.terminal-1529731282-r30 { fill: #b74e87 } +.terminal-1529731282-r31 { fill: #87878f } +.terminal-1529731282-r32 { fill: #a3a3a9 } +.terminal-1529731282-r33 { fill: #777780 } +.terminal-1529731282-r34 { fill: #1f1f2d } +.terminal-1529731282-r35 { fill: #04b375;font-weight: bold } +.terminal-1529731282-r36 { fill: #ff7ec8;font-weight: bold } +.terminal-1529731282-r37 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echoadersBodyQueryAuthInfoScriptsOptions -GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━╺━━━━━━━━━ -POS echo postPre-request script optional -▼ jsonplaceholder/Collection-relative path to pre-request  -▼ posts/ -GET get allPost-response script optional -GET get one╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesScriptsTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echoadersBodyQueryAuthInfoScriptsOptions +GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━ +POS echo postX Follow redirects +▼ jsonplaceholder/ +▼ posts/X Verify SSL certificates +GET get all +GET get one╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help From 2ce1f279f9dab5a5337187c6bdaf816e8bf20921 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Fri, 11 Oct 2024 19:04:58 +0100 Subject: [PATCH 32/70] Bump version to 2.0.0b0, use updated autocomplete --- docs/guide/scripting.md | 18 +- pyproject.toml | 6 +- uv.lock | 851 ++++++++++++++++++++++++---------------- 3 files changed, 527 insertions(+), 348 deletions(-) diff --git a/docs/guide/scripting.md b/docs/guide/scripting.md index 4f38e118..6d8512c6 100644 --- a/docs/guide/scripting.md +++ b/docs/guide/scripting.md @@ -1,6 +1,6 @@ ## Overview -You can attach simple Python scripts to requests, and have Posting run them at various stages of the request lifecycle. This powerful feature allows you to: +You can attach simple Python scripts to requests inside the `Scripts` tab, and have Posting run them at various stages of the request lifecycle. This powerful feature allows you to: - Perform setup before a request (e.g. setting variables, preparing data) - Set or modify headers, query parameters, and other request properties @@ -9,7 +9,7 @@ You can attach simple Python scripts to requests, and have Posting run them at v - Inspect request and response objects, and manipulate them - Pretty much anything else you can think of doing with Python! -## Script Types +## Script types Posting supports three types of scripts, which run at different points in the request/response lifecycle: @@ -17,7 +17,7 @@ Posting supports three types of scripts, which run at different points in the re 2. **Pre-request Scripts**: Runs after the request has been constructed and variables have been substituted, but before the request is sent. You can directly modify the request object here. 3. **Post-response Scripts**: Runs after the response is received. This is useful for extracting data from the response, or for performing cleanup. -## Writing Scripts +## Writing scripts In the context of Posting, a "script" is a regular Python function. @@ -35,7 +35,7 @@ they're included when you share a collection with others. Note that you do not need to specify all of the arguments when writing these functions. Posting will only pass the number of arguments that you've specified when it calls your function. For example, you could define a your `on_request` function as `def on_request(request: httpx.Request) -> None` and Posting would call it with `on_request(request: httpx.Request)` without passing the `posting` argument. -## Editing Scripts +## Editing scripts When you edit a script, it'll automatically be reloaded. This means you can keep Posting open while editing it. @@ -46,7 +46,7 @@ Press ++ctrl+e++ while a script input field inside the `Scripts` tab is focused !!! warning As of version 2.0.0, the script file must exist *before* pressing ++ctrl+e++. Posting will not create the file for you. -### Example: Setup Script +### Example: Setup script The **setup script** is run before the request is built. You can set variables in the setup script that can be used in the request. @@ -69,7 +69,7 @@ def setup(posting: Posting) -> None: posting.set_variable("auth_token", "1234567890") ``` -### Example: Pre-request Script +### Example: Pre-request script The **pre-request script** is run after the request has been constructed and variables have been substituted, right before the request is sent. @@ -87,7 +87,7 @@ def on_request(request: httpx.Request, posting: Posting) -> None: posting.notify("Request is being sent!") ``` -### Example: Post-response Script +### Example: Post-response script The **post-response script** is run after the response is received. You can use this to extract data from the response, for example a JWT token, @@ -104,7 +104,7 @@ def on_response(response: httpx.Response, posting: Posting) -> None: posting.set_variable("auth_token", response.headers["Authorization"]) ``` -### The `Posting` Object +### The `Posting` object The `Posting` object provides access to the application context and useful methods: @@ -116,7 +116,7 @@ The `Posting` object provides access to the application context and useful metho Note that variables are described as "session variables" because they persist for the duration of the session (until you close Posting). -### Execution Environment +### Execution environment Scripts run in the same process and environment as Posting, so you should take care to avoid performing damaging global operations such as monkey-patching standard library modules. diff --git a/pyproject.toml b/pyproject.toml index 622cb913..1f6c9a0a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "posting" -version = "1.13.0" +version = "2.0.0b1" description = "The modern API client that lives in your terminal." authors = [ { name = "Darren Burns", email = "darrenb900@gmail.com" } @@ -16,7 +16,7 @@ dependencies = [ "pydantic-settings==2.4.0", "python-dotenv==1.0.1", "textual[syntax]==0.79.1", - "textual-autocomplete==3.0.0a9", + "textual-autocomplete==3.0.0a10", "watchfiles>=0.24.0", ] readme = "README.md" @@ -24,7 +24,7 @@ requires-python = ">= 3.11" license = { file = "LICENSE" } keywords = ["tui", "http", "client", "terminal", "api", "testing", "textual", "cli", "posting", "developer-tool"] classifiers = [ - "Development Status :: 4 - Beta", + "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", diff --git a/uv.lock b/uv.lock index 2802a3f8..9cb2e02b 100644 --- a/uv.lock +++ b/uv.lock @@ -7,16 +7,16 @@ resolution-markers = [ [[package]] name = "aiohappyeyeballs" -version = "2.4.0" +version = "2.4.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2d/f7/22bba300a16fd1cad99da1a23793fe43963ee326d012fdf852d0b4035955/aiohappyeyeballs-2.4.0.tar.gz", hash = "sha256:55a1714f084e63d49639800f95716da97a1f173d46a16dfcfda0016abb93b6b2", size = 16786 } +sdist = { url = "https://files.pythonhosted.org/packages/bc/69/2f6d5a019bd02e920a3417689a89887b39ad1e350b562f9955693d900c40/aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586", size = 21809 } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/b6/58ea188899950d759a837f9a58b2aee1d1a380ea4d6211ce9b1823748851/aiohappyeyeballs-2.4.0-py3-none-any.whl", hash = "sha256:7ce92076e249169a13c2f49320d1967425eaf1f407522d707d59cac7628d62bd", size = 12155 }, + { url = "https://files.pythonhosted.org/packages/f7/d8/120cd0fe3e8530df0539e71ba9683eade12cae103dd7543e50d15f737917/aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572", size = 14742 }, ] [[package]] name = "aiohttp" -version = "3.10.5" +version = "3.10.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -26,53 +26,66 @@ dependencies = [ { name = "multidict" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ca/28/ca549838018140b92a19001a8628578b0f2a3b38c16826212cc6f706e6d4/aiohttp-3.10.5.tar.gz", hash = "sha256:f071854b47d39591ce9a17981c46790acb30518e2f83dfca8db2dfa091178691", size = 7524360 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/90/54ccb1e4eadfb6c95deff695582453f6208584431d69bf572782e9ae542b/aiohttp-3.10.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6a4e5e40156d72a40241a25cc226051c0a8d816610097a8e8f517aeacd59a2", size = 586455 }, - { url = "https://files.pythonhosted.org/packages/c3/7a/95e88c02756e7e718f054e1bb3ec6ad5d0ee4a2ca2bb1768c5844b3de30a/aiohttp-3.10.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c634a3207a5445be65536d38c13791904fda0748b9eabf908d3fe86a52941cf", size = 397255 }, - { url = "https://files.pythonhosted.org/packages/07/4f/767387b39990e1ee9aba8ce642abcc286d84d06e068dc167dab983898f18/aiohttp-3.10.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4aff049b5e629ef9b3e9e617fa6e2dfeda1bf87e01bcfecaf3949af9e210105e", size = 388973 }, - { url = "https://files.pythonhosted.org/packages/61/46/0df41170a4d228c07b661b1ba9d87101d99a79339dc93b8b1183d8b20545/aiohttp-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1942244f00baaacaa8155eca94dbd9e8cc7017deb69b75ef67c78e89fdad3c77", size = 1326126 }, - { url = "https://files.pythonhosted.org/packages/af/20/da0d65e07ce49d79173fed41598f487a0a722e87cfbaa8bb7e078a7c1d39/aiohttp-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e04a1f2a65ad2f93aa20f9ff9f1b672bf912413e5547f60749fa2ef8a644e061", size = 1364538 }, - { url = "https://files.pythonhosted.org/packages/aa/20/b59728405114e57541ba9d5b96033e69d004e811ded299537f74237629ca/aiohttp-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f2bfc0032a00405d4af2ba27f3c429e851d04fad1e5ceee4080a1c570476697", size = 1399896 }, - { url = "https://files.pythonhosted.org/packages/2a/92/006690c31b830acbae09d2618e41308fe4c81c0679b3b33a3af859e0b7bf/aiohttp-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424ae21498790e12eb759040bbb504e5e280cab64693d14775c54269fd1d2bb7", size = 1312914 }, - { url = "https://files.pythonhosted.org/packages/d4/71/1a253ca215b6c867adbd503f1e142117527ea8775e65962bc09b2fad1d2c/aiohttp-3.10.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:975218eee0e6d24eb336d0328c768ebc5d617609affaca5dbbd6dd1984f16ed0", size = 1271301 }, - { url = "https://files.pythonhosted.org/packages/0a/ab/5d1d9ff9ce6cce8fa54774d0364e64a0f3cd50e512ff09082ced8e5217a1/aiohttp-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4120d7fefa1e2d8fb6f650b11489710091788de554e2b6f8347c7a20ceb003f5", size = 1291652 }, - { url = "https://files.pythonhosted.org/packages/75/5f/f90510ea954b9ae6e7a53d2995b97a3e5c181110fdcf469bc9238445871d/aiohttp-3.10.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b90078989ef3fc45cf9221d3859acd1108af7560c52397ff4ace8ad7052a132e", size = 1286289 }, - { url = "https://files.pythonhosted.org/packages/be/9e/1f523414237798660921817c82b9225a363af436458caf584d2fa6a2eb4a/aiohttp-3.10.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ba5a8b74c2a8af7d862399cdedce1533642fa727def0b8c3e3e02fcb52dca1b1", size = 1341848 }, - { url = "https://files.pythonhosted.org/packages/f6/36/443472ddaa85d7d80321fda541d9535b23ecefe0bf5792cc3955ea635190/aiohttp-3.10.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:02594361128f780eecc2a29939d9dfc870e17b45178a867bf61a11b2a4367277", size = 1361619 }, - { url = "https://files.pythonhosted.org/packages/19/f6/3ecbac0bc4359c7d7ba9e85c6b10f57e20edaf1f97751ad2f892db231ad0/aiohttp-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8fb4fc029e135859f533025bc82047334e24b0d489e75513144f25408ecaf058", size = 1320869 }, - { url = "https://files.pythonhosted.org/packages/34/7e/ed74ffb36e3a0cdec1b05d8fbaa29cb532371d5a20058b3a8052fc90fe7c/aiohttp-3.10.5-cp311-cp311-win32.whl", hash = "sha256:e1ca1ef5ba129718a8fc827b0867f6aa4e893c56eb00003b7367f8a733a9b072", size = 359271 }, - { url = "https://files.pythonhosted.org/packages/98/1b/718901f04bc8c886a742be9e83babb7b93facabf7c475cc95e2b3ab80b4d/aiohttp-3.10.5-cp311-cp311-win_amd64.whl", hash = "sha256:349ef8a73a7c5665cca65c88ab24abe75447e28aa3bc4c93ea5093474dfdf0ff", size = 379143 }, - { url = "https://files.pythonhosted.org/packages/d9/1c/74f9dad4a2fc4107e73456896283d915937f48177b99867b63381fadac6e/aiohttp-3.10.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:305be5ff2081fa1d283a76113b8df7a14c10d75602a38d9f012935df20731487", size = 583468 }, - { url = "https://files.pythonhosted.org/packages/12/29/68d090551f2b58ce76c2b436ced8dd2dfd32115d41299bf0b0c308a5483c/aiohttp-3.10.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3a1c32a19ee6bbde02f1cb189e13a71b321256cc1d431196a9f824050b160d5a", size = 394066 }, - { url = "https://files.pythonhosted.org/packages/8f/f7/971f88b4cdcaaa4622925ba7d86de47b48ec02a9040a143514b382f78da4/aiohttp-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:61645818edd40cc6f455b851277a21bf420ce347baa0b86eaa41d51ef58ba23d", size = 389098 }, - { url = "https://files.pythonhosted.org/packages/f1/5a/fe3742efdce551667b2ddf1158b27c5b8eb1edc13d5e14e996e52e301025/aiohttp-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c225286f2b13bab5987425558baa5cbdb2bc925b2998038fa028245ef421e75", size = 1332742 }, - { url = "https://files.pythonhosted.org/packages/1a/52/a25c0334a1845eb4967dff279151b67ca32a948145a5812ed660ed900868/aiohttp-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ba01ebc6175e1e6b7275c907a3a36be48a2d487549b656aa90c8a910d9f3178", size = 1372134 }, - { url = "https://files.pythonhosted.org/packages/96/3d/33c1d8efc2d8ec36bff9a8eca2df9fdf8a45269c6e24a88e74f2aa4f16bd/aiohttp-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8eaf44ccbc4e35762683078b72bf293f476561d8b68ec8a64f98cf32811c323e", size = 1414413 }, - { url = "https://files.pythonhosted.org/packages/64/74/0f1ddaa5f0caba1d946f0dd0c31f5744116e4a029beec454ec3726d3311f/aiohttp-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1c43eb1ab7cbf411b8e387dc169acb31f0ca0d8c09ba63f9eac67829585b44f", size = 1328107 }, - { url = "https://files.pythonhosted.org/packages/0a/32/c10118f0ad50e4093227234f71fd0abec6982c29367f65f32ee74ed652c4/aiohttp-3.10.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7a5299827253023c55ea549444e058c0eb496931fa05d693b95140a947cb73", size = 1280126 }, - { url = "https://files.pythonhosted.org/packages/c6/c9/77e3d648d97c03a42acfe843d03e97be3c5ef1b4d9de52e5bd2d28eed8e7/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4790f0e15f00058f7599dab2b206d3049d7ac464dc2e5eae0e93fa18aee9e7bf", size = 1292660 }, - { url = "https://files.pythonhosted.org/packages/7e/5d/99c71f8e5c8b64295be421b4c42d472766b263a1fe32e91b64bf77005bf2/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:44b324a6b8376a23e6ba25d368726ee3bc281e6ab306db80b5819999c737d820", size = 1300988 }, - { url = "https://files.pythonhosted.org/packages/8f/2c/76d2377dd947f52fbe8afb19b18a3b816d66c7966755c04030f93b1f7b2d/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0d277cfb304118079e7044aad0b76685d30ecb86f83a0711fc5fb257ffe832ca", size = 1339268 }, - { url = "https://files.pythonhosted.org/packages/fd/e6/3d9d935cc705d57ed524d82ec5d6b678a53ac1552720ae41282caa273584/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:54d9ddea424cd19d3ff6128601a4a4d23d54a421f9b4c0fff740505813739a91", size = 1366993 }, - { url = "https://files.pythonhosted.org/packages/fe/c2/f7eed4d602f3f224600d03ab2e1a7734999b0901b1c49b94dc5891340433/aiohttp-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4f1c9866ccf48a6df2b06823e6ae80573529f2af3a0992ec4fe75b1a510df8a6", size = 1329459 }, - { url = "https://files.pythonhosted.org/packages/ce/8f/27f205b76531fc592abe29e1ad265a16bf934a9f609509c02d765e6a8055/aiohttp-3.10.5-cp312-cp312-win32.whl", hash = "sha256:dc4826823121783dccc0871e3f405417ac116055bf184ac04c36f98b75aacd12", size = 356968 }, - { url = "https://files.pythonhosted.org/packages/39/8c/4f6c0b2b3629f6be6c81ab84d9d577590f74f01d4412bfc4067958eaa1e1/aiohttp-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:22c0a23a3b3138a6bf76fc553789cb1a703836da86b0f306b6f0dc1617398abc", size = 377650 }, - { url = "https://files.pythonhosted.org/packages/7b/b9/03b4327897a5b5d29338fa9b514f1c2f66a3e4fc88a4e40fad478739314d/aiohttp-3.10.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7f6b639c36734eaa80a6c152a238242bedcee9b953f23bb887e9102976343092", size = 576994 }, - { url = "https://files.pythonhosted.org/packages/67/1b/20c2e159cd07b8ed6dde71c2258233902fdf415b2fe6174bd2364ba63107/aiohttp-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f29930bc2921cef955ba39a3ff87d2c4398a0394ae217f41cb02d5c26c8b1b77", size = 390684 }, - { url = "https://files.pythonhosted.org/packages/4d/6b/ff83b34f157e370431d8081c5d1741963f4fb12f9aaddb2cacbf50305225/aiohttp-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f489a2c9e6455d87eabf907ac0b7d230a9786be43fbe884ad184ddf9e9c1e385", size = 386176 }, - { url = "https://files.pythonhosted.org/packages/4d/a1/6e92817eb657de287560962df4959b7ddd22859c4b23a0309e2d3de12538/aiohttp-3.10.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:123dd5b16b75b2962d0fff566effb7a065e33cd4538c1692fb31c3bda2bfb972", size = 1303310 }, - { url = "https://files.pythonhosted.org/packages/04/29/200518dc7a39c30ae6d5bc232d7207446536e93d3d9299b8e95db6e79c54/aiohttp-3.10.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b98e698dc34966e5976e10bbca6d26d6724e6bdea853c7c10162a3235aba6e16", size = 1340445 }, - { url = "https://files.pythonhosted.org/packages/8e/20/53f7bba841ba7b5bb5dea580fea01c65524879ba39cb917d08c845524717/aiohttp-3.10.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3b9162bab7e42f21243effc822652dc5bb5e8ff42a4eb62fe7782bcbcdfacf6", size = 1385121 }, - { url = "https://files.pythonhosted.org/packages/f1/b4/d99354ad614c48dd38fb1ee880a1a54bd9ab2c3bcad3013048d4a1797d3a/aiohttp-3.10.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1923a5c44061bffd5eebeef58cecf68096e35003907d8201a4d0d6f6e387ccaa", size = 1299669 }, - { url = "https://files.pythonhosted.org/packages/51/39/ca1de675f2a5729c71c327e52ac6344e63f036bd37281686ae5c3fb13bfb/aiohttp-3.10.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d55f011da0a843c3d3df2c2cf4e537b8070a419f891c930245f05d329c4b0689", size = 1252638 }, - { url = "https://files.pythonhosted.org/packages/54/cf/a3ae7ff43138422d477348e309ef8275779701bf305ff6054831ef98b782/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:afe16a84498441d05e9189a15900640a2d2b5e76cf4efe8cbb088ab4f112ee57", size = 1266889 }, - { url = "https://files.pythonhosted.org/packages/6e/7a/c6027ad70d9fb23cf254a26144de2723821dade1a624446aa22cd0b6d012/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8112fb501b1e0567a1251a2fd0747baae60a4ab325a871e975b7bb67e59221f", size = 1266249 }, - { url = "https://files.pythonhosted.org/packages/64/fd/ed136d46bc2c7e3342fed24662b4827771d55ceb5a7687847aae977bfc17/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1e72589da4c90337837fdfe2026ae1952c0f4a6e793adbbfbdd40efed7c63599", size = 1311036 }, - { url = "https://files.pythonhosted.org/packages/76/9a/43eeb0166f1119256d6f43468f900db1aed7fbe32069d2a71c82f987db4d/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:4d46c7b4173415d8e583045fbc4daa48b40e31b19ce595b8d92cf639396c15d5", size = 1338756 }, - { url = "https://files.pythonhosted.org/packages/d5/bc/d01ff0810b3f5e26896f76d44225ed78b088ddd33079b85cd1a23514318b/aiohttp-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33e6bc4bab477c772a541f76cd91e11ccb6d2efa2b8d7d7883591dfb523e5987", size = 1299976 }, - { url = "https://files.pythonhosted.org/packages/3e/c9/50a297c4f7ab57a949f4add2d3eafe5f3e68bb42f739e933f8b32a092bda/aiohttp-3.10.5-cp313-cp313-win32.whl", hash = "sha256:c58c6837a2c2a7cf3133983e64173aec11f9c2cd8e87ec2fdc16ce727bcf1a04", size = 355609 }, - { url = "https://files.pythonhosted.org/packages/65/28/aee9d04fb0b3b1f90622c338a08e54af5198e704a910e20947c473298fd0/aiohttp-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:38172a70005252b6893088c0f5e8a47d173df7cc2b2bd88650957eb84fcf5022", size = 375697 }, +sdist = { url = "https://files.pythonhosted.org/packages/17/7e/16e57e6cf20eb62481a2f9ce8674328407187950ccc602ad07c685279141/aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a", size = 7542993 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/31/3c351d17596194e5a38ef169a4da76458952b2497b4b54645b9d483cbbb0/aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f", size = 586501 }, + { url = "https://files.pythonhosted.org/packages/a4/a8/a559d09eb08478cdead6b7ce05b0c4a133ba27fcdfa91e05d2e62867300d/aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb", size = 398993 }, + { url = "https://files.pythonhosted.org/packages/c5/47/7736d4174613feef61d25332c3bd1a4f8ff5591fbd7331988238a7299485/aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871", size = 390647 }, + { url = "https://files.pythonhosted.org/packages/27/21/e9ba192a04b7160f5a8952c98a1de7cf8072ad150fa3abd454ead1ab1d7f/aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c", size = 1306481 }, + { url = "https://files.pythonhosted.org/packages/cf/50/f364c01c8d0def1dc34747b2470969e216f5a37c7ece00fe558810f37013/aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38", size = 1344652 }, + { url = "https://files.pythonhosted.org/packages/1d/c2/74f608e984e9b585649e2e83883facad6fa3fc1d021de87b20cc67e8e5ae/aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb", size = 1378498 }, + { url = "https://files.pythonhosted.org/packages/9f/a7/05a48c7c0a7a80a5591b1203bf1b64ca2ed6a2050af918d09c05852dc42b/aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7", size = 1292718 }, + { url = "https://files.pythonhosted.org/packages/7d/78/a925655018747e9790350180330032e27d6e0d7ed30bde545fae42f8c49c/aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911", size = 1251776 }, + { url = "https://files.pythonhosted.org/packages/47/9d/85c6b69f702351d1236594745a4fdc042fc43f494c247a98dac17e004026/aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092", size = 1271716 }, + { url = "https://files.pythonhosted.org/packages/7f/a7/55fc805ff9b14af818903882ece08e2235b12b73b867b521b92994c52b14/aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142", size = 1266263 }, + { url = "https://files.pythonhosted.org/packages/1f/ec/d2be2ca7b063e4f91519d550dbc9c1cb43040174a322470deed90b3d3333/aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9", size = 1321617 }, + { url = "https://files.pythonhosted.org/packages/c9/a3/b29f7920e1cd0a9a68a45dd3eb16140074d2efb1518d2e1f3e140357dc37/aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1", size = 1339227 }, + { url = "https://files.pythonhosted.org/packages/8a/81/34b67235c47e232d807b4bbc42ba9b927c7ce9476872372fddcfd1e41b3d/aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a", size = 1299068 }, + { url = "https://files.pythonhosted.org/packages/04/1f/26a7fe11b6ad3184f214733428353c89ae9fe3e4f605a657f5245c5e720c/aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94", size = 362223 }, + { url = "https://files.pythonhosted.org/packages/10/91/85dcd93f64011434359ce2666bece981f08d31bc49df33261e625b28595d/aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959", size = 381576 }, + { url = "https://files.pythonhosted.org/packages/ae/99/4c5aefe5ad06a1baf206aed6598c7cdcbc7c044c46801cd0d1ecb758cae3/aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c", size = 583536 }, + { url = "https://files.pythonhosted.org/packages/a9/36/8b3bc49b49cb6d2da40ee61ff15dbcc44fd345a3e6ab5bb20844df929821/aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28", size = 395693 }, + { url = "https://files.pythonhosted.org/packages/e1/77/0aa8660dcf11fa65d61712dbb458c4989de220a844bd69778dff25f2d50b/aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f", size = 390898 }, + { url = "https://files.pythonhosted.org/packages/38/d2/b833d95deb48c75db85bf6646de0a697e7fb5d87bd27cbade4f9746b48b1/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138", size = 1312060 }, + { url = "https://files.pythonhosted.org/packages/aa/5f/29fd5113165a0893de8efedf9b4737e0ba92dfcd791415a528f947d10299/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742", size = 1350553 }, + { url = "https://files.pythonhosted.org/packages/ad/cc/f835f74b7d344428469200105236d44606cfa448be1e7c95ca52880d9bac/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7", size = 1392646 }, + { url = "https://files.pythonhosted.org/packages/bf/fe/1332409d845ca601893bbf2d76935e0b93d41686e5f333841c7d7a4a770d/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16", size = 1306310 }, + { url = "https://files.pythonhosted.org/packages/e4/a1/25a7633a5a513278a9892e333501e2e69c83e50be4b57a62285fb7a008c3/aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8", size = 1260255 }, + { url = "https://files.pythonhosted.org/packages/f2/39/30eafe89e0e2a06c25e4762844c8214c0c0cd0fd9ffc3471694a7986f421/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6", size = 1271141 }, + { url = "https://files.pythonhosted.org/packages/5b/fc/33125df728b48391ef1fcb512dfb02072158cc10d041414fb79803463020/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a", size = 1280244 }, + { url = "https://files.pythonhosted.org/packages/3b/61/e42bf2c2934b5caa4e2ec0b5e5fd86989adb022b5ee60c2572a9d77cf6fe/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9", size = 1316805 }, + { url = "https://files.pythonhosted.org/packages/18/32/f52a5e2ae9ad3bba10e026a63a7a23abfa37c7d97aeeb9004eaa98df3ce3/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a", size = 1343930 }, + { url = "https://files.pythonhosted.org/packages/05/be/6a403b464dcab3631fe8e27b0f1d906d9e45c5e92aca97ee007e5a895560/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205", size = 1306186 }, + { url = "https://files.pythonhosted.org/packages/8e/fd/bb50fe781068a736a02bf5c7ad5f3ab53e39f1d1e63110da6d30f7605edc/aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628", size = 359289 }, + { url = "https://files.pythonhosted.org/packages/70/9e/5add7e240f77ef67c275c82cc1d08afbca57b77593118c1f6e920ae8ad3f/aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf", size = 379313 }, + { url = "https://files.pythonhosted.org/packages/b1/eb/618b1b76c7fe8082a71c9d62e3fe84c5b9af6703078caa9ec57850a12080/aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28", size = 576114 }, + { url = "https://files.pythonhosted.org/packages/aa/37/3126995d7869f8b30d05381b81a2d4fb4ec6ad313db788e009bc6d39c211/aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d", size = 391901 }, + { url = "https://files.pythonhosted.org/packages/3e/f2/8fdfc845be1f811c31ceb797968523813f8e1263ee3e9120d61253f6848f/aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79", size = 387418 }, + { url = "https://files.pythonhosted.org/packages/60/d5/33d2061d36bf07e80286e04b7e0a4de37ce04b5ebfed72dba67659a05250/aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e", size = 1287073 }, + { url = "https://files.pythonhosted.org/packages/00/52/affb55be16a4747740bd630b4c002dac6c5eac42f9bb64202fc3cf3f1930/aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6", size = 1323612 }, + { url = "https://files.pythonhosted.org/packages/94/f2/cddb69b975387daa2182a8442566971d6410b8a0179bb4540d81c97b1611/aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42", size = 1368406 }, + { url = "https://files.pythonhosted.org/packages/c1/e4/afba7327da4d932da8c6e29aecaf855f9d52dace53ac15bfc8030a246f1b/aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e", size = 1282761 }, + { url = "https://files.pythonhosted.org/packages/9f/6b/364856faa0c9031ea76e24ef0f7fef79cddd9fa8e7dba9a1771c6acc56b5/aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc", size = 1236518 }, + { url = "https://files.pythonhosted.org/packages/46/af/c382846f8356fe64a7b5908bb9b477457aa23b71be7ed551013b7b7d4d87/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a", size = 1250344 }, + { url = "https://files.pythonhosted.org/packages/87/53/294f87fc086fd0772d0ab82497beb9df67f0f27a8b3dd5742a2656db2bc6/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414", size = 1248956 }, + { url = "https://files.pythonhosted.org/packages/86/30/7d746717fe11bdfefb88bb6c09c5fc985d85c4632da8bb6018e273899254/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3", size = 1293379 }, + { url = "https://files.pythonhosted.org/packages/48/b9/45d670a834458db67a24258e9139ba61fa3bd7d69b98ecf3650c22806f8f/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67", size = 1320108 }, + { url = "https://files.pythonhosted.org/packages/72/8c/804bb2e837a175635d2000a0659eafc15b2e9d92d3d81c8f69e141ecd0b0/aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b", size = 1281546 }, + { url = "https://files.pythonhosted.org/packages/89/c0/862e6a9de3d6eeb126cd9d9ea388243b70df9b871ce1a42b193b7a4a77fc/aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8", size = 357516 }, + { url = "https://files.pythonhosted.org/packages/ae/63/3e1aee3e554263f3f1011cca50d78a4894ae16ce99bf78101ac3a2f0ef74/aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151", size = 376785 }, +] + +[[package]] +name = "aiohttp-jinja2" +version = "1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "jinja2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/39/da5a94dd89b1af7241fb7fc99ae4e73505b5f898b540b6aba6dc7afe600e/aiohttp-jinja2-1.6.tar.gz", hash = "sha256:a3a7ff5264e5bca52e8ae547bbfd0761b72495230d438d05b6c0915be619b0e2", size = 53057 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/90/65238d4246307195411b87a07d03539049819b022c01bcc773826f600138/aiohttp_jinja2-1.6-py3-none-any.whl", hash = "sha256:0df405ee6ad1b58e5a068a105407dc7dcc1704544c559f1938babde954f945c7", size = 11736 }, ] [[package]] @@ -232,41 +245,56 @@ wheels = [ [[package]] name = "charset-normalizer" -version = "3.3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", size = 104809 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/68/77/02839016f6fbbf808e8b38601df6e0e66c17bbab76dff4613f7511413597/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", size = 191647 }, - { url = "https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", size = 121434 }, - { url = "https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", size = 118979 }, - { url = "https://files.pythonhosted.org/packages/e4/a6/7ee57823d46331ddc37dd00749c95b0edec2c79b15fc0d6e6efb532e89ac/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", size = 136582 }, - { url = "https://files.pythonhosted.org/packages/74/f1/0d9fe69ac441467b737ba7f48c68241487df2f4522dd7246d9426e7c690e/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", size = 146645 }, - { url = "https://files.pythonhosted.org/packages/05/31/e1f51c76db7be1d4aef220d29fbfa5dbb4a99165d9833dcbf166753b6dc0/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", size = 139398 }, - { url = "https://files.pythonhosted.org/packages/40/26/f35951c45070edc957ba40a5b1db3cf60a9dbb1b350c2d5bef03e01e61de/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", size = 140273 }, - { url = "https://files.pythonhosted.org/packages/07/07/7e554f2bbce3295e191f7e653ff15d55309a9ca40d0362fcdab36f01063c/charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", size = 142577 }, - { url = "https://files.pythonhosted.org/packages/d8/b5/eb705c313100defa57da79277d9207dc8d8e45931035862fa64b625bfead/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", size = 137747 }, - { url = "https://files.pythonhosted.org/packages/19/28/573147271fd041d351b438a5665be8223f1dd92f273713cb882ddafe214c/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", size = 143375 }, - { url = "https://files.pythonhosted.org/packages/cf/7c/f3b682fa053cc21373c9a839e6beba7705857075686a05c72e0f8c4980ca/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", size = 148474 }, - { url = "https://files.pythonhosted.org/packages/1e/49/7ab74d4ac537ece3bc3334ee08645e231f39f7d6df6347b29a74b0537103/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", size = 140232 }, - { url = "https://files.pythonhosted.org/packages/2d/dc/9dacba68c9ac0ae781d40e1a0c0058e26302ea0660e574ddf6797a0347f7/charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", size = 140859 }, - { url = "https://files.pythonhosted.org/packages/6c/c2/4a583f800c0708dd22096298e49f887b49d9746d0e78bfc1d7e29816614c/charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", size = 92509 }, - { url = "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", size = 99870 }, - { url = "https://files.pythonhosted.org/packages/d1/b2/fcedc8255ec42afee97f9e6f0145c734bbe104aac28300214593eb326f1d/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", size = 192892 }, - { url = "https://files.pythonhosted.org/packages/2e/7d/2259318c202f3d17f3fe6438149b3b9e706d1070fe3fcbb28049730bb25c/charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", size = 122213 }, - { url = "https://files.pythonhosted.org/packages/3a/52/9f9d17c3b54dc238de384c4cb5a2ef0e27985b42a0e5cc8e8a31d918d48d/charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", size = 119404 }, - { url = "https://files.pythonhosted.org/packages/99/b0/9c365f6d79a9f0f3c379ddb40a256a67aa69c59609608fe7feb6235896e1/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", size = 137275 }, - { url = "https://files.pythonhosted.org/packages/91/33/749df346e93d7a30cdcb90cbfdd41a06026317bfbfb62cd68307c1a3c543/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", size = 147518 }, - { url = "https://files.pythonhosted.org/packages/72/1a/641d5c9f59e6af4c7b53da463d07600a695b9824e20849cb6eea8a627761/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", size = 140182 }, - { url = "https://files.pythonhosted.org/packages/ee/fb/14d30eb4956408ee3ae09ad34299131fb383c47df355ddb428a7331cfa1e/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", size = 141869 }, - { url = "https://files.pythonhosted.org/packages/df/3e/a06b18788ca2eb6695c9b22325b6fde7dde0f1d1838b1792a0076f58fe9d/charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", size = 144042 }, - { url = "https://files.pythonhosted.org/packages/45/59/3d27019d3b447a88fe7e7d004a1e04be220227760264cc41b405e863891b/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", size = 138275 }, - { url = "https://files.pythonhosted.org/packages/7b/ef/5eb105530b4da8ae37d506ccfa25057961b7b63d581def6f99165ea89c7e/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", size = 144819 }, - { url = "https://files.pythonhosted.org/packages/a2/51/e5023f937d7f307c948ed3e5c29c4b7a3e42ed2ee0b8cdf8f3a706089bf0/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", size = 149415 }, - { url = "https://files.pythonhosted.org/packages/24/9d/2e3ef673dfd5be0154b20363c5cdcc5606f35666544381bee15af3778239/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", size = 141212 }, - { url = "https://files.pythonhosted.org/packages/5b/ae/ce2c12fcac59cb3860b2e2d76dc405253a4475436b1861d95fe75bdea520/charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", size = 142167 }, - { url = "https://files.pythonhosted.org/packages/ed/3a/a448bf035dce5da359daf9ae8a16b8a39623cc395a2ffb1620aa1bce62b0/charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", size = 93041 }, - { url = "https://files.pythonhosted.org/packages/b6/7c/8debebb4f90174074b827c63242c23851bdf00a532489fba57fef3416e40/charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", size = 100397 }, - { url = "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", size = 48543 }, +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", size = 193339 }, + { url = "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", size = 124366 }, + { url = "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", size = 118874 }, + { url = "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", size = 138243 }, + { url = "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", size = 148676 }, + { url = "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", size = 141289 }, + { url = "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", size = 142585 }, + { url = "https://files.pythonhosted.org/packages/3b/a0/a68980ab8a1f45a36d9745d35049c1af57d27255eff8c907e3add84cf68f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", size = 144408 }, + { url = "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", size = 139076 }, + { url = "https://files.pythonhosted.org/packages/fb/9d/9c13753a5a6e0db4a0a6edb1cef7aee39859177b64e1a1e748a6e3ba62c2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", size = 146874 }, + { url = "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", size = 150871 }, + { url = "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", size = 148546 }, + { url = "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", size = 143048 }, + { url = "https://files.pythonhosted.org/packages/01/f8/38842422988b795220eb8038745d27a675ce066e2ada79516c118f291f07/charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", size = 94389 }, + { url = "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", size = 101752 }, + { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 }, + { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 }, + { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 }, + { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 }, + { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 }, + { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 }, + { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 }, + { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 }, + { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 }, + { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 }, + { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 }, + { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 }, + { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 }, + { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 }, + { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, + { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, + { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, + { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, + { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, + { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, + { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, + { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, + { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, + { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, + { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, + { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, + { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, + { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, ] [[package]] @@ -304,50 +332,50 @@ wheels = [ [[package]] name = "coverage" -version = "7.6.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/5f/67af7d60d7e8ce61a4e2ddcd1bd5fb787180c8d0ae0fbd073f903b3dd95d/coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", size = 206796 }, - { url = "https://files.pythonhosted.org/packages/e1/0e/e52332389e057daa2e03be1fbfef25bb4d626b37d12ed42ae6281d0a274c/coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", size = 207244 }, - { url = "https://files.pythonhosted.org/packages/aa/cd/766b45fb6e090f20f8927d9c7cb34237d41c73a939358bc881883fd3a40d/coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", size = 239279 }, - { url = "https://files.pythonhosted.org/packages/70/6c/a9ccd6fe50ddaf13442a1e2dd519ca805cbe0f1fcd377fba6d8339b98ccb/coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", size = 236859 }, - { url = "https://files.pythonhosted.org/packages/14/6f/8351b465febb4dbc1ca9929505202db909c5a635c6fdf33e089bbc3d7d85/coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", size = 238549 }, - { url = "https://files.pythonhosted.org/packages/68/3c/289b81fa18ad72138e6d78c4c11a82b5378a312c0e467e2f6b495c260907/coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", size = 237477 }, - { url = "https://files.pythonhosted.org/packages/ed/1c/aa1efa6459d822bd72c4abc0b9418cf268de3f60eeccd65dc4988553bd8d/coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", size = 236134 }, - { url = "https://files.pythonhosted.org/packages/fb/c8/521c698f2d2796565fe9c789c2ee1ccdae610b3aa20b9b2ef980cc253640/coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", size = 236910 }, - { url = "https://files.pythonhosted.org/packages/7d/30/033e663399ff17dca90d793ee8a2ea2890e7fdf085da58d82468b4220bf7/coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", size = 209348 }, - { url = "https://files.pythonhosted.org/packages/20/05/0d1ccbb52727ccdadaa3ff37e4d2dc1cd4d47f0c3df9eb58d9ec8508ca88/coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", size = 210230 }, - { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983 }, - { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221 }, - { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342 }, - { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371 }, - { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455 }, - { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924 }, - { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252 }, - { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897 }, - { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606 }, - { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373 }, - { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007 }, - { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269 }, - { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886 }, - { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037 }, - { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038 }, - { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690 }, - { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765 }, - { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611 }, - { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671 }, - { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368 }, - { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758 }, - { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035 }, - { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839 }, - { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569 }, - { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927 }, - { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401 }, - { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301 }, - { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598 }, - { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307 }, - { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453 }, +version = "7.6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/60/e781e8302e7b28f21ce06e30af077f856aa2cb4cf2253287dae9a593d509/coverage-7.6.2.tar.gz", hash = "sha256:a5f81e68aa62bc0cfca04f7b19eaa8f9c826b53fc82ab9e2121976dc74f131f3", size = 797872 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/29/72da824da4182f518b054c21552b7ed2473a4e4c6ac616298209808a1a5c/coverage-7.6.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bb21bac7783c1bf6f4bbe68b1e0ff0d20e7e7732cfb7995bc8d96e23aa90fc7b", size = 206667 }, + { url = "https://files.pythonhosted.org/packages/23/52/c15dcf3cf575256c7c0992e441cd41092a6c519d65abe1eb5567aab3d8e8/coverage-7.6.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a7b2e437fbd8fae5bc7716b9c7ff97aecc95f0b4d56e4ca08b3c8d8adcaadb84", size = 207111 }, + { url = "https://files.pythonhosted.org/packages/92/61/0d46dc26cf9f711b7b6078a54680665a5c2d62ec15991adb51e79236c699/coverage-7.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:536f77f2bf5797983652d1d55f1a7272a29afcc89e3ae51caa99b2db4e89d658", size = 239050 }, + { url = "https://files.pythonhosted.org/packages/3b/cb/9de71bade0343a0793f645f78a0e409248d85a2e5b4c4a9a1697c3b2e3d2/coverage-7.6.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f361296ca7054f0936b02525646b2731b32c8074ba6defab524b79b2b7eeac72", size = 236454 }, + { url = "https://files.pythonhosted.org/packages/f2/81/b0dc02487447c4a56cf2eed5c57735097f77aeff582277a35f1f70713a8d/coverage-7.6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7926d8d034e06b479797c199747dd774d5e86179f2ce44294423327a88d66ca7", size = 238320 }, + { url = "https://files.pythonhosted.org/packages/60/90/76815a76234050a87d0d1438a34820c1b857dd17353855c02bddabbedea8/coverage-7.6.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0bbae11c138585c89fb4e991faefb174a80112e1a7557d507aaa07675c62e66b", size = 237250 }, + { url = "https://files.pythonhosted.org/packages/f6/bd/760a599c08c882d97382855264586bba2604901029c3f6bec5710477ae81/coverage-7.6.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fcad7d5d2bbfeae1026b395036a8aa5abf67e8038ae7e6a25c7d0f88b10a8e6a", size = 235880 }, + { url = "https://files.pythonhosted.org/packages/83/de/41c3b90a779e473ae1ca325542aa5fa5464b7d2061288e9c22ba5f1deaa3/coverage-7.6.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f01e53575f27097d75d42de33b1b289c74b16891ce576d767ad8c48d17aeb5e0", size = 236653 }, + { url = "https://files.pythonhosted.org/packages/f4/90/61fe2721b9a9d9446e6c3ca33b6569e81d2a9a795ddfe786a66bf54035b7/coverage-7.6.2-cp311-cp311-win32.whl", hash = "sha256:7781f4f70c9b0b39e1b129b10c7d43a4e0c91f90c60435e6da8288efc2b73438", size = 209251 }, + { url = "https://files.pythonhosted.org/packages/96/87/d586f2b12b98288fc874d366cd8d5601f5a374cb75853647a3e4d02e4eb0/coverage-7.6.2-cp311-cp311-win_amd64.whl", hash = "sha256:9bcd51eeca35a80e76dc5794a9dd7cb04b97f0e8af620d54711793bfc1fbba4b", size = 210083 }, + { url = "https://files.pythonhosted.org/packages/3f/ac/1cca5ed5cf512a71cdd6e3afb75a5ef196f7ef9772be9192dadaaa5cfc1c/coverage-7.6.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ebc94fadbd4a3f4215993326a6a00e47d79889391f5659bf310f55fe5d9f581c", size = 206856 }, + { url = "https://files.pythonhosted.org/packages/e4/58/030354d250f107a95e7aca24c7fd238709a3c7df3083cb206368798e637a/coverage-7.6.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9681516288e3dcf0aa7c26231178cc0be6cac9705cac06709f2353c5b406cfea", size = 207098 }, + { url = "https://files.pythonhosted.org/packages/03/df/5f2cd6048d44a54bb5f58f8ece4efbc5b686ed49f8bd8dbf41eb2a6a687f/coverage-7.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d9c5d13927d77af4fbe453953810db766f75401e764727e73a6ee4f82527b3e", size = 240109 }, + { url = "https://files.pythonhosted.org/packages/d3/18/7c53887643d921faa95529643b1b33e60ebba30ab835c8b5abd4e54d946b/coverage-7.6.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b92f9ca04b3e719d69b02dc4a69debb795af84cb7afd09c5eb5d54b4a1ae2191", size = 237141 }, + { url = "https://files.pythonhosted.org/packages/d2/79/339bdf597d128374e6150c089b37436ba694585d769cabf6d5abd73a1365/coverage-7.6.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ff2ef83d6d0b527b5c9dad73819b24a2f76fdddcfd6c4e7a4d7e73ecb0656b4", size = 239210 }, + { url = "https://files.pythonhosted.org/packages/a9/62/7310c6de2bcb8a42f91094d41f0d4793ccda5a54621be3db76a156556cf2/coverage-7.6.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:47ccb6e99a3031ffbbd6e7cc041e70770b4fe405370c66a54dbf26a500ded80b", size = 238698 }, + { url = "https://files.pythonhosted.org/packages/f2/cb/ccb23c084d7f581f770dc7ed547dc5b50763334ad6ce26087a9ad0b5b26d/coverage-7.6.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a867d26f06bcd047ef716175b2696b315cb7571ccb951006d61ca80bbc356e9e", size = 237000 }, + { url = "https://files.pythonhosted.org/packages/e7/ab/58de9e2f94e4dc91b84d6e2705aa1e9d5447a2669fe113b4bbce6d2224a1/coverage-7.6.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cdfcf2e914e2ba653101157458afd0ad92a16731eeba9a611b5cbb3e7124e74b", size = 238666 }, + { url = "https://files.pythonhosted.org/packages/6c/dc/8be87b9ed5dbd4892b603f41088b41982768e928734e5bdce67d2ddd460a/coverage-7.6.2-cp312-cp312-win32.whl", hash = "sha256:f9035695dadfb397bee9eeaf1dc7fbeda483bf7664a7397a629846800ce6e276", size = 209489 }, + { url = "https://files.pythonhosted.org/packages/64/3a/3f44e55273a58bfb39b87ad76541bbb81d14de916b034fdb39971cc99ffe/coverage-7.6.2-cp312-cp312-win_amd64.whl", hash = "sha256:5ed69befa9a9fc796fe015a7040c9398722d6b97df73a6b608e9e275fa0932b0", size = 210270 }, + { url = "https://files.pythonhosted.org/packages/ae/99/c9676a75b57438a19c5174dfcf39798b42728ad56650497286379dc0c2c3/coverage-7.6.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eea60c79d36a8f39475b1af887663bc3ae4f31289cd216f514ce18d5938df40", size = 206888 }, + { url = "https://files.pythonhosted.org/packages/e0/de/820ecb42e892049c5f384430e98b35b899da3451dd0cdb2f867baf26abfa/coverage-7.6.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa68a6cdbe1bc6793a9dbfc38302c11599bbe1837392ae9b1d238b9ef3dafcf1", size = 207142 }, + { url = "https://files.pythonhosted.org/packages/dd/59/81fc7ad855d65eeb68fe9e7809cbb339946adb07be7ac32d3fc24dc17bd7/coverage-7.6.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ec528ae69f0a139690fad6deac8a7d33629fa61ccce693fdd07ddf7e9931fba", size = 239658 }, + { url = "https://files.pythonhosted.org/packages/cd/a7/865de3eb9e78ffbf7afd92f86d2580b18edfb6f0481bd3c39b205e05a762/coverage-7.6.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed5ac02126f74d190fa2cc14a9eb2a5d9837d5863920fa472b02eb1595cdc925", size = 236802 }, + { url = "https://files.pythonhosted.org/packages/36/94/3b8f3abf88b7c451f97fd14c98f536bcee364e74250d928d57cc97c38ddd/coverage-7.6.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21c0ea0d4db8a36b275cb6fb2437a3715697a4ba3cb7b918d3525cc75f726304", size = 238793 }, + { url = "https://files.pythonhosted.org/packages/d5/4b/57f95e41a10525002f524f3dbd577a3a9871d67998f8a8eb192fe697dc7b/coverage-7.6.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:35a51598f29b2a19e26d0908bd196f771a9b1c5d9a07bf20be0adf28f1ad4f77", size = 238455 }, + { url = "https://files.pythonhosted.org/packages/99/c9/9fbe5b841628e1d9030c8044844afef4f4735586289eb9237eeb5b97f0d7/coverage-7.6.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c9192925acc33e146864b8cf037e2ed32a91fdf7644ae875f5d46cd2ef086a5f", size = 236538 }, + { url = "https://files.pythonhosted.org/packages/43/0d/2200a0d447e30de94d48e4851c04d8dce37340815e7eda27457a7043c037/coverage-7.6.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf4eeecc9e10f5403ec06138978235af79c9a79af494eb6b1d60a50b49ed2869", size = 238383 }, + { url = "https://files.pythonhosted.org/packages/ec/8a/106c66faafb4a87002b698769d6de3c4db0b6c29a7aeb72de13b893c333e/coverage-7.6.2-cp313-cp313-win32.whl", hash = "sha256:e4ee15b267d2dad3e8759ca441ad450c334f3733304c55210c2a44516e8d5530", size = 209551 }, + { url = "https://files.pythonhosted.org/packages/c4/f5/1b39e2faaf5b9cc7eed568c444df5991ce7ff7138e2e735a6801be1bdadb/coverage-7.6.2-cp313-cp313-win_amd64.whl", hash = "sha256:c71965d1ced48bf97aab79fad56df82c566b4c498ffc09c2094605727c4b7e36", size = 210282 }, + { url = "https://files.pythonhosted.org/packages/79/a3/8dd4e6c09f5286094cd6c7edb115b3fbf06ad8304d45431722a4e3bc2508/coverage-7.6.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7571e8bbecc6ac066256f9de40365ff833553e2e0c0c004f4482facb131820ef", size = 207629 }, + { url = "https://files.pythonhosted.org/packages/8e/db/a9aa7009bbdc570a235e1ac781c0a83aa323cac6db8f8f13c2127b110978/coverage-7.6.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:078a87519057dacb5d77e333f740708ec2a8f768655f1db07f8dfd28d7a005f0", size = 207902 }, + { url = "https://files.pythonhosted.org/packages/54/08/d0962be62d4335599ca2ff3a48bb68c9bfb80df74e28ca689ff5f392087b/coverage-7.6.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e5e92e3e84a8718d2de36cd8387459cba9a4508337b8c5f450ce42b87a9e760", size = 250617 }, + { url = "https://files.pythonhosted.org/packages/a5/a2/158570aff1dd88b661a6c11281cbb190e8696e77798b4b2e47c74bfb2f39/coverage-7.6.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebabdf1c76593a09ee18c1a06cd3022919861365219ea3aca0247ededf6facd6", size = 246334 }, + { url = "https://files.pythonhosted.org/packages/aa/fe/b00428cca325b6585ca77422e4f64d7d86a225b14664b98682ea501efb57/coverage-7.6.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12179eb0575b8900912711688e45474f04ab3934aaa7b624dea7b3c511ecc90f", size = 248692 }, + { url = "https://files.pythonhosted.org/packages/30/21/0a15fefc13039450bc45e7159f3add92489f004555eb7dab9c7ad4365dd0/coverage-7.6.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:39d3b964abfe1519b9d313ab28abf1d02faea26cd14b27f5283849bf59479ff5", size = 248188 }, + { url = "https://files.pythonhosted.org/packages/de/b8/5c093526046a8450a7a3d62ad09517cf38e638f6b3ee9433dd6a73360501/coverage-7.6.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:84c4315577f7cd511d6250ffd0f695c825efe729f4205c0340f7004eda51191f", size = 246072 }, + { url = "https://files.pythonhosted.org/packages/1e/8b/542b607d2cff56e5a90a6948f5a9040b693761d2be2d3c3bf88957b02361/coverage-7.6.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ff797320dcbff57caa6b2301c3913784a010e13b1f6cf4ab3f563f3c5e7919db", size = 247354 }, + { url = "https://files.pythonhosted.org/packages/95/82/2e9111aa5e59f42b332d387f64e3205c2263518d1e660154d0c9fc54390e/coverage-7.6.2-cp313-cp313t-win32.whl", hash = "sha256:2b636a301e53964550e2f3094484fa5a96e699db318d65398cfba438c5c92171", size = 210194 }, + { url = "https://files.pythonhosted.org/packages/9d/46/aabe4305cfc57cab4865f788ceceef746c422469720c32ed7a5b44e20f5e/coverage-7.6.2-cp313-cp313t-win_amd64.whl", hash = "sha256:d03a060ac1a08e10589c27d509bbdb35b65f2d7f3f8d81cf2fa199877c7bc58a", size = 211346 }, ] [package.optional-dependencies] @@ -532,30 +560,50 @@ plugins = [ [[package]] name = "markupsafe" -version = "2.1.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", size = 19384 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", size = 18219 }, - { url = "https://files.pythonhosted.org/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", size = 14098 }, - { url = "https://files.pythonhosted.org/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", size = 29014 }, - { url = "https://files.pythonhosted.org/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", size = 28220 }, - { url = "https://files.pythonhosted.org/packages/0c/40/2e73e7d532d030b1e41180807a80d564eda53babaf04d65e15c1cf897e40/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", size = 27756 }, - { url = "https://files.pythonhosted.org/packages/18/46/5dca760547e8c59c5311b332f70605d24c99d1303dd9a6e1fc3ed0d73561/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", size = 33988 }, - { url = "https://files.pythonhosted.org/packages/6d/c5/27febe918ac36397919cd4a67d5579cbbfa8da027fa1238af6285bb368ea/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", size = 32718 }, - { url = "https://files.pythonhosted.org/packages/f8/81/56e567126a2c2bc2684d6391332e357589a96a76cb9f8e5052d85cb0ead8/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", size = 33317 }, - { url = "https://files.pythonhosted.org/packages/00/0b/23f4b2470accb53285c613a3ab9ec19dc944eaf53592cb6d9e2af8aa24cc/MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", size = 16670 }, - { url = "https://files.pythonhosted.org/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", size = 17224 }, - { url = "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", size = 18215 }, - { url = "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", size = 14069 }, - { url = "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", size = 29452 }, - { url = "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", size = 28462 }, - { url = "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", size = 27869 }, - { url = "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", size = 33906 }, - { url = "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", size = 32296 }, - { url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", size = 33038 }, - { url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", size = 16572 }, - { url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", size = 17127 }, +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/d2/38ff920762f2247c3af5cbbbbc40756f575d9692d381d7c520f45deb9b8f/markupsafe-3.0.1.tar.gz", hash = "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344", size = 20249 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/af/2f5d88a7fc7226bd34c6e15f6061246ad8cff979da9f19d11bdd0addd8e2/MarkupSafe-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad", size = 14387 }, + { url = "https://files.pythonhosted.org/packages/8d/43/fd588ef5d192308c5e05974bac659bf6ae29c202b7ea2c4194bcf01eacee/MarkupSafe-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583", size = 12410 }, + { url = "https://files.pythonhosted.org/packages/58/26/78f161d602fb03804118905e5faacafc0ec592bbad71aaee62537529813a/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7", size = 24006 }, + { url = "https://files.pythonhosted.org/packages/ae/1d/7d5ec8bcfd9c2db235d720fa51d818b7e2abc45250ce5f53dd6cb60409ca/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b", size = 23303 }, + { url = "https://files.pythonhosted.org/packages/26/ce/703ca3b03a709e3bd1fbffa407789e56b9fa664456538092617dd665fc1d/MarkupSafe-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3", size = 23205 }, + { url = "https://files.pythonhosted.org/packages/88/60/40be0493decabc2344b12d3a709fd6ccdd15a5ebaee1e8d878315d107ad3/MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50", size = 23684 }, + { url = "https://files.pythonhosted.org/packages/6d/f8/8fd52a66e8f62a9add62b4a0b5a3ab4092027437f2ef027f812d94ae91cf/MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915", size = 23472 }, + { url = "https://files.pythonhosted.org/packages/d4/0b/998b17b9e06ea45ad1646fea586f1b83d02dfdb14d47dd2fd81fba5a08c9/MarkupSafe-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91", size = 23388 }, + { url = "https://files.pythonhosted.org/packages/5a/57/b6b7aa23b2e26d68d601718f8ce3161fbdaf967b31752c7dec52bef828c9/MarkupSafe-3.0.1-cp311-cp311-win32.whl", hash = "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635", size = 15106 }, + { url = "https://files.pythonhosted.org/packages/fc/b5/20cb1d714596acb553c810009c8004c809823947da63e13c19a7decfcb6c/MarkupSafe-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf", size = 15542 }, + { url = "https://files.pythonhosted.org/packages/45/6d/72ed58d42a12bd9fc288dbff6dd8d03ea973a232ac0538d7f88d105b5251/MarkupSafe-3.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4", size = 14322 }, + { url = "https://files.pythonhosted.org/packages/86/f5/241238f89cdd6461ac9f521af8389f9a48fab97e4f315c69e9e0d52bc919/MarkupSafe-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5", size = 12380 }, + { url = "https://files.pythonhosted.org/packages/27/94/79751928bca5841416d8ca02e22198672e021d5c7120338e2a6e3771f8fc/MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346", size = 24099 }, + { url = "https://files.pythonhosted.org/packages/10/6e/1b8070bbfc467429c7983cd5ffd4ec57e1d501763d974c7caaa0a9a79f4c/MarkupSafe-3.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729", size = 23249 }, + { url = "https://files.pythonhosted.org/packages/66/50/9389ae6cdff78d7481a2a2641830b5eb1d1f62177550e73355a810a889c9/MarkupSafe-3.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc", size = 23149 }, + { url = "https://files.pythonhosted.org/packages/16/02/5dddff5366fde47133186efb847fa88bddef85914bbe623e25cfeccb3517/MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9", size = 23864 }, + { url = "https://files.pythonhosted.org/packages/f3/f1/700ee6655561cfda986e03f7afc309e3738918551afa7dedd99225586227/MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b", size = 23440 }, + { url = "https://files.pythonhosted.org/packages/fb/3e/d26623ac7f16709823b4c80e0b4a1c9196eeb46182a6c1d47b5e0c8434f4/MarkupSafe-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38", size = 23610 }, + { url = "https://files.pythonhosted.org/packages/51/04/1f8da0810c39cb9fcff96b6baed62272c97065e9cf11471965a161439e20/MarkupSafe-3.0.1-cp312-cp312-win32.whl", hash = "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa", size = 15113 }, + { url = "https://files.pythonhosted.org/packages/eb/24/a36dc37365bdd358b1e583cc40475593e36ab02cb7da6b3d0b9c05b0da7a/MarkupSafe-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f", size = 15611 }, + { url = "https://files.pythonhosted.org/packages/b1/60/4572a8aa1beccbc24b133aa0670781a5d2697f4fa3fecf0a87b46383174b/MarkupSafe-3.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772", size = 14325 }, + { url = "https://files.pythonhosted.org/packages/38/42/849915b99a765ec104bfd07ee933de5fc9c58fa9570efa7db81717f495d8/MarkupSafe-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da", size = 12373 }, + { url = "https://files.pythonhosted.org/packages/ef/82/4caaebd963c6d60b28e4445f38841d24f8b49bc10594a09956c9d73bfc08/MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a", size = 24059 }, + { url = "https://files.pythonhosted.org/packages/20/15/6b319be2f79fcfa3173f479d69f4e950b5c9b642db4f22cf73ae5ade745f/MarkupSafe-3.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c", size = 23211 }, + { url = "https://files.pythonhosted.org/packages/9d/3f/8963bdf4962feb2154475acb7dc350f04217b5e0be7763a39b432291e229/MarkupSafe-3.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd", size = 23095 }, + { url = "https://files.pythonhosted.org/packages/af/93/f770bc70953d32de0c6ce4bcb76271512123a1ead91aaef625a020c5bfaf/MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7", size = 23901 }, + { url = "https://files.pythonhosted.org/packages/11/92/1e5a33aa0a1190161238628fb68eb1bc5e67b56a5c89f0636328704b463a/MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd", size = 23463 }, + { url = "https://files.pythonhosted.org/packages/0d/fe/657efdfe385d2a3a701f2c4fcc9577c63c438aeefdd642d0d956c4ecd225/MarkupSafe-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5", size = 23569 }, + { url = "https://files.pythonhosted.org/packages/cf/24/587dea40304046ace60f846cedaebc0d33d967a3ce46c11395a10e7a78ba/MarkupSafe-3.0.1-cp313-cp313-win32.whl", hash = "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c", size = 15117 }, + { url = "https://files.pythonhosted.org/packages/32/8f/d8961d633f26a011b4fe054f3bfff52f673423b8c431553268741dfb089e/MarkupSafe-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f", size = 15613 }, + { url = "https://files.pythonhosted.org/packages/9e/93/d6367ffbcd0c5c371370767f768eaa32af60bc411245b8517e383c6a2b12/MarkupSafe-3.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a", size = 14563 }, + { url = "https://files.pythonhosted.org/packages/4a/37/f813c3835747dec08fe19ac9b9eced01fdf93a4b3e626521675dc7f423a9/MarkupSafe-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d", size = 12505 }, + { url = "https://files.pythonhosted.org/packages/72/bf/800b4d1580298ca91ccd6c95915bbd147142dad1b8cf91d57b93b28670dd/MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396", size = 25358 }, + { url = "https://files.pythonhosted.org/packages/fd/78/26e209abc8f0a379f031f0acc151231974e5b153d7eda5759d17d8f329f2/MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453", size = 23797 }, + { url = "https://files.pythonhosted.org/packages/09/e1/918496a9390891756efee818880e71c1bbaf587f4dc8ede3f3852357310a/MarkupSafe-3.0.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4", size = 23743 }, + { url = "https://files.pythonhosted.org/packages/cd/c6/26f576cd58d6c2decd9045e4e3f3c5dbc01ea6cb710916e7bbb6ebd95b6b/MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8", size = 25076 }, + { url = "https://files.pythonhosted.org/packages/b5/fa/10b24fb3b0e15fe5389dc88ecc6226ede08297e0ba7130610efbe0cdfb27/MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984", size = 24037 }, + { url = "https://files.pythonhosted.org/packages/c8/81/4b3f5537d9f6cc4f5c80d6c4b78af9a5247fd37b5aba95807b2cbc336b9a/MarkupSafe-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a", size = 24015 }, + { url = "https://files.pythonhosted.org/packages/5f/07/8e8dcecd53216c5e01a51e84c32a2bce166690ed19c184774b38cd41921d/MarkupSafe-3.0.1-cp313-cp313t-win32.whl", hash = "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b", size = 15213 }, + { url = "https://files.pythonhosted.org/packages/0d/87/4c364e0f109eea2402079abecbe33fef4f347b551a11423d1f4e187ea497/MarkupSafe-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295", size = 15741 }, ] [[package]] @@ -590,7 +638,7 @@ wheels = [ [[package]] name = "mkdocs" -version = "1.6.0" +version = "1.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -607,9 +655,9 @@ dependencies = [ { name = "pyyaml-env-tag" }, { name = "watchdog" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cc/6b/26b33cc8ad54e8bc0345cddc061c2c5c23e364de0ecd97969df23f95a673/mkdocs-1.6.0.tar.gz", hash = "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512", size = 3888392 } +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/c0/930dcf5a3e96b9c8e7ad15502603fc61d495479699e2d2c381e3d37294d1/mkdocs-1.6.0-py3-none-any.whl", hash = "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7", size = 3862264 }, + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451 }, ] [[package]] @@ -628,7 +676,7 @@ wheels = [ [[package]] name = "mkdocs-material" -version = "9.5.33" +version = "9.5.40" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, @@ -643,9 +691,9 @@ dependencies = [ { name = "regex" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/73/d5/f393412423f92dde7a4d7b9b74f294c5f8589679132739bd3cd333099641/mkdocs_material-9.5.33.tar.gz", hash = "sha256:d23a8b5e3243c9b2f29cdfe83051104a8024b767312dc8fde05ebe91ad55d89d", size = 4107690 } +sdist = { url = "https://files.pythonhosted.org/packages/b8/2b/6f9e0b9573a4acfa15834a30eca48ad578fe6ab46afa072df5ff05103a86/mkdocs_material-9.5.40.tar.gz", hash = "sha256:b69d70e667ec51fc41f65e006a3184dd00d95b2439d982cb1586e4c018943156", size = 3963129 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/b1/1cebba96a01fa25299e9055bcd4c169f813f5cb73449194554a24bdda542/mkdocs_material-9.5.33-py3-none-any.whl", hash = "sha256:dbc79cf0fdc6e2c366aa987de8b0c9d4e2bb9f156e7466786ba2fd0f9bf7ffca", size = 8823286 }, + { url = "https://files.pythonhosted.org/packages/2c/ad/f8039114a23cfb02213f133a1dc8865522128a0b2cb251a7e717de8aa979/mkdocs_material-9.5.40-py3-none-any.whl", hash = "sha256:8e7a16ada34e79a7b6459ff2602584222f522c738b6a023d1bea853d5049da6f", size = 8670419 }, ] [[package]] @@ -659,71 +707,97 @@ wheels = [ [[package]] name = "msgpack" -version = "1.0.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/08/4c/17adf86a8fbb02c144c7569dc4919483c01a2ac270307e2d59e1ce394087/msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3", size = 167014 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/0e/96477b0448c593cc5c679e855c7bb58bb6543a065760e67cad0c3f90deb1/msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836", size = 157669 }, - { url = "https://files.pythonhosted.org/packages/46/ca/96051d40050cd17bf054996662dbf8900da9995fa0a3308f2597a47bedad/msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad", size = 87994 }, - { url = "https://files.pythonhosted.org/packages/17/29/7f3f30dd40bf1c2599350099645d3664b3aadb803583cbfce57a28047c4d/msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b", size = 84887 }, - { url = "https://files.pythonhosted.org/packages/1a/01/01a88f7971c68037dab4be2737b50e00557bbdaf179ab988803c736043ed/msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba", size = 400836 }, - { url = "https://files.pythonhosted.org/packages/f6/f0/a7bdb48223cd21b9abed814b08fca8fe6a40931e70ec97c24d2f15d68ef3/msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85", size = 409267 }, - { url = "https://files.pythonhosted.org/packages/f5/9a/88388f7960930a7dc0bbcde3d1db1bd543c9645483f3172c64853f4cab67/msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950", size = 397264 }, - { url = "https://files.pythonhosted.org/packages/43/7c/82b729d105dae9f8be500228fdd8cfc1f918a18e285afcbf6d6915146037/msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a", size = 404763 }, - { url = "https://files.pythonhosted.org/packages/e0/3f/978df03be94c2198be22df5d6e31b69ef7a9759c6cc0cce4ed1d08e2b27b/msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b", size = 434775 }, - { url = "https://files.pythonhosted.org/packages/dd/06/adb6c8cdea18f9ba09b7dc1442b50ce222858ae4a85703420349784429d0/msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce", size = 409109 }, - { url = "https://files.pythonhosted.org/packages/c6/d6/46eec1866b1ff58001a4be192ec43675620392de078fd4baf394f7d03552/msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305", size = 68779 }, - { url = "https://files.pythonhosted.org/packages/33/e9/f450b8e1243704c0ab656dcd37f6146881d11bbb68588132d8ae673c455b/msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e", size = 75180 }, - { url = "https://files.pythonhosted.org/packages/97/73/757eeca26527ebac31d86d35bf4ba20155ee14d35c8619dd96bc80a037f3/msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee", size = 158948 }, - { url = "https://files.pythonhosted.org/packages/11/df/558899a5f90d450e988484be25be0b49c6930858d6fe44ea6f1f66502fe5/msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b", size = 88696 }, - { url = "https://files.pythonhosted.org/packages/99/3e/49d430df1e9abf06bb91e9824422cd6ceead2114662417286da3ddcdd295/msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8", size = 85428 }, - { url = "https://files.pythonhosted.org/packages/54/f7/84828d0c6be6b7f0770777f1a7b1f76f3a78e8b6afb5e4e9c1c9350242be/msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3", size = 396116 }, - { url = "https://files.pythonhosted.org/packages/04/2a/c833a8503be9030083f0469e7a3c74d3622a3b4eae676c3934d3ccc01036/msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc", size = 408331 }, - { url = "https://files.pythonhosted.org/packages/04/50/b988d0a8e8835f705e4bbcb6433845ff11dd50083c0aa43e607bb7b2ff96/msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58", size = 394182 }, - { url = "https://files.pythonhosted.org/packages/98/e1/0d18496cbeef771db605b6a14794f9b4235d371f36b43f7223c1613969ec/msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f", size = 401226 }, - { url = "https://files.pythonhosted.org/packages/03/79/ae000bde2aee4b9f0d50c1ca1ab301ade873b59dd6968c28f918d1cf8be4/msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04", size = 432994 }, - { url = "https://files.pythonhosted.org/packages/cb/46/f97bedf3ab16d38eeea0aafa3ad93cc7b9adf898218961faaea9c3c639f1/msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543", size = 410432 }, - { url = "https://files.pythonhosted.org/packages/8f/59/db5b61c74341b6fdf2c8a5743bb242c395d728666cf3105ff17290eb421a/msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c", size = 69255 }, - { url = "https://files.pythonhosted.org/packages/72/5c/5facaa9b5d1b3ead831697daacf37d485af312bbe483ac6ecf43a3dd777f/msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd", size = 75348 }, +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/5e/a4c7154ba65d93be91f2f1e55f90e76c5f91ccadc7efc4341e6f04c8647f/msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7", size = 150803 }, + { url = "https://files.pythonhosted.org/packages/60/c2/687684164698f1d51c41778c838d854965dd284a4b9d3a44beba9265c931/msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa", size = 84343 }, + { url = "https://files.pythonhosted.org/packages/42/ae/d3adea9bb4a1342763556078b5765e666f8fdf242e00f3f6657380920972/msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701", size = 81408 }, + { url = "https://files.pythonhosted.org/packages/dc/17/6313325a6ff40ce9c3207293aee3ba50104aed6c2c1559d20d09e5c1ff54/msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6", size = 396096 }, + { url = "https://files.pythonhosted.org/packages/a8/a1/ad7b84b91ab5a324e707f4c9761633e357820b011a01e34ce658c1dda7cc/msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59", size = 403671 }, + { url = "https://files.pythonhosted.org/packages/bb/0b/fd5b7c0b308bbf1831df0ca04ec76fe2f5bf6319833646b0a4bd5e9dc76d/msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0", size = 387414 }, + { url = "https://files.pythonhosted.org/packages/f0/03/ff8233b7c6e9929a1f5da3c7860eccd847e2523ca2de0d8ef4878d354cfa/msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e", size = 383759 }, + { url = "https://files.pythonhosted.org/packages/1f/1b/eb82e1fed5a16dddd9bc75f0854b6e2fe86c0259c4353666d7fab37d39f4/msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6", size = 394405 }, + { url = "https://files.pythonhosted.org/packages/90/2e/962c6004e373d54ecf33d695fb1402f99b51832631e37c49273cc564ffc5/msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5", size = 396041 }, + { url = "https://files.pythonhosted.org/packages/f8/20/6e03342f629474414860c48aeffcc2f7f50ddaf351d95f20c3f1c67399a8/msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88", size = 68538 }, + { url = "https://files.pythonhosted.org/packages/aa/c4/5a582fc9a87991a3e6f6800e9bb2f3c82972912235eb9539954f3e9997c7/msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788", size = 74871 }, + { url = "https://files.pythonhosted.org/packages/e1/d6/716b7ca1dbde63290d2973d22bbef1b5032ca634c3ff4384a958ec3f093a/msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", size = 152421 }, + { url = "https://files.pythonhosted.org/packages/70/da/5312b067f6773429cec2f8f08b021c06af416bba340c912c2ec778539ed6/msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", size = 85277 }, + { url = "https://files.pythonhosted.org/packages/28/51/da7f3ae4462e8bb98af0d5bdf2707f1b8c65a0d4f496e46b6afb06cbc286/msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", size = 82222 }, + { url = "https://files.pythonhosted.org/packages/33/af/dc95c4b2a49cff17ce47611ca9ba218198806cad7796c0b01d1e332c86bb/msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", size = 392971 }, + { url = "https://files.pythonhosted.org/packages/f1/54/65af8de681fa8255402c80eda2a501ba467921d5a7a028c9c22a2c2eedb5/msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", size = 401403 }, + { url = "https://files.pythonhosted.org/packages/97/8c/e333690777bd33919ab7024269dc3c41c76ef5137b211d776fbb404bfead/msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", size = 385356 }, + { url = "https://files.pythonhosted.org/packages/57/52/406795ba478dc1c890559dd4e89280fa86506608a28ccf3a72fbf45df9f5/msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", size = 383028 }, + { url = "https://files.pythonhosted.org/packages/e7/69/053b6549bf90a3acadcd8232eae03e2fefc87f066a5b9fbb37e2e608859f/msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", size = 391100 }, + { url = "https://files.pythonhosted.org/packages/23/f0/d4101d4da054f04274995ddc4086c2715d9b93111eb9ed49686c0f7ccc8a/msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", size = 394254 }, + { url = "https://files.pythonhosted.org/packages/1c/12/cf07458f35d0d775ff3a2dc5559fa2e1fcd06c46f1ef510e594ebefdca01/msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", size = 69085 }, + { url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", size = 75347 }, + { url = "https://files.pythonhosted.org/packages/c8/b0/380f5f639543a4ac413e969109978feb1f3c66e931068f91ab6ab0f8be00/msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf", size = 151142 }, + { url = "https://files.pythonhosted.org/packages/c8/ee/be57e9702400a6cb2606883d55b05784fada898dfc7fd12608ab1fdb054e/msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330", size = 84523 }, + { url = "https://files.pythonhosted.org/packages/7e/3a/2919f63acca3c119565449681ad08a2f84b2171ddfcff1dba6959db2cceb/msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734", size = 81556 }, + { url = "https://files.pythonhosted.org/packages/7c/43/a11113d9e5c1498c145a8925768ea2d5fce7cbab15c99cda655aa09947ed/msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e", size = 392105 }, + { url = "https://files.pythonhosted.org/packages/2d/7b/2c1d74ca6c94f70a1add74a8393a0138172207dc5de6fc6269483519d048/msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca", size = 399979 }, + { url = "https://files.pythonhosted.org/packages/82/8c/cf64ae518c7b8efc763ca1f1348a96f0e37150061e777a8ea5430b413a74/msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915", size = 383816 }, + { url = "https://files.pythonhosted.org/packages/69/86/a847ef7a0f5ef3fa94ae20f52a4cacf596a4e4a010197fbcc27744eb9a83/msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d", size = 380973 }, + { url = "https://files.pythonhosted.org/packages/aa/90/c74cf6e1126faa93185d3b830ee97246ecc4fe12cf9d2d31318ee4246994/msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434", size = 387435 }, + { url = "https://files.pythonhosted.org/packages/7a/40/631c238f1f338eb09f4acb0f34ab5862c4e9d7eda11c1b685471a4c5ea37/msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c", size = 399082 }, + { url = "https://files.pythonhosted.org/packages/e9/1b/fa8a952be252a1555ed39f97c06778e3aeb9123aa4cccc0fd2acd0b4e315/msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc", size = 69037 }, + { url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f", size = 75140 }, ] [[package]] name = "multidict" -version = "6.0.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/79/722ca999a3a09a63b35aac12ec27dfa8e5bb3a38b0f857f7a1a209a88836/multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da", size = 59867 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/da/b10ea65b850b54f44a6479177c6987f456bc2d38f8dc73009b78afcf0ede/multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba", size = 50815 }, - { url = "https://files.pythonhosted.org/packages/21/db/3403263f158b0bc7b0d4653766d71cb39498973f2042eead27b2e9758782/multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e", size = 30269 }, - { url = "https://files.pythonhosted.org/packages/02/c1/b15ecceb6ffa5081ed2ed450aea58d65b0e0358001f2b426705f9f41f4c2/multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd", size = 30500 }, - { url = "https://files.pythonhosted.org/packages/3f/e1/7fdd0f39565df3af87d6c2903fb66a7d529fbd0a8a066045d7a5b6ad1145/multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3", size = 130751 }, - { url = "https://files.pythonhosted.org/packages/76/bc/9f593f9e38c6c09bbf0344b56ad67dd53c69167937c2edadee9719a5e17d/multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf", size = 138185 }, - { url = "https://files.pythonhosted.org/packages/28/32/d7799a208701d537b92705f46c777ded812a6dc139c18d8ed599908f6b1c/multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29", size = 133585 }, - { url = "https://files.pythonhosted.org/packages/52/ec/be54a3ad110f386d5bd7a9a42a4ff36b3cd723ebe597f41073a73ffa16b8/multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed", size = 128684 }, - { url = "https://files.pythonhosted.org/packages/36/e1/a680eabeb71e25d4733276d917658dfa1cd3a99b1223625dbc247d266c98/multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733", size = 120994 }, - { url = "https://files.pythonhosted.org/packages/ef/08/08f4f44a8a43ea4cee13aa9cdbbf4a639af8db49310a0637ca389c4cf817/multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f", size = 159689 }, - { url = "https://files.pythonhosted.org/packages/aa/a9/46cdb4cb40bbd4b732169413f56b04a6553460b22bd914f9729c9ba63761/multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4", size = 150611 }, - { url = "https://files.pythonhosted.org/packages/e9/32/35668bb3e6ab2f12f4e4f7f4000f72f714882a94f904d4c3633fbd036753/multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1", size = 164444 }, - { url = "https://files.pythonhosted.org/packages/fa/10/f1388a91552af732d8ec48dab928abc209e732767e9e8f92d24c3544353c/multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc", size = 160158 }, - { url = "https://files.pythonhosted.org/packages/14/c3/f602601f1819983e018156e728e57b3f19726cb424b543667faab82f6939/multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e", size = 156072 }, - { url = "https://files.pythonhosted.org/packages/82/a6/0290af8487326108c0d03d14f8a0b8b1001d71e4494df5f96ab0c88c0b88/multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c", size = 25731 }, - { url = "https://files.pythonhosted.org/packages/88/aa/ea217cb18325aa05cb3e3111c19715f1e97c50a4a900cbc20e54648de5f5/multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea", size = 28176 }, - { url = "https://files.pythonhosted.org/packages/90/9c/7fda9c0defa09538c97b1f195394be82a1f53238536f70b32eb5399dfd4e/multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e", size = 49575 }, - { url = "https://files.pythonhosted.org/packages/be/21/d6ca80dd1b9b2c5605ff7475699a8ff5dc6ea958cd71fb2ff234afc13d79/multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b", size = 29638 }, - { url = "https://files.pythonhosted.org/packages/9c/18/9565f32c19d186168731e859692dfbc0e98f66a1dcf9e14d69c02a78b75a/multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5", size = 29874 }, - { url = "https://files.pythonhosted.org/packages/4e/4e/3815190e73e6ef101b5681c174c541bf972a1b064e926e56eea78d06e858/multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450", size = 129914 }, - { url = "https://files.pythonhosted.org/packages/0c/08/bb47f886457e2259aefc10044e45c8a1b62f0c27228557e17775869d0341/multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496", size = 134589 }, - { url = "https://files.pythonhosted.org/packages/d5/2f/952f79b5f0795cf4e34852fc5cf4dfda6166f63c06c798361215b69c131d/multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a", size = 133259 }, - { url = "https://files.pythonhosted.org/packages/24/1f/af976383b0b772dd351210af5b60ff9927e3abb2f4a103e93da19a957da0/multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226", size = 130779 }, - { url = "https://files.pythonhosted.org/packages/fc/b1/b0a7744be00b0f5045c7ed4e4a6b8ee6bde4672b2c620474712299df5979/multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271", size = 120125 }, - { url = "https://files.pythonhosted.org/packages/d0/bf/2a1d667acf11231cdf0b97a6cd9f30e7a5cf847037b5cf6da44884284bd0/multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb", size = 167095 }, - { url = "https://files.pythonhosted.org/packages/5e/e8/ad6ee74b1a2050d3bc78f566dabcc14c8bf89cbe87eecec866c011479815/multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef", size = 155823 }, - { url = "https://files.pythonhosted.org/packages/45/7c/06926bb91752c52abca3edbfefac1ea90d9d1bc00c84d0658c137589b920/multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24", size = 170233 }, - { url = "https://files.pythonhosted.org/packages/3c/29/3dd36cf6b9c5abba8b97bba84eb499a168ba59c3faec8829327b3887d123/multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6", size = 169035 }, - { url = "https://files.pythonhosted.org/packages/60/47/9a0f43470c70bbf6e148311f78ef5a3d4996b0226b6d295bdd50fdcfe387/multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda", size = 166229 }, - { url = "https://files.pythonhosted.org/packages/1d/23/c1b7ae7a0b8a3e08225284ef3ecbcf014b292a3ee821bc4ed2185fd4ce7d/multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5", size = 25840 }, - { url = "https://files.pythonhosted.org/packages/4a/68/66fceb758ad7a88993940dbdf3ac59911ba9dc46d7798bf6c8652f89f853/multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556", size = 27905 }, - { url = "https://files.pythonhosted.org/packages/fa/a2/17e1e23c6be0a916219c5292f509360c345b5fa6beeb50d743203c27532c/multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7", size = 9729 }, +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/13/df3505a46d0cd08428e4c8169a196131d1b0c4b515c3649829258843dde6/multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6", size = 48570 }, + { url = "https://files.pythonhosted.org/packages/f0/e1/a215908bfae1343cdb72f805366592bdd60487b4232d039c437fe8f5013d/multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156", size = 29316 }, + { url = "https://files.pythonhosted.org/packages/70/0f/6dc70ddf5d442702ed74f298d69977f904960b82368532c88e854b79f72b/multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb", size = 29640 }, + { url = "https://files.pythonhosted.org/packages/d8/6d/9c87b73a13d1cdea30b321ef4b3824449866bd7f7127eceed066ccb9b9ff/multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b", size = 131067 }, + { url = "https://files.pythonhosted.org/packages/cc/1e/1b34154fef373371fd6c65125b3d42ff5f56c7ccc6bfff91b9b3c60ae9e0/multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72", size = 138507 }, + { url = "https://files.pythonhosted.org/packages/fb/e0/0bc6b2bac6e461822b5f575eae85da6aae76d0e2a79b6665d6206b8e2e48/multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304", size = 133905 }, + { url = "https://files.pythonhosted.org/packages/ba/af/73d13b918071ff9b2205fcf773d316e0f8fefb4ec65354bbcf0b10908cc6/multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351", size = 129004 }, + { url = "https://files.pythonhosted.org/packages/74/21/23960627b00ed39643302d81bcda44c9444ebcdc04ee5bedd0757513f259/multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb", size = 121308 }, + { url = "https://files.pythonhosted.org/packages/8b/5c/cf282263ffce4a596ed0bb2aa1a1dddfe1996d6a62d08842a8d4b33dca13/multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3", size = 132608 }, + { url = "https://files.pythonhosted.org/packages/d7/3e/97e778c041c72063f42b290888daff008d3ab1427f5b09b714f5a8eff294/multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399", size = 127029 }, + { url = "https://files.pythonhosted.org/packages/47/ac/3efb7bfe2f3aefcf8d103e9a7162572f01936155ab2f7ebcc7c255a23212/multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423", size = 137594 }, + { url = "https://files.pythonhosted.org/packages/42/9b/6c6e9e8dc4f915fc90a9b7798c44a30773dea2995fdcb619870e705afe2b/multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3", size = 134556 }, + { url = "https://files.pythonhosted.org/packages/1d/10/8e881743b26aaf718379a14ac58572a240e8293a1c9d68e1418fb11c0f90/multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753", size = 130993 }, + { url = "https://files.pythonhosted.org/packages/45/84/3eb91b4b557442802d058a7579e864b329968c8d0ea57d907e7023c677f2/multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80", size = 26405 }, + { url = "https://files.pythonhosted.org/packages/9f/0b/ad879847ecbf6d27e90a6eabb7eff6b62c129eefe617ea45eae7c1f0aead/multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926", size = 28795 }, + { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713 }, + { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516 }, + { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557 }, + { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170 }, + { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836 }, + { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475 }, + { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049 }, + { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370 }, + { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178 }, + { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567 }, + { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822 }, + { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656 }, + { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 }, + { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 }, + { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 }, + { url = "https://files.pythonhosted.org/packages/22/67/1c7c0f39fe069aa4e5d794f323be24bf4d33d62d2a348acdb7991f8f30db/multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008", size = 48771 }, + { url = "https://files.pythonhosted.org/packages/3c/25/c186ee7b212bdf0df2519eacfb1981a017bda34392c67542c274651daf23/multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f", size = 29533 }, + { url = "https://files.pythonhosted.org/packages/67/5e/04575fd837e0958e324ca035b339cea174554f6f641d3fb2b4f2e7ff44a2/multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28", size = 29595 }, + { url = "https://files.pythonhosted.org/packages/d3/b2/e56388f86663810c07cfe4a3c3d87227f3811eeb2d08450b9e5d19d78876/multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b", size = 130094 }, + { url = "https://files.pythonhosted.org/packages/6c/ee/30ae9b4186a644d284543d55d491fbd4239b015d36b23fea43b4c94f7052/multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c", size = 134876 }, + { url = "https://files.pythonhosted.org/packages/84/c7/70461c13ba8ce3c779503c70ec9d0345ae84de04521c1f45a04d5f48943d/multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3", size = 133500 }, + { url = "https://files.pythonhosted.org/packages/4a/9f/002af221253f10f99959561123fae676148dd730e2daa2cd053846a58507/multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44", size = 131099 }, + { url = "https://files.pythonhosted.org/packages/82/42/d1c7a7301d52af79d88548a97e297f9d99c961ad76bbe6f67442bb77f097/multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2", size = 120403 }, + { url = "https://files.pythonhosted.org/packages/68/f3/471985c2c7ac707547553e8f37cff5158030d36bdec4414cb825fbaa5327/multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3", size = 125348 }, + { url = "https://files.pythonhosted.org/packages/67/2c/e6df05c77e0e433c214ec1d21ddd203d9a4770a1f2866a8ca40a545869a0/multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa", size = 119673 }, + { url = "https://files.pythonhosted.org/packages/c5/cd/bc8608fff06239c9fb333f9db7743a1b2eafe98c2666c9a196e867a3a0a4/multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa", size = 129927 }, + { url = "https://files.pythonhosted.org/packages/44/8e/281b69b7bc84fc963a44dc6e0bbcc7150e517b91df368a27834299a526ac/multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4", size = 128711 }, + { url = "https://files.pythonhosted.org/packages/12/a4/63e7cd38ed29dd9f1881d5119f272c898ca92536cdb53ffe0843197f6c85/multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6", size = 125519 }, + { url = "https://files.pythonhosted.org/packages/38/e0/4f5855037a72cd8a7a2f60a3952d9aa45feedb37ae7831642102604e8a37/multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81", size = 26426 }, + { url = "https://files.pythonhosted.org/packages/7e/a5/17ee3a4db1e310b7405f5d25834460073a8ccd86198ce044dfaf69eac073/multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774", size = 28531 }, + { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 }, ] [[package]] @@ -773,7 +847,7 @@ wheels = [ [[package]] name = "posting" -version = "1.12.3" +version = "1.13.0" source = { editable = "." } dependencies = [ { name = "click" }, @@ -813,7 +887,7 @@ requires-dist = [ { name = "python-dotenv", specifier = "==1.0.1" }, { name = "pyyaml", specifier = "==6.0.2" }, { name = "textual", extras = ["syntax"], specifier = "==0.79.1" }, - { name = "textual-autocomplete", specifier = "==3.0.0a9" }, + { name = "textual-autocomplete", specifier = "==3.0.0a10" }, { name = "watchfiles", specifier = ">=0.24.0" }, { name = "xdg-base-dirs", specifier = "==6.0.1" }, ] @@ -830,6 +904,63 @@ dev = [ { name = "textual-dev", specifier = ">=1.5.1" }, ] +[[package]] +name = "propcache" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/4d/5e5a60b78dbc1d464f8a7bbaeb30957257afdc8512cbb9dfd5659304f5cd/propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70", size = 40951 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/1c/71eec730e12aec6511e702ad0cd73c2872eccb7cad39de8ba3ba9de693ef/propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354", size = 80811 }, + { url = "https://files.pythonhosted.org/packages/89/c3/7e94009f9a4934c48a371632197406a8860b9f08e3f7f7d922ab69e57a41/propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de", size = 46365 }, + { url = "https://files.pythonhosted.org/packages/c0/1d/c700d16d1d6903aeab28372fe9999762f074b80b96a0ccc953175b858743/propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87", size = 45602 }, + { url = "https://files.pythonhosted.org/packages/2e/5e/4a3e96380805bf742712e39a4534689f4cddf5fa2d3a93f22e9fd8001b23/propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016", size = 236161 }, + { url = "https://files.pythonhosted.org/packages/a5/85/90132481183d1436dff6e29f4fa81b891afb6cb89a7306f32ac500a25932/propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb", size = 244938 }, + { url = "https://files.pythonhosted.org/packages/4a/89/c893533cb45c79c970834274e2d0f6d64383ec740be631b6a0a1d2b4ddc0/propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2", size = 243576 }, + { url = "https://files.pythonhosted.org/packages/8c/56/98c2054c8526331a05f205bf45cbb2cda4e58e56df70e76d6a509e5d6ec6/propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4", size = 236011 }, + { url = "https://files.pythonhosted.org/packages/2d/0c/8b8b9f8a6e1abd869c0fa79b907228e7abb966919047d294ef5df0d136cf/propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504", size = 224834 }, + { url = "https://files.pythonhosted.org/packages/18/bb/397d05a7298b7711b90e13108db697732325cafdcd8484c894885c1bf109/propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178", size = 224946 }, + { url = "https://files.pythonhosted.org/packages/25/19/4fc08dac19297ac58135c03770b42377be211622fd0147f015f78d47cd31/propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d", size = 217280 }, + { url = "https://files.pythonhosted.org/packages/7e/76/c79276a43df2096ce2aba07ce47576832b1174c0c480fe6b04bd70120e59/propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2", size = 220088 }, + { url = "https://files.pythonhosted.org/packages/c3/9a/8a8cf428a91b1336b883f09c8b884e1734c87f724d74b917129a24fe2093/propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db", size = 233008 }, + { url = "https://files.pythonhosted.org/packages/25/7b/768a8969abd447d5f0f3333df85c6a5d94982a1bc9a89c53c154bf7a8b11/propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b", size = 237719 }, + { url = "https://files.pythonhosted.org/packages/ed/0d/e5d68ccc7976ef8b57d80613ac07bbaf0614d43f4750cf953f0168ef114f/propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b", size = 227729 }, + { url = "https://files.pythonhosted.org/packages/05/64/17eb2796e2d1c3d0c431dc5f40078d7282f4645af0bb4da9097fbb628c6c/propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1", size = 40473 }, + { url = "https://files.pythonhosted.org/packages/83/c5/e89fc428ccdc897ade08cd7605f174c69390147526627a7650fb883e0cd0/propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71", size = 44921 }, + { url = "https://files.pythonhosted.org/packages/7c/46/a41ca1097769fc548fc9216ec4c1471b772cc39720eb47ed7e38ef0006a9/propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2", size = 80800 }, + { url = "https://files.pythonhosted.org/packages/75/4f/93df46aab9cc473498ff56be39b5f6ee1e33529223d7a4d8c0a6101a9ba2/propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7", size = 46443 }, + { url = "https://files.pythonhosted.org/packages/0b/17/308acc6aee65d0f9a8375e36c4807ac6605d1f38074b1581bd4042b9fb37/propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8", size = 45676 }, + { url = "https://files.pythonhosted.org/packages/65/44/626599d2854d6c1d4530b9a05e7ff2ee22b790358334b475ed7c89f7d625/propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793", size = 246191 }, + { url = "https://files.pythonhosted.org/packages/f2/df/5d996d7cb18df076debae7d76ac3da085c0575a9f2be6b1f707fe227b54c/propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09", size = 251791 }, + { url = "https://files.pythonhosted.org/packages/2e/6d/9f91e5dde8b1f662f6dd4dff36098ed22a1ef4e08e1316f05f4758f1576c/propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89", size = 253434 }, + { url = "https://files.pythonhosted.org/packages/3c/e9/1b54b7e26f50b3e0497cd13d3483d781d284452c2c50dd2a615a92a087a3/propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e", size = 248150 }, + { url = "https://files.pythonhosted.org/packages/a7/ef/a35bf191c8038fe3ce9a414b907371c81d102384eda5dbafe6f4dce0cf9b/propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9", size = 233568 }, + { url = "https://files.pythonhosted.org/packages/97/d9/d00bb9277a9165a5e6d60f2142cd1a38a750045c9c12e47ae087f686d781/propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4", size = 229874 }, + { url = "https://files.pythonhosted.org/packages/8e/78/c123cf22469bdc4b18efb78893e69c70a8b16de88e6160b69ca6bdd88b5d/propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c", size = 225857 }, + { url = "https://files.pythonhosted.org/packages/31/1b/fd6b2f1f36d028820d35475be78859d8c89c8f091ad30e377ac49fd66359/propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887", size = 227604 }, + { url = "https://files.pythonhosted.org/packages/99/36/b07be976edf77a07233ba712e53262937625af02154353171716894a86a6/propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57", size = 238430 }, + { url = "https://files.pythonhosted.org/packages/0d/64/5822f496c9010e3966e934a011ac08cac8734561842bc7c1f65586e0683c/propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23", size = 244814 }, + { url = "https://files.pythonhosted.org/packages/fd/bd/8657918a35d50b18a9e4d78a5df7b6c82a637a311ab20851eef4326305c1/propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348", size = 235922 }, + { url = "https://files.pythonhosted.org/packages/a8/6f/ec0095e1647b4727db945213a9f395b1103c442ef65e54c62e92a72a3f75/propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5", size = 40177 }, + { url = "https://files.pythonhosted.org/packages/20/a2/bd0896fdc4f4c1db46d9bc361c8c79a9bf08ccc08ba054a98e38e7ba1557/propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3", size = 44446 }, + { url = "https://files.pythonhosted.org/packages/a8/a7/5f37b69197d4f558bfef5b4bceaff7c43cc9b51adf5bd75e9081d7ea80e4/propcache-0.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7", size = 78120 }, + { url = "https://files.pythonhosted.org/packages/c8/cd/48ab2b30a6b353ecb95a244915f85756d74f815862eb2ecc7a518d565b48/propcache-0.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763", size = 45127 }, + { url = "https://files.pythonhosted.org/packages/a5/ba/0a1ef94a3412aab057bd996ed5f0ac7458be5bf469e85c70fa9ceb43290b/propcache-0.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d", size = 44419 }, + { url = "https://files.pythonhosted.org/packages/b4/6c/ca70bee4f22fa99eacd04f4d2f1699be9d13538ccf22b3169a61c60a27fa/propcache-0.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a", size = 229611 }, + { url = "https://files.pythonhosted.org/packages/19/70/47b872a263e8511ca33718d96a10c17d3c853aefadeb86dc26e8421184b9/propcache-0.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b", size = 234005 }, + { url = "https://files.pythonhosted.org/packages/4f/be/3b0ab8c84a22e4a3224719099c1229ddfdd8a6a1558cf75cb55ee1e35c25/propcache-0.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb", size = 237270 }, + { url = "https://files.pythonhosted.org/packages/04/d8/f071bb000d4b8f851d312c3c75701e586b3f643fe14a2e3409b1b9ab3936/propcache-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf", size = 231877 }, + { url = "https://files.pythonhosted.org/packages/93/e7/57a035a1359e542bbb0a7df95aad6b9871ebee6dce2840cb157a415bd1f3/propcache-0.2.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2", size = 217848 }, + { url = "https://files.pythonhosted.org/packages/f0/93/d1dea40f112ec183398fb6c42fde340edd7bab202411c4aa1a8289f461b6/propcache-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f", size = 216987 }, + { url = "https://files.pythonhosted.org/packages/62/4c/877340871251145d3522c2b5d25c16a1690ad655fbab7bb9ece6b117e39f/propcache-0.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136", size = 212451 }, + { url = "https://files.pythonhosted.org/packages/7c/bb/a91b72efeeb42906ef58ccf0cdb87947b54d7475fee3c93425d732f16a61/propcache-0.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325", size = 212879 }, + { url = "https://files.pythonhosted.org/packages/9b/7f/ee7fea8faac57b3ec5d91ff47470c6c5d40d7f15d0b1fccac806348fa59e/propcache-0.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44", size = 222288 }, + { url = "https://files.pythonhosted.org/packages/ff/d7/acd67901c43d2e6b20a7a973d9d5fd543c6e277af29b1eb0e1f7bd7ca7d2/propcache-0.2.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83", size = 228257 }, + { url = "https://files.pythonhosted.org/packages/8d/6f/6272ecc7a8daad1d0754cfc6c8846076a8cb13f810005c79b15ce0ef0cf2/propcache-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544", size = 221075 }, + { url = "https://files.pythonhosted.org/packages/7c/bd/c7a6a719a6b3dd8b3aeadb3675b5783983529e4a3185946aa444d3e078f6/propcache-0.2.0-cp313-cp313-win32.whl", hash = "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032", size = 39654 }, + { url = "https://files.pythonhosted.org/packages/88/e7/0eef39eff84fa3e001b44de0bd41c7c0e3432e7648ffd3d64955910f002d/propcache-0.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e", size = 43705 }, + { url = "https://files.pythonhosted.org/packages/3d/b6/e6d98278f2d49b22b4d033c9f792eda783b9ab2094b041f013fc69bcde87/propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036", size = 11603 }, +] + [[package]] name = "pycparser" version = "2.22" @@ -925,15 +1056,15 @@ wheels = [ [[package]] name = "pymdown-extensions" -version = "10.9" +version = "10.11.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/d3/fb86beeaa4416f73a28a5e8d440976b7cada2b2d7b5e715b2bd849d4de32/pymdown_extensions-10.9.tar.gz", hash = "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753", size = 812128 } +sdist = { url = "https://files.pythonhosted.org/packages/f4/71/2730a20e9e3752393d78998347f8b1085ef9c417646ea9befbeef221e3c4/pymdown_extensions-10.11.2.tar.gz", hash = "sha256:bc8847ecc9e784a098efd35e20cba772bc5a1b529dfcef9dc1972db9021a1049", size = 830241 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/41/18b5dc5e97ec3ff1c2f51d372e570a9fbe231f1124dcc36dbc6b47f93058/pymdown_extensions-10.9-py3-none-any.whl", hash = "sha256:d323f7e90d83c86113ee78f3fe62fc9dee5f56b54d912660703ea1816fed5626", size = 250954 }, + { url = "https://files.pythonhosted.org/packages/c2/35/c0edf199257ef0a7d407d29cd51c4e70d1dad4370a5f44deb65a7a5475e2/pymdown_extensions-10.11.2-py3-none-any.whl", hash = "sha256:41cdde0a77290e480cf53892f5c5e50921a7ee3e5cd60ba91bf19837b33badcf", size = 259044 }, ] [[package]] @@ -944,7 +1075,7 @@ sdist = { url = "https://files.pythonhosted.org/packages/30/23/2f0a3efc4d6a32f3b [[package]] name = "pytest" -version = "8.3.2" +version = "8.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -952,9 +1083,9 @@ dependencies = [ { name = "packaging" }, { name = "pluggy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/8c/9862305bdcd6020bc7b45b1b5e7397a6caf1a33d3025b9a003b39075ffb2/pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce", size = 1439314 } +sdist = { url = "https://files.pythonhosted.org/packages/8b/6c/62bbd536103af674e227c41a8f3dcd022d591f6eed5facb5a0f31ee33bbc/pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", size = 1442487 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/f9/cf155cf32ca7d6fa3601bc4c5dd19086af4b320b706919d48a4c79081cf9/pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", size = 341802 }, + { url = "https://files.pythonhosted.org/packages/6b/77/7440a06a8ead44c7757a64362dd22df5760f9b12dc5f11b6188cd2fc27a0/pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2", size = 342341 }, ] [[package]] @@ -1069,40 +1200,55 @@ wheels = [ [[package]] name = "regex" -version = "2024.7.24" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/51/64256d0dc72816a4fe3779449627c69ec8fee5a5625fd60ba048f53b3478/regex-2024.7.24.tar.gz", hash = "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506", size = 393485 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/ec/261f8434a47685d61e59a4ef3d9ce7902af521219f3ebd2194c7adb171a6/regex-2024.7.24-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281", size = 470810 }, - { url = "https://files.pythonhosted.org/packages/f0/47/f33b1cac88841f95fff862476a9e875d9a10dae6912a675c6f13c128e5d9/regex-2024.7.24-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b", size = 282126 }, - { url = "https://files.pythonhosted.org/packages/fc/1b/256ca4e2d5041c0aa2f1dc222f04412b796346ab9ce2aa5147405a9457b4/regex-2024.7.24-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a", size = 278920 }, - { url = "https://files.pythonhosted.org/packages/91/03/4603ec057c0bafd2f6f50b0bdda4b12a0ff81022decf1de007b485c356a6/regex-2024.7.24-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73", size = 785420 }, - { url = "https://files.pythonhosted.org/packages/75/f8/13b111fab93e6273e26de2926345e5ecf6ddad1e44c4d419d7b0924f9c52/regex-2024.7.24-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2", size = 828164 }, - { url = "https://files.pythonhosted.org/packages/4a/80/bc3b9d31bd47ff578758af929af0ac1d6169b247e26fa6e87764007f3d93/regex-2024.7.24-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e", size = 812621 }, - { url = "https://files.pythonhosted.org/packages/8b/77/92d4a14530900d46dddc57b728eea65d723cc9fcfd07b96c2c141dabba84/regex-2024.7.24-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51", size = 786609 }, - { url = "https://files.pythonhosted.org/packages/35/58/06695fd8afad4c8ed0a53ec5e222156398b9fe5afd58887ab94ea68e4d16/regex-2024.7.24-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364", size = 775290 }, - { url = "https://files.pythonhosted.org/packages/1b/0f/50b97ee1fc6965744b9e943b5c0f3740792ab54792df73d984510964ef29/regex-2024.7.24-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee", size = 772849 }, - { url = "https://files.pythonhosted.org/packages/8f/64/565ff6cf241586ab7ae76bb4138c4d29bc1d1780973b457c2db30b21809a/regex-2024.7.24-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c", size = 778428 }, - { url = "https://files.pythonhosted.org/packages/e5/fe/4ceabf4382e44e1e096ac46fd5e3bca490738b24157116a48270fd542e88/regex-2024.7.24-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce", size = 849436 }, - { url = "https://files.pythonhosted.org/packages/68/23/1868e40d6b594843fd1a3498ffe75d58674edfc90d95e18dd87865b93bf2/regex-2024.7.24-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1", size = 849484 }, - { url = "https://files.pythonhosted.org/packages/f3/52/bff76de2f6e2bc05edce3abeb7e98e6309aa022fc06071100a0216fbeb50/regex-2024.7.24-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e", size = 776712 }, - { url = "https://files.pythonhosted.org/packages/f2/72/70ade7b0b5fe5c6df38fdfa2a5a8273e3ea6a10b772aa671b7e889e78bae/regex-2024.7.24-cp311-cp311-win32.whl", hash = "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c", size = 257716 }, - { url = "https://files.pythonhosted.org/packages/04/4d/80e04f4e27ab0cbc9096e2d10696da6d9c26a39b60db52670fd57614fea5/regex-2024.7.24-cp311-cp311-win_amd64.whl", hash = "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52", size = 269662 }, - { url = "https://files.pythonhosted.org/packages/0f/26/f505782f386ac0399a9237571833f187414882ab6902e2e71a1ecb506835/regex-2024.7.24-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86", size = 471748 }, - { url = "https://files.pythonhosted.org/packages/bb/1d/ea9a21beeb433dbfca31ab82867d69cb67ff8674af9fab6ebd55fa9d3387/regex-2024.7.24-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad", size = 282841 }, - { url = "https://files.pythonhosted.org/packages/9b/f2/c6182095baf0a10169c34e87133a8e73b2e816a80035669b1278e927685e/regex-2024.7.24-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9", size = 279114 }, - { url = "https://files.pythonhosted.org/packages/72/58/b5161bf890b6ca575a25685f19a4a3e3b6f4a072238814f8658123177d84/regex-2024.7.24-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289", size = 789749 }, - { url = "https://files.pythonhosted.org/packages/09/fb/5381b19b62f3a3494266be462f6a015a869cf4bfd8e14d6e7db67e2c8069/regex-2024.7.24-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9", size = 831666 }, - { url = "https://files.pythonhosted.org/packages/3d/6d/2a21c85f970f9be79357d12cf4b97f4fc6bf3bf6b843c39dabbc4e5f1181/regex-2024.7.24-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c", size = 817544 }, - { url = "https://files.pythonhosted.org/packages/f9/ae/5f23e64f6cf170614237c654f3501a912dfb8549143d4b91d1cd13dba319/regex-2024.7.24-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440", size = 790854 }, - { url = "https://files.pythonhosted.org/packages/29/0a/d04baad1bbc49cdfb4aef90c4fc875a60aaf96d35a1616f1dfe8149716bc/regex-2024.7.24-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610", size = 779242 }, - { url = "https://files.pythonhosted.org/packages/3a/27/b242a962f650c3213da4596d70e24c7c1c46e3aa0f79f2a81164291085f8/regex-2024.7.24-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5", size = 776932 }, - { url = "https://files.pythonhosted.org/packages/9c/ae/de659bdfff80ad2c0b577a43dd89dbc43870a4fc4bbf604e452196758e83/regex-2024.7.24-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799", size = 784521 }, - { url = "https://files.pythonhosted.org/packages/d4/ac/eb6a796da0bdefbf09644a7868309423b18d344cf49963a9d36c13502d46/regex-2024.7.24-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05", size = 854548 }, - { url = "https://files.pythonhosted.org/packages/56/77/fde8d825dec69e70256e0925af6c81eea9acf0a634d3d80f619d8dcd6888/regex-2024.7.24-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94", size = 853345 }, - { url = "https://files.pythonhosted.org/packages/ff/04/2b79ad0bb9bc05ab4386caa2c19aa047a66afcbdfc2640618ffc729841e4/regex-2024.7.24-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38", size = 781414 }, - { url = "https://files.pythonhosted.org/packages/bf/71/d0af58199283ada7d25b20e416f5b155f50aad99b0e791c0966ff5a1cd00/regex-2024.7.24-cp312-cp312-win32.whl", hash = "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc", size = 258125 }, - { url = "https://files.pythonhosted.org/packages/95/b3/10e875c45c60b010b66fc109b899c6fc4f05d485fe1d54abff98ce791124/regex-2024.7.24-cp312-cp312-win_amd64.whl", hash = "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908", size = 269162 }, +version = "2024.9.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/38/148df33b4dbca3bd069b963acab5e0fa1a9dbd6820f8c322d0dd6faeff96/regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd", size = 399403 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/a1/d526b7b6095a0019aa360948c143aacfeb029919c898701ce7763bbe4c15/regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df", size = 482483 }, + { url = "https://files.pythonhosted.org/packages/32/d9/bfdd153179867c275719e381e1e8e84a97bd186740456a0dcb3e7125c205/regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268", size = 287442 }, + { url = "https://files.pythonhosted.org/packages/33/c4/60f3370735135e3a8d673ddcdb2507a8560d0e759e1398d366e43d000253/regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad", size = 284561 }, + { url = "https://files.pythonhosted.org/packages/b1/51/91a5ebdff17f9ec4973cb0aa9d37635efec1c6868654bbc25d1543aca4ec/regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679", size = 791779 }, + { url = "https://files.pythonhosted.org/packages/07/4a/022c5e6f0891a90cd7eb3d664d6c58ce2aba48bff107b00013f3d6167069/regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4", size = 832605 }, + { url = "https://files.pythonhosted.org/packages/ac/1c/3793990c8c83ca04e018151ddda83b83ecc41d89964f0f17749f027fc44d/regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664", size = 818556 }, + { url = "https://files.pythonhosted.org/packages/e9/5c/8b385afbfacb853730682c57be56225f9fe275c5bf02ac1fc88edbff316d/regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50", size = 792808 }, + { url = "https://files.pythonhosted.org/packages/9b/8b/a4723a838b53c771e9240951adde6af58c829fb6a6a28f554e8131f53839/regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199", size = 781115 }, + { url = "https://files.pythonhosted.org/packages/83/5f/031a04b6017033d65b261259c09043c06f4ef2d4eac841d0649d76d69541/regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4", size = 778155 }, + { url = "https://files.pythonhosted.org/packages/fd/cd/4660756070b03ce4a66663a43f6c6e7ebc2266cc6b4c586c167917185eb4/regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd", size = 784614 }, + { url = "https://files.pythonhosted.org/packages/93/8d/65b9bea7df120a7be8337c415b6d256ba786cbc9107cebba3bf8ff09da99/regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f", size = 853744 }, + { url = "https://files.pythonhosted.org/packages/96/a7/fba1eae75eb53a704475baf11bd44b3e6ccb95b316955027eb7748f24ef8/regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96", size = 855890 }, + { url = "https://files.pythonhosted.org/packages/45/14/d864b2db80a1a3358534392373e8a281d95b28c29c87d8548aed58813910/regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1", size = 781887 }, + { url = "https://files.pythonhosted.org/packages/4d/a9/bfb29b3de3eb11dc9b412603437023b8e6c02fb4e11311863d9bf62c403a/regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9", size = 261644 }, + { url = "https://files.pythonhosted.org/packages/c7/ab/1ad2511cf6a208fde57fafe49829cab8ca018128ab0d0b48973d8218634a/regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf", size = 274033 }, + { url = "https://files.pythonhosted.org/packages/6e/92/407531450762bed778eedbde04407f68cbd75d13cee96c6f8d6903d9c6c1/regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7", size = 483590 }, + { url = "https://files.pythonhosted.org/packages/8e/a2/048acbc5ae1f615adc6cba36cc45734e679b5f1e4e58c3c77f0ed611d4e2/regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231", size = 288175 }, + { url = "https://files.pythonhosted.org/packages/8a/ea/909d8620329ab710dfaf7b4adee41242ab7c9b95ea8d838e9bfe76244259/regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d", size = 284749 }, + { url = "https://files.pythonhosted.org/packages/ca/fa/521eb683b916389b4975337873e66954e0f6d8f91bd5774164a57b503185/regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64", size = 795181 }, + { url = "https://files.pythonhosted.org/packages/28/db/63047feddc3280cc242f9c74f7aeddc6ee662b1835f00046f57d5630c827/regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42", size = 835842 }, + { url = "https://files.pythonhosted.org/packages/e3/94/86adc259ff8ec26edf35fcca7e334566c1805c7493b192cb09679f9c3dee/regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766", size = 823533 }, + { url = "https://files.pythonhosted.org/packages/29/52/84662b6636061277cb857f658518aa7db6672bc6d1a3f503ccd5aefc581e/regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a", size = 797037 }, + { url = "https://files.pythonhosted.org/packages/c3/2a/cd4675dd987e4a7505f0364a958bc41f3b84942de9efaad0ef9a2646681c/regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9", size = 784106 }, + { url = "https://files.pythonhosted.org/packages/6f/75/3ea7ec29de0bbf42f21f812f48781d41e627d57a634f3f23947c9a46e303/regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d", size = 782468 }, + { url = "https://files.pythonhosted.org/packages/d3/67/15519d69b52c252b270e679cb578e22e0c02b8dd4e361f2b04efcc7f2335/regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822", size = 790324 }, + { url = "https://files.pythonhosted.org/packages/9c/71/eff77d3fe7ba08ab0672920059ec30d63fa7e41aa0fb61c562726e9bd721/regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0", size = 860214 }, + { url = "https://files.pythonhosted.org/packages/81/11/e1bdf84a72372e56f1ea4b833dd583b822a23138a616ace7ab57a0e11556/regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a", size = 859420 }, + { url = "https://files.pythonhosted.org/packages/ea/75/9753e9dcebfa7c3645563ef5c8a58f3a47e799c872165f37c55737dadd3e/regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a", size = 787333 }, + { url = "https://files.pythonhosted.org/packages/bc/4e/ba1cbca93141f7416624b3ae63573e785d4bc1834c8be44a8f0747919eca/regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776", size = 262058 }, + { url = "https://files.pythonhosted.org/packages/6e/16/efc5f194778bf43e5888209e5cec4b258005d37c613b67ae137df3b89c53/regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009", size = 273526 }, + { url = "https://files.pythonhosted.org/packages/93/0a/d1c6b9af1ff1e36832fe38d74d5c5bab913f2bdcbbd6bc0e7f3ce8b2f577/regex-2024.9.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784", size = 483376 }, + { url = "https://files.pythonhosted.org/packages/a4/42/5910a050c105d7f750a72dcb49c30220c3ae4e2654e54aaaa0e9bc0584cb/regex-2024.9.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36", size = 288112 }, + { url = "https://files.pythonhosted.org/packages/8d/56/0c262aff0e9224fa7ffce47b5458d373f4d3e3ff84e99b5ff0cb15e0b5b2/regex-2024.9.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92", size = 284608 }, + { url = "https://files.pythonhosted.org/packages/b9/54/9fe8f9aec5007bbbbce28ba3d2e3eaca425f95387b7d1e84f0d137d25237/regex-2024.9.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86", size = 795337 }, + { url = "https://files.pythonhosted.org/packages/b2/e7/6b2f642c3cded271c4f16cc4daa7231be544d30fe2b168e0223724b49a61/regex-2024.9.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85", size = 835848 }, + { url = "https://files.pythonhosted.org/packages/cd/9e/187363bdf5d8c0e4662117b92aa32bf52f8f09620ae93abc7537d96d3311/regex-2024.9.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963", size = 823503 }, + { url = "https://files.pythonhosted.org/packages/f8/10/601303b8ee93589f879664b0cfd3127949ff32b17f9b6c490fb201106c4d/regex-2024.9.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6", size = 797049 }, + { url = "https://files.pythonhosted.org/packages/ef/1c/ea200f61ce9f341763f2717ab4daebe4422d83e9fd4ac5e33435fd3a148d/regex-2024.9.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802", size = 784144 }, + { url = "https://files.pythonhosted.org/packages/d8/5c/d2429be49ef3292def7688401d3deb11702c13dcaecdc71d2b407421275b/regex-2024.9.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29", size = 782483 }, + { url = "https://files.pythonhosted.org/packages/12/d9/cbc30f2ff7164f3b26a7760f87c54bf8b2faed286f60efd80350a51c5b99/regex-2024.9.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8", size = 790320 }, + { url = "https://files.pythonhosted.org/packages/19/1d/43ed03a236313639da5a45e61bc553c8d41e925bcf29b0f8ecff0c2c3f25/regex-2024.9.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84", size = 860435 }, + { url = "https://files.pythonhosted.org/packages/34/4f/5d04da61c7c56e785058a46349f7285ae3ebc0726c6ea7c5c70600a52233/regex-2024.9.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554", size = 859571 }, + { url = "https://files.pythonhosted.org/packages/12/7f/8398c8155a3c70703a8e91c29532558186558e1aea44144b382faa2a6f7a/regex-2024.9.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8", size = 787398 }, + { url = "https://files.pythonhosted.org/packages/58/3a/f5903977647a9a7e46d5535e9e96c194304aeeca7501240509bde2f9e17f/regex-2024.9.11-cp313-cp313-win32.whl", hash = "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8", size = 262035 }, + { url = "https://files.pythonhosted.org/packages/ff/80/51ba3a4b7482f6011095b3a036e07374f64de180b7d870b704ed22509002/regex-2024.9.11-cp313-cp313-win_amd64.whl", hash = "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f", size = 273510 }, ] [[package]] @@ -1162,14 +1308,14 @@ wheels = [ [[package]] name = "syrupy" -version = "4.7.1" +version = "4.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/db/ac/105c151335bf71ddf7f3c77118438cad77d4cf092559a6b429bca1bb436b/syrupy-4.7.1.tar.gz", hash = "sha256:f9d4485f3f27d0e5df6ed299cac6fa32eb40a441915d988e82be5a4bdda335c8", size = 49117 } +sdist = { url = "https://files.pythonhosted.org/packages/67/81/f46d234fa4ca0edcdeed973bab9acd8f8ac186537cdc850e9e84a00f61a0/syrupy-4.7.2.tar.gz", hash = "sha256:ea45e099f242de1bb53018c238f408a5bb6c82007bc687aefcbeaa0e1c2e935a", size = 49320 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/0d/af9adb7a0e4420dcf249653f589cd27152fa6daab5cfd84e6d665dcd7df5/syrupy-4.7.1-py3-none-any.whl", hash = "sha256:be002267a512a4bedddfae2e026c93df1ea928ae10baadc09640516923376d41", size = 49135 }, + { url = "https://files.pythonhosted.org/packages/b9/75/57b629fdd256efc58fb045618d603ce0b0f5fcc477f34b758e34423efb99/syrupy-4.7.2-py3-none-any.whl", hash = "sha256:eae7ba6be5aed190237caa93be288e97ca1eec5ca58760e4818972a10c4acc64", size = 49234 }, ] [[package]] @@ -1195,40 +1341,57 @@ syntax = [ [[package]] name = "textual-autocomplete" -version = "3.0.0a9" +version = "3.0.0a10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "textual" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ed/96/c0d620cf8642648608e0618251886b9a333b536d43ce8c6766a983732a8e/textual_autocomplete-3.0.0a9.tar.gz", hash = "sha256:b5f3e3148b793f172afe643a5b2188c5ec14fcb42b639b98b23131c27e52de85", size = 15981 } +sdist = { url = "https://files.pythonhosted.org/packages/29/94/3b974997845531bb58bf7e036c74800c06c8b7f9561105d0f4559841590b/textual_autocomplete-3.0.0a10.tar.gz", hash = "sha256:ea9cb40a8b5de0e691cd360d2912af30c02bfb17fc963061cf8350828b67cb64", size = 16771 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/41/b836ff57092fb1fd2300c1e8dce6b9f77644d959f133446fa69778ef7aa8/textual_autocomplete-3.0.0a9-py3-none-any.whl", hash = "sha256:eccba28061bf6507fe5b01042cb6f26c170729384b226628fb0258fe3402787c", size = 16704 }, + { url = "https://files.pythonhosted.org/packages/d9/40/4dcc1ed7581ffe98023cfeb0e39d7b0c6abdf876a3c5d8f0a02b9118123d/textual_autocomplete-3.0.0a10-py3-none-any.whl", hash = "sha256:04646775f4fbd37d20da7772e75937a290f59bb52c7d491023d15aabe009138b", size = 17379 }, ] [[package]] name = "textual-dev" -version = "1.5.1" +version = "1.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, { name = "click" }, { name = "msgpack" }, { name = "textual" }, + { name = "textual-serve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/ff/d328747676a6a00e8b031c1a537deca1ba2aea3d9f8ea1e0e3ab9e8e8786/textual_dev-1.5.1.tar.gz", hash = "sha256:e0366ab6f42c128d7daa37a7c418e61fe7aa83731983da990808e4bf2de922a1", size = 25219 } +sdist = { url = "https://files.pythonhosted.org/packages/ff/85/93a28974fd75aa941b0aac415fc430bf693a91b219a25dc9447f1bd83338/textual_dev-1.6.1.tar.gz", hash = "sha256:0d0d4523a09566bae56eb9ebc4fcbb09069d0f335448e6b9b10dd2d805606bd8", size = 25624 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/dc/ac0e741e5b089b6bb7f128bfda62aced7946221c498b51fec6d138df4f8e/textual_dev-1.5.1-py3-none-any.whl", hash = "sha256:bb37dd769ae6b67e1422aa97f6d6ef952e0a6d2aafe08327449e8bdd70474776", size = 26414 }, + { url = "https://files.pythonhosted.org/packages/6b/aa/c89ce57be40847eebab57184a7223735ac56ee2063400c363a74d5e7a18e/textual_dev-1.6.1-py3-none-any.whl", hash = "sha256:de93279da6dd0772be88a83e494be1bc895df0a0c3e47bcd48fa1acb1a83a34b", size = 26853 }, +] + +[[package]] +name = "textual-serve" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "aiohttp-jinja2" }, + { name = "jinja2" }, + { name = "rich" }, + { name = "textual" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/6c/57248070f525ea8a9a02d9f58dc2747c609b615b0bda1306aaeb80a233bd/textual_serve-1.1.1.tar.gz", hash = "sha256:71c662472c462e5e368defc660ee6e8eae3bfda88ca40c050c55474686eb0c54", size = 445957 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/a9/01d35770fde8d889e1fe28b726188cf28801e57afd369c614cd2bc100ee4/textual_serve-1.1.1-py3-none-any.whl", hash = "sha256:568782f1c0e60e3f7039d9121e1cb5c2f4ca1aaf6d6bd7aeb833d5763a534cb2", size = 445034 }, ] [[package]] name = "tomli" -version = "2.0.1" +version = "2.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164 } +sdist = { url = "https://files.pythonhosted.org/packages/35/b9/de2a5c0144d7d75a57ff355c0c24054f965b2dc3036456ae03a51ea6264b/tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed", size = 16096 } wheels = [ - { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757 }, + { url = "https://files.pythonhosted.org/packages/cf/db/ce8eda256fa131af12e0a76d481711abe4681b6923c27efb9a255c9e4594/tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38", size = 13237 }, ] [[package]] @@ -1319,38 +1482,38 @@ wheels = [ [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/6d/fa469ae21497ddc8bc93e5877702dca7cb8f911e337aca7452b5724f1bb6/urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168", size = 292266 } +sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/1c/89ffc63a9605b583d5df2be791a27bc1a42b7c32bab68d3c8f2f73a98cd4/urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", size = 121444 }, + { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, ] [[package]] name = "watchdog" -version = "4.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4f/38/764baaa25eb5e35c9a043d4c4588f9836edfe52a708950f4b6d5f714fd42/watchdog-4.0.2.tar.gz", hash = "sha256:b4dfbb6c49221be4535623ea4474a4d6ee0a9cef4a80b20c28db4d858b64e270", size = 126587 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/de/78/027ad372d62f97642349a16015394a7680530460b1c70c368c506cb60c09/watchdog-4.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c7d4bf585ad501c5f6c980e7be9c4f15604c7cc150e942d82083b31a7548930", size = 100256 }, - { url = "https://files.pythonhosted.org/packages/59/a9/412b808568c1814d693b4ff1cec0055dc791780b9dc947807978fab86bc1/watchdog-4.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:914285126ad0b6eb2258bbbcb7b288d9dfd655ae88fa28945be05a7b475a800b", size = 92252 }, - { url = "https://files.pythonhosted.org/packages/04/57/179d76076cff264982bc335dd4c7da6d636bd3e9860bbc896a665c3447b6/watchdog-4.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:984306dc4720da5498b16fc037b36ac443816125a3705dfde4fd90652d8028ef", size = 92888 }, - { url = "https://files.pythonhosted.org/packages/92/f5/ea22b095340545faea37ad9a42353b265ca751f543da3fb43f5d00cdcd21/watchdog-4.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1cdcfd8142f604630deef34722d695fb455d04ab7cfe9963055df1fc69e6727a", size = 100342 }, - { url = "https://files.pythonhosted.org/packages/cb/d2/8ce97dff5e465db1222951434e3115189ae54a9863aef99c6987890cc9ef/watchdog-4.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d7ab624ff2f663f98cd03c8b7eedc09375a911794dfea6bf2a359fcc266bff29", size = 92306 }, - { url = "https://files.pythonhosted.org/packages/49/c4/1aeba2c31b25f79b03b15918155bc8c0b08101054fc727900f1a577d0d54/watchdog-4.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132937547a716027bd5714383dfc40dc66c26769f1ce8a72a859d6a48f371f3a", size = 92915 }, - { url = "https://files.pythonhosted.org/packages/79/63/eb8994a182672c042d85a33507475c50c2ee930577524dd97aea05251527/watchdog-4.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cd67c7df93eb58f360c43802acc945fa8da70c675b6fa37a241e17ca698ca49b", size = 100343 }, - { url = "https://files.pythonhosted.org/packages/ce/82/027c0c65c2245769580605bcd20a1dc7dfd6c6683c8c4e2ef43920e38d27/watchdog-4.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcfd02377be80ef3b6bc4ce481ef3959640458d6feaae0bd43dd90a43da90a7d", size = 92313 }, - { url = "https://files.pythonhosted.org/packages/2a/89/ad4715cbbd3440cb0d336b78970aba243a33a24b1a79d66f8d16b4590d6a/watchdog-4.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:980b71510f59c884d684b3663d46e7a14b457c9611c481e5cef08f4dd022eed7", size = 92919 }, - { url = "https://files.pythonhosted.org/packages/8a/b1/25acf6767af6f7e44e0086309825bd8c098e301eed5868dc5350642124b9/watchdog-4.0.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:936acba76d636f70db8f3c66e76aa6cb5136a936fc2a5088b9ce1c7a3508fc83", size = 82947 }, - { url = "https://files.pythonhosted.org/packages/e8/90/aebac95d6f954bd4901f5d46dcd83d68e682bfd21798fd125a95ae1c9dbf/watchdog-4.0.2-py3-none-manylinux2014_armv7l.whl", hash = "sha256:e252f8ca942a870f38cf785aef420285431311652d871409a64e2a0a52a2174c", size = 82942 }, - { url = "https://files.pythonhosted.org/packages/15/3a/a4bd8f3b9381824995787488b9282aff1ed4667e1110f31a87b871ea851c/watchdog-4.0.2-py3-none-manylinux2014_i686.whl", hash = "sha256:0e83619a2d5d436a7e58a1aea957a3c1ccbf9782c43c0b4fed80580e5e4acd1a", size = 82947 }, - { url = "https://files.pythonhosted.org/packages/09/cc/238998fc08e292a4a18a852ed8274159019ee7a66be14441325bcd811dfd/watchdog-4.0.2-py3-none-manylinux2014_ppc64.whl", hash = "sha256:88456d65f207b39f1981bf772e473799fcdc10801062c36fd5ad9f9d1d463a73", size = 82946 }, - { url = "https://files.pythonhosted.org/packages/80/f1/d4b915160c9d677174aa5fae4537ae1f5acb23b3745ab0873071ef671f0a/watchdog-4.0.2-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:32be97f3b75693a93c683787a87a0dc8db98bb84701539954eef991fb35f5fbc", size = 82947 }, - { url = "https://files.pythonhosted.org/packages/db/02/56ebe2cf33b352fe3309588eb03f020d4d1c061563d9858a9216ba004259/watchdog-4.0.2-py3-none-manylinux2014_s390x.whl", hash = "sha256:c82253cfc9be68e3e49282831afad2c1f6593af80c0daf1287f6a92657986757", size = 82944 }, - { url = "https://files.pythonhosted.org/packages/01/d2/c8931ff840a7e5bd5dcb93f2bb2a1fd18faf8312e9f7f53ff1cf76ecc8ed/watchdog-4.0.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c0b14488bd336c5b1845cee83d3e631a1f8b4e9c5091ec539406e4a324f882d8", size = 82947 }, - { url = "https://files.pythonhosted.org/packages/d0/d8/cdb0c21a4a988669d7c210c75c6a2c9a0e16a3b08d9f7e633df0d9a16ad8/watchdog-4.0.2-py3-none-win32.whl", hash = "sha256:0d8a7e523ef03757a5aa29f591437d64d0d894635f8a50f370fe37f913ce4e19", size = 82935 }, - { url = "https://files.pythonhosted.org/packages/99/2e/b69dfaae7a83ea64ce36538cc103a3065e12c447963797793d5c0a1d5130/watchdog-4.0.2-py3-none-win_amd64.whl", hash = "sha256:c344453ef3bf875a535b0488e3ad28e341adbd5a9ffb0f7d62cefacc8824ef2b", size = 82934 }, - { url = "https://files.pythonhosted.org/packages/b0/0b/43b96a9ecdd65ff5545b1b13b687ca486da5c6249475b1a45f24d63a1858/watchdog-4.0.2-py3-none-win_ia64.whl", hash = "sha256:baececaa8edff42cd16558a639a9b0ddf425f93d892e8392a56bf904f5eff22c", size = 82933 }, +version = "5.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/48/a86139aaeab2db0a2482676f64798d8ac4d2dbb457523f50ab37bf02ce2c/watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176", size = 129556 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/34/946f08602f8b8e6af45bc725e4a8013975a34883ab5570bd0d827a4c9829/watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818", size = 96650 }, + { url = "https://files.pythonhosted.org/packages/96/2b/b84e35d49e8b0bad77e5d086fc1e2c6c833bbfe74d53144cfe8b26117eff/watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490", size = 88653 }, + { url = "https://files.pythonhosted.org/packages/d5/3f/41b5d77c10f450b79921c17b7d0b416616048867bfe63acaa072a619a0cb/watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e", size = 89286 }, + { url = "https://files.pythonhosted.org/packages/1c/9b/8b206a928c188fdeb7b12e1c795199534cd44bdef223b8470129016009dd/watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8", size = 96739 }, + { url = "https://files.pythonhosted.org/packages/e1/26/129ca9cd0f8016672f37000010c2fedc0b86816e894ebdc0af9bb04a6439/watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926", size = 88708 }, + { url = "https://files.pythonhosted.org/packages/8f/b3/5e10ec32f0c429cdb55b1369066d6e83faf9985b3a53a4e37bb5c5e29aa0/watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e", size = 89309 }, + { url = "https://files.pythonhosted.org/packages/54/c4/49af4ab00bcfb688e9962eace2edda07a2cf89b9699ea536da48e8585cff/watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7", size = 96740 }, + { url = "https://files.pythonhosted.org/packages/96/a4/b24de77cc9ae424c1687c9d4fb15aa560d7d7b28ba559aca72f781d0202b/watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906", size = 88711 }, + { url = "https://files.pythonhosted.org/packages/a4/71/3f2e9fe8403386b99d788868955b3a790f7a09721501a7e1eb58f514ffaa/watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1", size = 89319 }, + { url = "https://files.pythonhosted.org/packages/60/33/7cb71c9df9a77b6927ee5f48d25e1de5562ce0fa7e0c56dcf2b0472e64a2/watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91", size = 79335 }, + { url = "https://files.pythonhosted.org/packages/f6/91/320bc1496cf951a3cf93a7ffd18a581f0792c304be963d943e0e608c2919/watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c", size = 79334 }, + { url = "https://files.pythonhosted.org/packages/8b/2c/567c5e042ed667d3544c43d48a65cf853450a2d2a9089d9523a65f195e94/watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c", size = 79333 }, + { url = "https://files.pythonhosted.org/packages/c3/f0/64059fe162ef3274662e67bbdea6c45b3cd53e846d5bd1365fcdc3dc1d15/watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221", size = 79334 }, + { url = "https://files.pythonhosted.org/packages/f6/d9/19b7d02965be2801e2d0f6f4bde23e4ae172620071b65430fa0c2f8441ac/watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05", size = 79333 }, + { url = "https://files.pythonhosted.org/packages/cb/a1/5393ac6d0b095d3a44946b09258e9b5f22cb2fb67bcfa419dd868478826c/watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97", size = 79332 }, + { url = "https://files.pythonhosted.org/packages/a0/58/edec25190b6403caf4426dd418234f2358a106634b7d6aa4aec6939b104f/watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7", size = 79334 }, + { url = "https://files.pythonhosted.org/packages/97/69/cfb2d17ba8aabc73be2e2d03c8c319b1f32053a02c4b571852983aa24ff2/watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49", size = 79320 }, + { url = "https://files.pythonhosted.org/packages/91/b4/2b5b59358dadfa2c8676322f955b6c22cde4937602f40490e2f7403e548e/watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9", size = 79325 }, + { url = "https://files.pythonhosted.org/packages/38/b8/0aa69337651b3005f161f7f494e59188a1d8d94171666900d26d29d10f69/watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45", size = 79324 }, ] [[package]] @@ -1413,43 +1576,59 @@ wheels = [ [[package]] name = "yarl" -version = "1.9.4" +version = "1.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e0/ad/bedcdccbcbf91363fd425a948994f3340924145c2bc8ccb296f4a1e52c28/yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf", size = 141869 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/65/4c7f3676209a569405c9f0f492df2bc3a387c253f5d906e36944fdd12277/yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099", size = 132836 }, - { url = "https://files.pythonhosted.org/packages/3b/c5/81e3dbf5271ab1510860d2ae7a704ef43f93f7cb9326bf7ebb1949a7260b/yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c", size = 83215 }, - { url = "https://files.pythonhosted.org/packages/20/3d/7dabf580dfc0b588e48830486b488858122b10a61f33325e0d7cf1d6180b/yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0", size = 81237 }, - { url = "https://files.pythonhosted.org/packages/38/45/7c669999f5d350f4f8f74369b94e0f6705918eee18e38610bfe44af93d4f/yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525", size = 324181 }, - { url = "https://files.pythonhosted.org/packages/50/49/aa04effe2876cced8867bf9d89b620acf02b733c62adfe22a8218c35d70b/yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8", size = 339412 }, - { url = "https://files.pythonhosted.org/packages/7d/95/4310771fb9c71599d8466f43347ac18fafd501621e65b93f4f4f16899b1d/yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9", size = 337973 }, - { url = "https://files.pythonhosted.org/packages/9f/ea/94ad7d8299df89844e666e4aa8a0e9b88e02416cd6a7dd97969e9eae5212/yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42", size = 328126 }, - { url = "https://files.pythonhosted.org/packages/6d/be/9d4885e2725f5860833547c9e4934b6e0f44a355b24ffc37957264761e3e/yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe", size = 316677 }, - { url = "https://files.pythonhosted.org/packages/4a/70/5c744d67cad3d093e233cb02f37f2830cb89abfcbb7ad5b5af00ff21d14d/yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce", size = 324243 }, - { url = "https://files.pythonhosted.org/packages/c2/80/8b38d8fed958ac37afb8b81a54bf4f767b107e2c2004dab165edb58fc51b/yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9", size = 318099 }, - { url = "https://files.pythonhosted.org/packages/59/50/715bbc7bda65291f9295e757f67854206f4d8be9746d39187724919ac14d/yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572", size = 334924 }, - { url = "https://files.pythonhosted.org/packages/a8/af/ca9962488027576d7162878a1864cbb1275d298af986ce96bdfd4807d7b2/yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958", size = 335060 }, - { url = "https://files.pythonhosted.org/packages/28/c7/249a3a903d500ca7369eb542e2847a14f12f249638dcc10371db50cd17ff/yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98", size = 326689 }, - { url = "https://files.pythonhosted.org/packages/ec/0c/f02dd0b875a7a460f95dc7cf18983ed43c693283d6ab92e0ad71b9e0de8f/yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31", size = 70407 }, - { url = "https://files.pythonhosted.org/packages/27/41/945ae9a80590e4fb0be166863c6e63d75e4b35789fa3a61ff1dbdcdc220f/yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1", size = 76719 }, - { url = "https://files.pythonhosted.org/packages/7b/cd/a921122610dedfed94e494af18e85aae23e93274c00ca464cfc591c8f4fb/yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81", size = 129561 }, - { url = "https://files.pythonhosted.org/packages/7c/a0/887c93020c788f249c24eaab288c46e5fed4d2846080eaf28ed3afc36e8d/yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142", size = 81595 }, - { url = "https://files.pythonhosted.org/packages/54/99/ed3c92c38f421ba6e36caf6aa91c34118771d252dce800118fa2f44d7962/yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074", size = 79400 }, - { url = "https://files.pythonhosted.org/packages/ea/45/65801be625ef939acc8b714cf86d4a198c0646e80dc8970359d080c47204/yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129", size = 317397 }, - { url = "https://files.pythonhosted.org/packages/06/91/9696601a8ba674c8f0c15035cc9e94ca31f541330364adcfd5a399f598bf/yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2", size = 327246 }, - { url = "https://files.pythonhosted.org/packages/da/3e/bf25177b3618889bf067aacf01ef54e910cd569d14e2f84f5e7bec23bb82/yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78", size = 327321 }, - { url = "https://files.pythonhosted.org/packages/28/1c/bdb3411467b805737dd2720b85fd082e49f59bf0cc12dc1dfcc80ab3d274/yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4", size = 322424 }, - { url = "https://files.pythonhosted.org/packages/41/e9/53bc89f039df2824a524a2aa03ee0bfb8f0585b08949e7521f5eab607085/yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0", size = 310868 }, - { url = "https://files.pythonhosted.org/packages/79/cd/a78c3b0304a4a970b5ae3993f4f5f649443bc8bfa5622f244aed44c810ed/yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51", size = 323452 }, - { url = "https://files.pythonhosted.org/packages/2e/5e/1c78eb05ae0efae08498fd7ab939435a29f12c7f161732e7fe327e5b8ca1/yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff", size = 313554 }, - { url = "https://files.pythonhosted.org/packages/04/e0/0029563a8434472697aebb269fdd2ffc8a19e3840add1d5fa169ec7c56e3/yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7", size = 331029 }, - { url = "https://files.pythonhosted.org/packages/de/1b/7e6b1ad42ccc0ed059066a7ae2b6fd4bce67795d109a99ccce52e9824e96/yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc", size = 333839 }, - { url = "https://files.pythonhosted.org/packages/85/8a/c364d6e2eeb4e128a5ee9a346fc3a09aa76739c0c4e2a7305989b54f174b/yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10", size = 328251 }, - { url = "https://files.pythonhosted.org/packages/ec/9d/0da94b33b9fb89041e10f95a14a55b0fef36c60b6a1d5ff85a0c2ecb1a97/yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7", size = 70195 }, - { url = "https://files.pythonhosted.org/packages/c5/f4/2fdc5a11503bc61818243653d836061c9ce0370e2dd9ac5917258a007675/yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984", size = 76397 }, - { url = "https://files.pythonhosted.org/packages/4d/05/4d79198ae568a92159de0f89e710a8d19e3fa267b719a236582eee921f4a/yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad", size = 31638 }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/fe/2ca2e5ef45952f3e8adb95659821a4e9169d8bbafab97eb662602ee12834/yarl-1.14.0.tar.gz", hash = "sha256:88c7d9d58aab0724b979ab5617330acb1c7030b79379c8138c1c8c94e121d1b3", size = 166127 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/aa/64fcae3d4a081e4ee07902e9e9a3b597c2577283bf6c5b59c06ef0829d90/yarl-1.14.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:07f9eaf57719d6721ab15805d85f4b01a5b509a0868d7320134371bcb652152d", size = 135761 }, + { url = "https://files.pythonhosted.org/packages/93/a0/5537a1da2c0ec8e11006efa0d133cdaded5ebb94ca71e87e3564b59f6c7f/yarl-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c14b504a74e58e2deb0378b3eca10f3d076635c100f45b113c18c770b4a47a50", size = 87888 }, + { url = "https://files.pythonhosted.org/packages/e3/25/1d12bec8ebdc8287a3464f506ded23b30ad75a5fea3ba49526e8b473057f/yarl-1.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16a682a127930f3fc4e42583becca6049e1d7214bcad23520c590edd741d2114", size = 85883 }, + { url = "https://files.pythonhosted.org/packages/75/85/01c2eb9a6ed755e073ef7d455151edf0ddd89618fca7d653894f7580b538/yarl-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73bedd2be05f48af19f0f2e9e1353921ce0c83f4a1c9e8556ecdcf1f1eae4892", size = 333347 }, + { url = "https://files.pythonhosted.org/packages/38/c7/6c3634ef216f01f928d7eec7b7de5bde56658292c8cbdcd29cc28d830f4d/yarl-1.14.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3ab950f8814f3b7b5e3eebc117986f817ec933676f68f0a6c5b2137dd7c9c69", size = 346644 }, + { url = "https://files.pythonhosted.org/packages/f4/ce/d1b1c441e41c652ce8081299db4f9b856f25a04b9c1885b3ba2e6edd3102/yarl-1.14.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b693c63e7e64b524f54aa4888403c680342d1ad0d97be1707c531584d6aeeb4f", size = 344078 }, + { url = "https://files.pythonhosted.org/packages/f0/ec/520686b83b51127792ca507d67ae1090c919c8cb8388c78d1e7c63c98a4a/yarl-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85cb3e40eaa98489f1e2e8b29f5ad02ee1ee40d6ce6b88d50cf0f205de1d9d2c", size = 336398 }, + { url = "https://files.pythonhosted.org/packages/30/4d/e842066d3336203299a3dc1730f2d062061e7b8a4497f4b6977d9076d263/yarl-1.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f24f08b6c9b9818fd80612c97857d28f9779f0d1211653ece9844fc7b414df2", size = 325519 }, + { url = "https://files.pythonhosted.org/packages/46/c7/83b9c0e5717ddd99b203dbb61c56450f475ab4a7d4d6b61b4af0a03c54d9/yarl-1.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:29a84a46ec3ebae7a1c024c055612b11e9363a8a23238b3e905552d77a2bc51b", size = 335487 }, + { url = "https://files.pythonhosted.org/packages/5e/58/2c5f0c840ab3bb364ebe5a6233bfe77ed9fcef6b34c19f3809dd15dae972/yarl-1.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5cd5dad8366e0168e0fd23d10705a603790484a6dbb9eb272b33673b8f2cce72", size = 334259 }, + { url = "https://files.pythonhosted.org/packages/6a/6b/95d7a85b5a20d90ffd42a174ff52772f6d046d60b85e4cd506e0baa58341/yarl-1.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a152751af7ef7b5d5fa6d215756e508dd05eb07d0cf2ba51f3e740076aa74373", size = 355310 }, + { url = "https://files.pythonhosted.org/packages/77/14/dd4cc5fe69b8d0708f3c43a2b8c8cca5364f2205e220908ba79be202f61c/yarl-1.14.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3d569f877ed9a708e4c71a2d13d2940cb0791da309f70bd970ac1a5c088a0a92", size = 356970 }, + { url = "https://files.pythonhosted.org/packages/1a/5e/aa5c615abbc6366c787f7abf5af2ffefd5ebe1ffc381850065624e5072fe/yarl-1.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6a615cad11ec3428020fb3c5a88d85ce1b5c69fd66e9fcb91a7daa5e855325dd", size = 344806 }, + { url = "https://files.pythonhosted.org/packages/f3/10/7b9d14b5165d7f3a7b6f474cafab6993fe7a76a908a7f02d34099e915c74/yarl-1.14.0-cp311-cp311-win32.whl", hash = "sha256:bab03192091681d54e8225c53f270b0517637915d9297028409a2a5114ff4634", size = 77527 }, + { url = "https://files.pythonhosted.org/packages/ae/bb/277d3d6d44882614cbbe108474d33c0d0ffe1ea6760e710b4237147840a2/yarl-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:985623575e5c4ea763056ffe0e2d63836f771a8c294b3de06d09480538316b13", size = 83765 }, + { url = "https://files.pythonhosted.org/packages/9a/3e/8c8bcb19d6a61a7e91cf9209e2c7349572125496e4d4de205dcad5b11753/yarl-1.14.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fc2c80bc87fba076e6cbb926216c27fba274dae7100a7b9a0983b53132dd99f2", size = 136002 }, + { url = "https://files.pythonhosted.org/packages/34/07/23fe08dfc56651ec1d77643b4df5ad41d4a1fc4f24fd066b182c660620f9/yarl-1.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:55c144d363ad4626ca744556c049c94e2b95096041ac87098bb363dcc8635e8d", size = 88223 }, + { url = "https://files.pythonhosted.org/packages/f2/dc/daa1b58bb858f3ce32ca9aaeb6011d7535af01d5c0f5e6b52aa698c608e3/yarl-1.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b03384eed107dbeb5f625a99dc3a7de8be04fc8480c9ad42fccbc73434170b20", size = 85967 }, + { url = "https://files.pythonhosted.org/packages/6e/05/7461a7005bd2e969746a3f5218b876a414e4b2d9929b797afd157cd27c29/yarl-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f72a0d746d38cb299b79ce3d4d60ba0892c84bbc905d0d49c13df5bace1b65f8", size = 325031 }, + { url = "https://files.pythonhosted.org/packages/15/c2/54a710b97e14f99d36f82e574c8749b93ad881df120ed791fdcd1f2e1989/yarl-1.14.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8648180b34faaea4aa5b5ca7e871d9eb1277033fa439693855cf0ea9195f85f1", size = 334314 }, + { url = "https://files.pythonhosted.org/packages/60/24/6015e5a365ef6cab2d00058895cea37fe796936f04266de83b434f9a9a2e/yarl-1.14.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9557c9322aaa33174d285b0c1961fb32499d65ad1866155b7845edc876c3c835", size = 333516 }, + { url = "https://files.pythonhosted.org/packages/3d/4d/9a369945088ac7141dc9ca2fae6a10bd205f0ea8a925996ec465d3afddcd/yarl-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f50eb3837012a937a2b649ec872b66ba9541ad9d6f103ddcafb8231cfcafd22", size = 329437 }, + { url = "https://files.pythonhosted.org/packages/b1/38/a71b7a7a8a95d3727075472ab4b88e2d0f3223b649bcb233f6022c42593d/yarl-1.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8892fa575ac9b1b25fae7b221bc4792a273877b9b56a99ee2d8d03eeb3dbb1d2", size = 316742 }, + { url = "https://files.pythonhosted.org/packages/02/e7/b3baf612d964b4abd492594a51e75ba5cd08243a834cbc21e1013c8ac229/yarl-1.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6a2c5c5bb2556dfbfffffc2bcfb9c235fd2b566d5006dfb2a37afc7e3278a07", size = 330168 }, + { url = "https://files.pythonhosted.org/packages/1a/a0/896eb6007cc54347f4097e8c2f31e3907de262ced9c3f56866d8dd79a8ff/yarl-1.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ab3abc0b78a5dfaa4795a6afbe7b282b6aa88d81cf8c1bb5e394993d7cae3457", size = 331898 }, + { url = "https://files.pythonhosted.org/packages/1a/73/94ee96a0e8518c7efee84e745567770371add4af65466c38d3646df86f1f/yarl-1.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:47eede5d11d669ab3759b63afb70d28d5328c14744b8edba3323e27dc52d298d", size = 343316 }, + { url = "https://files.pythonhosted.org/packages/68/6e/4cf1b32b3605fa4ce263ea338852e89e9959affaffb38eb1a7057d0a95f1/yarl-1.14.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fe4d2536c827f508348d7b40c08767e8c7071614250927233bf0c92170451c0a", size = 351596 }, + { url = "https://files.pythonhosted.org/packages/16/e7/1ec09b0977e3a4a0a80e319aa30359bd4f8beb543527d8ddf9a2e799541e/yarl-1.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0fd7b941dd1b00b5f0acb97455fea2c4b7aac2dd31ea43fb9d155e9bc7b78664", size = 343016 }, + { url = "https://files.pythonhosted.org/packages/de/d0/a2502a37555251c7e10df51eb425f1892f3b2acb6fa598348b96f74f3566/yarl-1.14.0-cp312-cp312-win32.whl", hash = "sha256:99ff3744f5fe48288be6bc402533b38e89749623a43208e1d57091fc96b783b9", size = 77322 }, + { url = "https://files.pythonhosted.org/packages/c0/1f/201f46e02dd074ff36ce7cd764bb8241a19f94ba88adfd6d410cededca13/yarl-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:1ca3894e9e9f72da93544f64988d9c052254a338a9f855165f37f51edb6591de", size = 83589 }, + { url = "https://files.pythonhosted.org/packages/f0/cf/ade2a0f0acdbfb7ca1843045a8d1691edcde4caf2dc8995c4b6dd1c6968c/yarl-1.14.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d02d700705d67e09e1f57681f758f0b9d4412eeb70b2eb8d96ca6200b486db3", size = 134274 }, + { url = "https://files.pythonhosted.org/packages/76/c8/a9e17ac8d81bcd1dc9eca197b25c46b10317092e92ac772094ab3edf57ac/yarl-1.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:30600ba5db60f7c0820ef38a2568bb7379e1418ecc947a0f76fd8b2ff4257a97", size = 87396 }, + { url = "https://files.pythonhosted.org/packages/3f/a8/ab76e6ede9fdb5087df39e7b1c92d08eb6e58e7c4a0a3b2b6112a74cb4af/yarl-1.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e85d86527baebb41a214cc3b45c17177177d900a2ad5783dbe6f291642d4906f", size = 85240 }, + { url = "https://files.pythonhosted.org/packages/f2/1e/809b44e498c67e86c889b919d155ef6978bfabdf7d7e458922ba8f5e67be/yarl-1.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37001e5d4621cef710c8dc1429ca04e189e572f128ab12312eab4e04cf007132", size = 324884 }, + { url = "https://files.pythonhosted.org/packages/b3/88/a4385930e0653ddea4234cbca161882d7de2aa963ca6f3962a1c77dddaad/yarl-1.14.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4f4547944d4f5cfcdc03f3f097d6f05bbbc915eaaf80a2ee120d0e756de377d", size = 334245 }, + { url = "https://files.pythonhosted.org/packages/21/fb/6fc8d66bc24f5913427bc8a0a4c2529bc0763ccf855062d70c21e5eb51b6/yarl-1.14.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75ff4c819757f9bdb35de049a509814d6ce851fe26f06eb95a392a5640052482", size = 335989 }, + { url = "https://files.pythonhosted.org/packages/74/bf/2c493c45589e98833ec8c4e3c5fff8d30f875513bc207361ac822459cb69/yarl-1.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68ac1a09392ed6e3fd14be880d39b951d7b981fd135416db7d18a6208c536561", size = 330270 }, + { url = "https://files.pythonhosted.org/packages/01/ce/1cb0ee93ef3ec827a2d0287936696f68b1743c6f4540251f61cb76d51b63/yarl-1.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96952f642ac69075e44c7d0284528938fdff39422a1d90d3e45ce40b72e5e2d9", size = 316668 }, + { url = "https://files.pythonhosted.org/packages/de/e5/edfdcf4f569eb14cb1e86a451e64ae7052e058147890ab43ecfe06c9272f/yarl-1.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a56fbe3d7f3bce1d060ea18d2413a2ca9ca814eea7cedc4d247b5f338d54844e", size = 331048 }, + { url = "https://files.pythonhosted.org/packages/e6/0a/eeea8057a19f38f07af826954c5199a19ac229823097a0a2f8346c2d9b00/yarl-1.14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7e2637d75e92763d1322cb5041573279ec43a80c0f7fbbd2d64f5aee98447b17", size = 335671 }, + { url = "https://files.pythonhosted.org/packages/fd/c8/7e727938615a50cf413d00ea4e80872e43778d3cb36b2ff05a55ba43addf/yarl-1.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9abe80ae2c9d37c17599557b712e6515f4100a80efb2cda15f5f070306477cd2", size = 342064 }, + { url = "https://files.pythonhosted.org/packages/38/84/5fdf90939f35bac0e3e34f43dbdb6ff2f2d4bc151885a9a4b50fd4a62d6d/yarl-1.14.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:217a782020b875538eebf3948fac3a7f9bbbd0fd9bf8538f7c2ad7489e80f4e8", size = 350695 }, + { url = "https://files.pythonhosted.org/packages/b3/c1/a27587f7178e41b0f047b83b49104fb6043f4e0a0141d4c156c6cf0a978a/yarl-1.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b9cfef3f14f75bf6aba73a76caf61f9d00865912a04a4393c468a7ce0981b519", size = 345151 }, + { url = "https://files.pythonhosted.org/packages/0d/04/394d0d757055b7e8b60d7eb1f9647f200399e6ec57c8a2efc842f49d8487/yarl-1.14.0-cp313-cp313-win32.whl", hash = "sha256:d8361c7d04e6a264481f0b802e395f647cd3f8bbe27acfa7c12049efea675bd1", size = 301897 }, + { url = "https://files.pythonhosted.org/packages/b4/14/63cebb6261f49c9b3db6b20e7c4eb6131524e41f4cd402225e0a3e2bf479/yarl-1.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:bc24f968b82455f336b79bf37dbb243b7d76cd40897489888d663d4e028f5069", size = 307546 }, + { url = "https://files.pythonhosted.org/packages/fd/37/6c30afb708ab45f3da32229c77d9a25dfc8ead2ae3ec1f1ea9425172d070/yarl-1.14.0-py3-none-any.whl", hash = "sha256:c8ed4034f0765f8861620c1f2f2364d2e58520ea288497084dae880424fc0d9f", size = 38166 }, ] From df2e28ac42974aed09ae687cbfc9c8a27a6d7397 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 11:21:58 +0100 Subject: [PATCH 33/70] Bump version to 2.0.0b1, fix completion strategy impl --- .coverage | Bin 53248 -> 53248 bytes src/posting/widgets/variable_autocomplete.py | 24 ++++++++----------- uv.lock | 2 +- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/.coverage b/.coverage index da16981ae14ba1c2b42efe71188f88bef6a8a79d..cf6f6f1bb082ab60954a832d3d53373d36888318 100644 GIT binary patch delta 1631 zcmZA1Yiv_x7zgn8oTuyM^qkW}>7d=#uIturY|vdgcG1xxUJ{84!9-yj-54;g8ym2V zjj_{#zDL-~SdJ266c;`a{eV-5iHN||kjN!N{h%hW3o$w)WYa}m+2GW-Z}p3B(*B<3 z|C~Ihm$czQ2oJ)ERK`A#_B3PvxbD4trs#YDyH@t1a#IK5oaQdhYOXhRm@~}|?oaMM z_bqph8{|%Mt(IBKU9R48i(6$m#ThMS7D=2J&x&u0N5xLDMXVAtL`H}TzX?AIUkMk5 zv%*_Ks}K^N6-tCGLC24BrTh^84&TK$@HPBe{y8p>f0DPN#JOOXqDEbh8P}-K_r0i| zIU1A=c(;x*Ny#TIMqEWIEBM}Jlkj?-$s{u70i^3U;_(l1@Wb2%G zCn+ly&Ye3oTH;2mu>~QcF@B?!Q?J$fhW}v8COb~Icl*&umyn#%7?2Y08 zgV5}1M4sbsxrZ^mRIcVkGO81ewd}*#zqwR0V@ZUz<^G>gG*L^%GloQ!6F8g?XhIvW z+I9KW``6e+T2VAL9oS5oZ)RunLo4L3eTt-JMsikJ$o=VdgCdYJzTKqoq)KczDCT%d zwl7pTQvH9sQ!%Oik#w7p%shobKuG`ia_yW!$WsjJmytZkQj*m9h)>p$3o4d%2gu7I zXL9c0*gko?p)bO`AD*6?vM502?xkZ6gmUi=UAhFk!jdEfo{DQoKJtcQQQQM~aj*KTK3Ib0Ffqq;;jvInZE?VVQslw~)Y=5(<7% zybd?3DgEp0R=kH~KD&17lgiQCH>W0#jL#-{ag)mQrV48OTPLTfVIyu-_w;8=OB2C= z&%^53{%jWSQg8Pc77KU>S(RpO^WS;!*P48z9d9Fjk)#DC5CWT>JA3mf$0?}df+uh706PEgCBpIQpXsmq~{S`59^034$h!BJ`f zDAatwR6o2V)FQBz?rH3eFz4rrz>h9>GFXpH*|n+&^YV1r#$E9{^yfbCQXwoxt6KowvMm50q# KGt{3MEcgeE_<#HW delta 1517 zcmXBTdu&rx90%}o@2~6Q-rn2NwOhNbk9Au+HfTHcVyvuFK*fL{5={)SVFEEqc&Gt1 z*;*vw1Q^@!BA|#&e4@a{07YSJpp)0a_=ChhWNo9tWdXNkMEAh8p8mK=^ZEY1=iGCe zG>x=DqzziLIotl61)S|n{V_jR(iz~FhXbTaH$;R&{iJ?ae^9uDXXqvIk=QR@ z6)%W~#Afkrv0hv*1`K_o$FM<22t$TUVL<2;x`cDWQ8_9!2=55%g_S}`zAImmJLFdR zUAbOXuGQP107OTzW&QmsU!PB^P<}oV6P7XjMDJU3p5w?!A`auGK0| z_ntZtq!~{_-TLc_e{Xj9&ZaYiRfGK_n^W&u>o3HTH3v3u#&{Z?q0;GOPLfF)r=bhk zTgI|6jfs}AVU5+DxX(4FMb)%~ zO>%Chod#G4x)STyWur@zBh%r>(YiaD9yU&QZ<+|2sgG?aawHlY@w&!P6Y!DAMfC&ji(h*FDsX1CPw~9Opeaezs?g9oK8juuQfCl?d(2#xi-FZ3xtM;HMD?jG+GWC z>@<(1VEWXl!vhsA!fUq>qSdl*OlsMOua&5qt>>7w`hI`-&oaN(NORfjo{{J^E=kT_ zwWek~Y^5$G)?yQ>ldZ@G&Osf@_B~D;wX@kMJ#P_c4oeyOn=j4FRprubrDKn~fM&5S zAgo!%uE8flT!i#;pr*FeIXb~jt;+bGJc(we&e3e-cZk%&e(LcleY5M82fe(VKCOhCoaU$4n!BV12vJXW)lF%nVp^+oHWkZS8e&T(|6g8JKCMyW zO&)H(qS@!H4zk)cD{3R8=wAE9i=d~~tjQ`)RCSZb1&~4KvC&tQm|oVWB@@oI+hU1r zBg4KLGp$nA?z8Z8uCjffqmov#Z4PhL#`XO7+Kma(NGn+3_WXMb5;tNbd1=z7q2;VH z7To44sGp^c&ap>IZL>|8-)vEZR?wNsiRKlsntGJ#7O(MS&pK{&bSQIT)RY&$-~XHP zR*RRX`O1-&lFrtU9R5|qj^In+3OWlep;Q2{3}2uoIF8PM&rl<@p$0gHN^lg_ N!zZW+M~=4z{s(qQd6obG diff --git a/src/posting/widgets/variable_autocomplete.py b/src/posting/widgets/variable_autocomplete.py index 168d0594..0c8f397b 100644 --- a/src/posting/widgets/variable_autocomplete.py +++ b/src/posting/widgets/variable_autocomplete.py @@ -60,11 +60,14 @@ def get_candidates(self, target_state: TargetState) -> list[DropdownItem]: else: return super().get_candidates(target_state) - def _completion_strategy( - self, value: str, target_state: TargetState - ) -> TargetState: + def _completion_strategy(self, value: str, target_state: TargetState) -> None: + """Modify the target state to reflect the completion. + + Only works in Inputs for now. + """ cursor = target_state.selection.end[1] text = target_state.text + target: Input = self.target if is_cursor_within_variable(cursor, text): # Replace the text from the variable start # with the completion text. @@ -73,18 +76,11 @@ def _completion_strategy( old_value = text new_value = old_value[:start] + value + old_value[end:] - # Move the cursor to the end of the inserted text - new_column = start + len(value) - return TargetState( - text=new_value, - selection=Selection.cursor((0, new_column)), - ) + target.value = new_value + target.cursor_position = start + len(value) else: - # Replace the entire contents - return TargetState( - text=value, - selection=Selection.cursor((0, len(value))), - ) + target.value = value + target.cursor_position = len(value) def _search_string(self, target_state: TargetState) -> str: cursor = target_state.selection.end[1] diff --git a/uv.lock b/uv.lock index 9cb2e02b..b9022957 100644 --- a/uv.lock +++ b/uv.lock @@ -847,7 +847,7 @@ wheels = [ [[package]] name = "posting" -version = "1.13.0" +version = "2.0.0b1" source = { editable = "." } dependencies = [ { name = "click" }, From 6dab062f83f58395216190b562dc0a0052427bf3 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 11:26:09 +0100 Subject: [PATCH 34/70] Add a keymap field to the config object --- src/posting/config.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/posting/config.py b/src/posting/config.py index 6b9cfb59..afefc4d5 100644 --- a/src/posting/config.py +++ b/src/posting/config.py @@ -10,7 +10,6 @@ YamlConfigSettingsSource, ) from textual.types import AnimationLevel -import yaml from posting.locations import config_file, theme_directory @@ -183,6 +182,9 @@ class Settings(BaseSettings): focus: FocusSettings = Field(default_factory=FocusSettings) """Configuration for focus.""" + keymap: dict[str, str] = Field(default_factory=dict) + """A dictionary mapping binding IDs to key combinations.""" + @classmethod def settings_customise_sources( cls, From e1fb90dab69403ba7b8fa647c6862ba7cecec075 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 12:08:51 +0100 Subject: [PATCH 35/70] Version bumps --- .coverage | Bin 53248 -> 53248 bytes pyproject.toml | 2 +- src/posting/widgets/variable_autocomplete.py | 8 ++++--- uv.lock | 22 ++++++++++--------- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/.coverage b/.coverage index cf6f6f1bb082ab60954a832d3d53373d36888318..4800853ad7148eb3e6b7d239772c06f6b1bd9368 100644 GIT binary patch delta 573 zcmZozz}&Eac>`lZJujK4l{tkW^sZ294w98O-hq%JFWQ& zUxzw!=dICJ07)*Ie5}(}UV%BGn~|%HfyJiTkA;!5%BF>##ipf_#ilhI#GS0%ZEwTc z7Qw>F$;Zgw&I}Y&(77kcz@T+!{qEh&>}@qb5dqb6jNEONK$e8kzo(3KtoQ8M+A4rt zKE+LwqxyW3gxd0fJT-}bXSUkkJ%9S$^XB{CS=rliKzc=|@yoVl0a-S}zt+yUYo@@! z#8Jq=z`+4>qXQ5#IqGU1AZ27IBWK1{@JwI_1k9l=HA|RjV`lZJ(ntjC1)iAmn?S;mk@UnXC=2XwYmx;A4f`yZlkCA&K0~;eJXFDHILd5)>LW2TFI~z!m{xfx!$>+Kh zgaz6%fP5vve@6v;{_DoX*?q5{Y})N8z2VdIgxR?_>}Q`f`=4VheS2H(THXWO-rC#M zb4;Gt9W?nxr@gUwTQpFw0ZX2|Py>U(zIcWhh6DQ<7#h}d3$;Z8Wz?8XnHV!NFnsr7 z0FoR)hc`|>-lG};VgTJ>vF<-u4Cs2ZPy7%;5mUX#3_l=j0h3Sc5SE5^&F#6TQ$gyDsmhf{{R2KX#EF=0.24.0", ] diff --git a/src/posting/widgets/variable_autocomplete.py b/src/posting/widgets/variable_autocomplete.py index 0c8f397b..14689388 100644 --- a/src/posting/widgets/variable_autocomplete.py +++ b/src/posting/widgets/variable_autocomplete.py @@ -1,6 +1,5 @@ from typing import Callable from textual.widgets import Input, TextArea -from textual.widgets.text_area import Selection from textual_autocomplete import ( AutoComplete, DropdownItem, @@ -56,9 +55,10 @@ def get_candidates(self, target_state: TargetState) -> list[DropdownItem]: cursor = target_state.selection.end[1] text = target_state.text if is_cursor_within_variable(cursor, text): - return self.get_variable_candidates(target_state) + candidates = self.get_variable_candidates(target_state) else: - return super().get_candidates(target_state) + candidates = super().get_candidates(target_state) + return candidates def _completion_strategy(self, value: str, target_state: TargetState) -> None: """Modify the target state to reflect the completion. @@ -87,8 +87,10 @@ def _search_string(self, target_state: TargetState) -> str: text = target_state.text if is_cursor_within_variable(cursor, text): variable_at_cursor = get_variable_at_cursor(cursor, text) + print(f"search string = {variable_at_cursor}") return variable_at_cursor or "" else: + print(f"search string = {target_state.text}") return target_state.text def get_variable_candidates(self, target_state: TargetState) -> list[DropdownItem]: diff --git a/uv.lock b/uv.lock index b9022957..a1aff3c3 100644 --- a/uv.lock +++ b/uv.lock @@ -886,8 +886,8 @@ requires-dist = [ { name = "pyperclip", specifier = "==1.9.0" }, { name = "python-dotenv", specifier = "==1.0.1" }, { name = "pyyaml", specifier = "==6.0.2" }, - { name = "textual", extras = ["syntax"], specifier = "==0.79.1" }, - { name = "textual-autocomplete", specifier = "==3.0.0a10" }, + { name = "textual", extras = ["syntax"], specifier = "==0.83.0" }, + { name = "textual-autocomplete", editable = "../textual-autocomplete" }, { name = "watchfiles", specifier = ">=0.24.0" }, { name = "xdg-base-dirs", specifier = "==6.0.1" }, ] @@ -1320,7 +1320,7 @@ wheels = [ [[package]] name = "textual" -version = "0.79.1" +version = "0.83.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py", extra = ["linkify", "plugins"] }, @@ -1328,9 +1328,9 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a4/0d/9c3e18839b696fa6f3bf0e820579967d5c3ffafc9a7c28e557f0ed4a74a3/textual-0.79.1.tar.gz", hash = "sha256:2aaa9778beac5e56957794ee492bd8d281d39516ccb0e507e726484a1327d8b2", size = 1366998 } +sdist = { url = "https://files.pythonhosted.org/packages/cf/0b/58ec0dbcd92a5121fdae972f09de71b5bc38d389bab53a638e24349f904d/textual-0.83.0.tar.gz", hash = "sha256:fc3b97796092d9c7e685e5392f38f3eb2007ffe1b3b1384dee6d3f10d256babd", size = 1449378 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/4b/cd3a8067f5a0f575d5532095d2cf3430f9926509f0698a55ede73c2532c3/textual-0.79.1-py3-none-any.whl", hash = "sha256:75f26c0a8829560a1a8cc739f758c2c1c684246e27166acb3f4ad40110200692", size = 581639 }, + { url = "https://files.pythonhosted.org/packages/18/39/6cec279ca41dcacb1c92ad6e4467c9e88db4eb4d2f02300c66218ec432de/textual-0.83.0-py3-none-any.whl", hash = "sha256:d6efc1e5c54086fd0a4fe274f18b5638ca24a69325c07e1b4400a7d0a1a14c55", size = 600387 }, ] [package.optional-dependencies] @@ -1341,15 +1341,17 @@ syntax = [ [[package]] name = "textual-autocomplete" -version = "3.0.0a10" -source = { registry = "https://pypi.org/simple" } +version = "3.0.0a11" +source = { editable = "../textual-autocomplete" } dependencies = [ { name = "textual" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/29/94/3b974997845531bb58bf7e036c74800c06c8b7f9561105d0f4559841590b/textual_autocomplete-3.0.0a10.tar.gz", hash = "sha256:ea9cb40a8b5de0e691cd360d2912af30c02bfb17fc963061cf8350828b67cb64", size = 16771 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/40/4dcc1ed7581ffe98023cfeb0e39d7b0c6abdf876a3c5d8f0a02b9118123d/textual_autocomplete-3.0.0a10-py3-none-any.whl", hash = "sha256:04646775f4fbd37d20da7772e75937a290f59bb52c7d491023d15aabe009138b", size = 17379 }, + +[package.metadata] +requires-dist = [ + { name = "textual", specifier = ">=0.83.0" }, + { name = "typing-extensions", specifier = ">=4.5.0,<5.0.0" }, ] [[package]] From 75fea4d7f011fdf5deff6393bb72afd34482efe2 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 12:10:53 +0100 Subject: [PATCH 36/70] Bump textual-autocomplete and textual --- pyproject.toml | 2 +- uv.lock | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index efa813f1..d1fc1a46 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ dependencies = [ "pydantic-settings==2.4.0", "python-dotenv==1.0.1", "textual[syntax]==0.83.0", - "textual-autocomplete==3.0.0a10", + "textual-autocomplete==3.0.0a12", "watchfiles>=0.24.0", ] readme = "README.md" diff --git a/uv.lock b/uv.lock index a1aff3c3..9a354df9 100644 --- a/uv.lock +++ b/uv.lock @@ -887,7 +887,7 @@ requires-dist = [ { name = "python-dotenv", specifier = "==1.0.1" }, { name = "pyyaml", specifier = "==6.0.2" }, { name = "textual", extras = ["syntax"], specifier = "==0.83.0" }, - { name = "textual-autocomplete", editable = "../textual-autocomplete" }, + { name = "textual-autocomplete", specifier = "==3.0.0a12" }, { name = "watchfiles", specifier = ">=0.24.0" }, { name = "xdg-base-dirs", specifier = "==6.0.1" }, ] @@ -1341,17 +1341,15 @@ syntax = [ [[package]] name = "textual-autocomplete" -version = "3.0.0a11" -source = { editable = "../textual-autocomplete" } +version = "3.0.0a12" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "textual" }, { name = "typing-extensions" }, ] - -[package.metadata] -requires-dist = [ - { name = "textual", specifier = ">=0.83.0" }, - { name = "typing-extensions", specifier = ">=4.5.0,<5.0.0" }, +sdist = { url = "https://files.pythonhosted.org/packages/49/e6/5a743d325e871f813a23377bf776b96a540705aa83b5e9afc5580b28e67e/textual_autocomplete-3.0.0a12.tar.gz", hash = "sha256:1d2c9e4d24c7f575abc8c612cb6abfff4706f6aaab9b939506b95dae84549309", size = 16852 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/66/27950ba6137131acdeecf26432bb0384092ca900a0a07e3037ea32e1a7d3/textual_autocomplete-3.0.0a12-py3-none-any.whl", hash = "sha256:c446cc19fc771a1cc741f75446d96b9e7a633bd8c8913a2af7c2eae68a5cb3e6", size = 17456 }, ] [[package]] From 40b64621a58b7b67760bc54fd80617744f93b3d6 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 12:16:27 +0100 Subject: [PATCH 37/70] Remove unused import --- src/posting/app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/posting/app.py b/src/posting/app.py index 00b23645..b0e2ffd9 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -1,6 +1,5 @@ import inspect from contextlib import redirect_stdout, redirect_stderr -from io import StringIO from pathlib import Path from typing import Any, Literal, cast From cecf83d8183d4fc6289d4daa1244c82be6c334d9 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 12:23:07 +0100 Subject: [PATCH 38/70] Loosen dependencies --- pyproject.toml | 22 +++++----- uv.lock | 112 ++++++++++++++++++++++--------------------------- 2 files changed, 62 insertions(+), 72 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d1fc1a46..b8bd6214 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,17 +6,17 @@ authors = [ { name = "Darren Burns", email = "darrenb900@gmail.com" } ] dependencies = [ - "click==8.1.7", - "xdg-base-dirs==6.0.1", - "click-default-group==1.2.4", - "httpx[brotli]==0.27.2", - "pyperclip==1.9.0", - "pydantic==2.9.0", - "pyyaml==6.0.2", - "pydantic-settings==2.4.0", - "python-dotenv==1.0.1", - "textual[syntax]==0.83.0", - "textual-autocomplete==3.0.0a12", + "click>=8.1.7,<9.0.0", + "xdg-base-dirs>=6.0.1,<7.0.0", + "click-default-group>=1.2.4,<2.0.0", + "httpx[brotli]>=0.27.2,<1.0.0", + "pyperclip>=1.9.0,<2.0.0", + "pydantic>=2.9.2,<3.0.0", + "pyyaml>=6.0.2,<7.0.0", + "pydantic-settings>=2.4.0,<3.0.0", + "python-dotenv>=1.0.1,<2.0.0", + "textual[syntax]==0.83.0", # pinned intentionally + "textual-autocomplete==3.0.0a12", # pinned intentionally "watchfiles>=0.24.0", ] readme = "README.md" diff --git a/uv.lock b/uv.lock index 9a354df9..8993ff8d 100644 --- a/uv.lock +++ b/uv.lock @@ -878,18 +878,18 @@ dev = [ [package.metadata] requires-dist = [ - { name = "click", specifier = "==8.1.7" }, - { name = "click-default-group", specifier = "==1.2.4" }, - { name = "httpx", extras = ["brotli"], specifier = "==0.27.2" }, - { name = "pydantic", specifier = "==2.9.0" }, - { name = "pydantic-settings", specifier = "==2.4.0" }, - { name = "pyperclip", specifier = "==1.9.0" }, - { name = "python-dotenv", specifier = "==1.0.1" }, - { name = "pyyaml", specifier = "==6.0.2" }, + { name = "click", specifier = ">=8.1.7,<9.0.0" }, + { name = "click-default-group", specifier = ">=1.2.4,<2.0.0" }, + { name = "httpx", extras = ["brotli"], specifier = ">=0.27.2,<1.0.0" }, + { name = "pydantic", specifier = ">=2.9.2,<3.0.0" }, + { name = "pydantic-settings", specifier = ">=2.4.0,<3.0.0" }, + { name = "pyperclip", specifier = ">=1.9.0,<2.0.0" }, + { name = "python-dotenv", specifier = ">=1.0.1,<2.0.0" }, + { name = "pyyaml", specifier = ">=6.0.2,<7.0.0" }, { name = "textual", extras = ["syntax"], specifier = "==0.83.0" }, { name = "textual-autocomplete", specifier = "==3.0.0a12" }, { name = "watchfiles", specifier = ">=0.24.0" }, - { name = "xdg-base-dirs", specifier = "==6.0.1" }, + { name = "xdg-base-dirs", specifier = ">=6.0.1,<7.0.0" }, ] [package.metadata.requires-dev] @@ -972,64 +972,63 @@ wheels = [ [[package]] name = "pydantic" -version = "2.9.0" +version = "2.9.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, - { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f6/8f/3b9f7a38caa3fa0bcb3cea7ee9958e89a9a6efc0e6f51fd6096f24cac140/pydantic-2.9.0.tar.gz", hash = "sha256:c7a8a9fdf7d100afa49647eae340e2d23efa382466a8d177efcd1381e9be5598", size = 768298 } +sdist = { url = "https://files.pythonhosted.org/packages/a9/b7/d9e3f12af310e1120c21603644a1cd86f59060e040ec5c3a80b8f05fae30/pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f", size = 769917 } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/38/95bdb5dfcebad2c11c88f7aa2d635fe53a0b7405ef39a6850c8bced455d4/pydantic-2.9.0-py3-none-any.whl", hash = "sha256:f66a7073abd93214a20c5f7b32d56843137a7a2e70d02111f3be287035c45370", size = 434325 }, + { url = "https://files.pythonhosted.org/packages/df/e4/ba44652d562cbf0bf320e0f3810206149c8a4e99cdbf66da82e97ab53a15/pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12", size = 434928 }, ] [[package]] name = "pydantic-core" -version = "2.23.2" +version = "2.23.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5f/03/54e4961dfaed4804fea0ad73e94d337f4ef88a635e73990d6e150b469594/pydantic_core-2.23.2.tar.gz", hash = "sha256:95d6bf449a1ac81de562d65d180af5d8c19672793c81877a2eda8fde5d08f2fd", size = 401901 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/06/22/ab062eefe57579e186c1aad47d1064bf9f710717c8b35817daa94617c1f6/pydantic_core-2.23.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7ce8e26b86a91e305858e018afc7a6e932f17428b1eaa60154bd1f7ee888b5f8", size = 1844143 }, - { url = "https://files.pythonhosted.org/packages/20/0e/f8cee28755de3cd50ba92e1daf06aac32ec949ecb072afcb49d61221d146/pydantic_core-2.23.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e9b24cca4037a561422bf5dc52b38d390fb61f7bfff64053ce1b72f6938e6b2", size = 1787515 }, - { url = "https://files.pythonhosted.org/packages/c0/e2/8b93dffd8ebca299924bfe119896179be965c9dada4fcc81bb63bb49dad0/pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753294d42fb072aa1775bfe1a2ba1012427376718fa4c72de52005a3d2a22178", size = 1788263 }, - { url = "https://files.pythonhosted.org/packages/38/05/3a7e8682baddd5e06d9f54dadd67e2d66b8f71f79f5b46ec466fd8d110e4/pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:257d6a410a0d8aeb50b4283dea39bb79b14303e0fab0f2b9d617701331ed1515", size = 1780740 }, - { url = "https://files.pythonhosted.org/packages/d2/f0/8dbf5b3a78e2dbe0b4ed8e0ac1e0de53cd8bae82800b634680c8e69a3837/pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8319e0bd6a7b45ad76166cc3d5d6a36c97d0c82a196f478c3ee5346566eebfd", size = 1976823 }, - { url = "https://files.pythonhosted.org/packages/80/d2/5f3a40c0786bcc9b5bd16c2d5157dde2cf4dd7cf1c5827d82c78b935c1d3/pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a05c0240f6c711eb381ac392de987ee974fa9336071fb697768dfdb151345ce", size = 2706812 }, - { url = "https://files.pythonhosted.org/packages/9b/df/d58a06e2dec5abd54167537edee959d2f8f795c44f028a205c7de47c49fe/pydantic_core-2.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d5b0ff3218858859910295df6953d7bafac3a48d5cd18f4e3ed9999efd2245f", size = 2069873 }, - { url = "https://files.pythonhosted.org/packages/db/32/71f1042a1ebfa5bb74a9d0242ff1c79dba04d0080d69f7d49e96b1a72163/pydantic_core-2.23.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:96ef39add33ff58cd4c112cbac076726b96b98bb8f1e7f7595288dcfb2f10b57", size = 1898755 }, - { url = "https://files.pythonhosted.org/packages/61/42/7323144ec46a6141d13ee0536eda7bcde1d7c1ba0d1a551d49967dde278a/pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0102e49ac7d2df3379ef8d658d3bc59d3d769b0bdb17da189b75efa861fc07b4", size = 1964385 }, - { url = "https://files.pythonhosted.org/packages/ba/a7/8a6be2bc6e01c35a19755b100be8eaa279981e9db3fdd95afe06d4e82b87/pydantic_core-2.23.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a6612c2a844043e4d10a8324c54cdff0042c558eef30bd705770793d70b224aa", size = 2110118 }, - { url = "https://files.pythonhosted.org/packages/eb/6a/2885057cebaf4fe2810bb730734c5b6a4578842b6cec094852fea8513275/pydantic_core-2.23.2-cp311-none-win32.whl", hash = "sha256:caffda619099cfd4f63d48462f6aadbecee3ad9603b4b88b60cb821c1b258576", size = 1715354 }, - { url = "https://files.pythonhosted.org/packages/f3/57/d798c53c9a115fe89f118a6b2b27d21e888eb22d4b53828344ce68035431/pydantic_core-2.23.2-cp311-none-win_amd64.whl", hash = "sha256:6f80fba4af0cb1d2344869d56430e304a51396b70d46b91a55ed4959993c0589", size = 1916403 }, - { url = "https://files.pythonhosted.org/packages/8f/54/9c202171aca4a9f6596e1e2a6572ff7d707e2383a40605533c61487714a2/pydantic_core-2.23.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c83c64d05ffbbe12d4e8498ab72bdb05bcc1026340a4a597dc647a13c1605ec", size = 1845364 }, - { url = "https://files.pythonhosted.org/packages/9e/e3/5c29d8fa6dfabd7809fe623fd17959e1b672410681a8c3811eefa42b8051/pydantic_core-2.23.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6294907eaaccf71c076abdd1c7954e272efa39bb043161b4b8aa1cd76a16ce43", size = 1784382 }, - { url = "https://files.pythonhosted.org/packages/79/c3/4b003c9ed0f5f5e559823802ee7a3921de8aa50892bf179535d7695b2e76/pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a801c5e1e13272e0909c520708122496647d1279d252c9e6e07dac216accc41", size = 1791189 }, - { url = "https://files.pythonhosted.org/packages/3f/3b/0c0377c5833093a1758e711387bbe5a5e30511fe9d4afe225be185527aa1/pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cc0c316fba3ce72ac3ab7902a888b9dc4979162d320823679da270c2d9ad0cad", size = 1780431 }, - { url = "https://files.pythonhosted.org/packages/4a/88/18a541e2f9cbcef4b44b90a2ba98d85e109d91bc7f3b2210d271f66e6d8f/pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b06c5d4e8701ac2ba99a2ef835e4e1b187d41095a9c619c5b185c9068ed2a49", size = 1976902 }, - { url = "https://files.pythonhosted.org/packages/e3/bd/6c98ca605130ee51438d812133d04ddb403fb1a8a93490f9a1a7e269a4a7/pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82764c0bd697159fe9947ad59b6db6d7329e88505c8f98990eb07e84cc0a5d81", size = 2638882 }, - { url = "https://files.pythonhosted.org/packages/ad/fc/6b4f95c64bbeadaa6f84cffb51f469f6fdd61215d97b4ec8d89d027e574b/pydantic_core-2.23.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b1a195efd347ede8bcf723e932300292eb13a9d2a3c1f84eb8f37cbbc905b7f", size = 2111180 }, - { url = "https://files.pythonhosted.org/packages/95/4c/d4a355237ffa3dae28c2224bea9e09d4af69f346bf7611ebb66d8e930574/pydantic_core-2.23.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7efb12e5071ad8d5b547487bdad489fbd4a5a35a0fc36a1941517a6ad7f23e0", size = 1904338 }, - { url = "https://files.pythonhosted.org/packages/83/d6/9f41db9ab2727a050fdac5e56a9e792260aa29e29affa98b4df8a06fd588/pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5dd0ec5f514ed40e49bf961d49cf1bc2c72e9b50f29a163b2cc9030c6742aa73", size = 1968729 }, - { url = "https://files.pythonhosted.org/packages/f8/bd/0e795ea5eaf26a96d9691faae43603e00de3dbec6339e3710652f5feae12/pydantic_core-2.23.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:820f6ee5c06bc868335e3b6e42d7ef41f50dfb3ea32fbd523ab679d10d8741c0", size = 2120748 }, - { url = "https://files.pythonhosted.org/packages/be/7d/48ddf9f084b5de1d47c6bcccfeafe80900ceac975ebdf1fe374fd18654e5/pydantic_core-2.23.2-cp312-none-win32.whl", hash = "sha256:3713dc093d5048bfaedbba7a8dbc53e74c44a140d45ede020dc347dda18daf3f", size = 1725557 }, - { url = "https://files.pythonhosted.org/packages/e1/d7/ef3558714427b385f84e22a224c4641b4869f9031f733e83cea6f0eb0154/pydantic_core-2.23.2-cp312-none-win_amd64.whl", hash = "sha256:e1895e949f8849bc2757c0dbac28422a04be031204df46a56ab34bcf98507342", size = 1914466 }, - { url = "https://files.pythonhosted.org/packages/91/42/085e27e5c32220531bbd966c2888c74a595ac35cd7e52a71d3302d041b71/pydantic_core-2.23.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:da43cbe593e3c87d07108d0ebd73771dc414488f1f91ed2e204b0370b94b37ac", size = 1845030 }, - { url = "https://files.pythonhosted.org/packages/05/ac/3faf5fd29b221bb7c0aa4bc3fe1a763fb2d38b08d7b5961daeee96f13a8e/pydantic_core-2.23.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:64d094ea1aa97c6ded4748d40886076a931a8bf6f61b6e43e4a1041769c39dd2", size = 1784493 }, - { url = "https://files.pythonhosted.org/packages/83/52/cc692fc65098904a6bdb13cc502b590d0597718069a8ffa8bfdea680657c/pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:084414ffe9a85a52940b49631321d636dadf3576c30259607b75516d131fecd0", size = 1791193 }, - { url = "https://files.pythonhosted.org/packages/53/a9/d7be95020bf6a57ada1d5d18172369ad92e9779dccf9a497b22863d77dd8/pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:043ef8469f72609c4c3a5e06a07a1f713d53df4d53112c6d49207c0bd3c3bd9b", size = 1780169 }, - { url = "https://files.pythonhosted.org/packages/10/42/16bee4df87a315a8ae3962e5c2251612bced849e624f850e811a2e6097da/pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3649bd3ae6a8ebea7dc381afb7f3c6db237fc7cebd05c8ac36ca8a4187b03b30", size = 1976946 }, - { url = "https://files.pythonhosted.org/packages/f8/04/8be7280cf309c256bd9fa124fbe15f730b9659ee87d89a40b7da14c6818f/pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6db09153d8438425e98cdc9a289c5fade04a5d2128faff8f227c459da21b9703", size = 2638776 }, - { url = "https://files.pythonhosted.org/packages/24/7b/e102b2073b08b36f78d7336859fe8d09e7483eded849cf12bd3db66f441d/pydantic_core-2.23.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5668b3173bb0b2e65020b60d83f5910a7224027232c9f5dc05a71a1deac9f960", size = 2110994 }, - { url = "https://files.pythonhosted.org/packages/90/29/ba00e3e262597203ae95c5eb81d02ce96afcda26b6960484b376a1e5ac59/pydantic_core-2.23.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1c7b81beaf7c7ebde978377dc53679c6cba0e946426fc7ade54251dfe24a7604", size = 1904219 }, - { url = "https://files.pythonhosted.org/packages/4b/ef/3899865e9f2e30b79c1ed9498a71898f33b1ca2a08f3b1619eaee754aa85/pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:ae579143826c6f05a361d9546446c432a165ecf1c0b720bbfd81152645cb897d", size = 1968804 }, - { url = "https://files.pythonhosted.org/packages/19/e9/69742d9c71d08251184584c2b99d436490c78f7487840e588394b1ce97a9/pydantic_core-2.23.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:19f1352fe4b248cae22a89268720fc74e83f008057a652894f08fa931e77dced", size = 2120574 }, - { url = "https://files.pythonhosted.org/packages/5c/fc/7f89094bf3a645fb5b312b6ae907f3b04b6e0d1e37f6eb4c057276d80703/pydantic_core-2.23.2-cp313-none-win32.whl", hash = "sha256:e1a79ad49f346aa1a2921f31e8dbbab4d64484823e813a002679eaa46cba39e1", size = 1725472 }, - { url = "https://files.pythonhosted.org/packages/43/13/39f4b60884174a95c69e3dd196c77a1757c3857841f2567d240bcbd1cf0f/pydantic_core-2.23.2-cp313-none-win_amd64.whl", hash = "sha256:582871902e1902b3c8e9b2c347f32a792a07094110c1bca6c2ea89b90150caac", size = 1914614 }, +sdist = { url = "https://files.pythonhosted.org/packages/e2/aa/6b6a9b9f8537b872f552ddd46dd3da230367754b6f707b8e1e963f515ea3/pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863", size = 402156 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/30/890a583cd3f2be27ecf32b479d5d615710bb926d92da03e3f7838ff3e58b/pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8", size = 1865160 }, + { url = "https://files.pythonhosted.org/packages/1d/9a/b634442e1253bc6889c87afe8bb59447f106ee042140bd57680b3b113ec7/pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d", size = 1776777 }, + { url = "https://files.pythonhosted.org/packages/75/9a/7816295124a6b08c24c96f9ce73085032d8bcbaf7e5a781cd41aa910c891/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e", size = 1799244 }, + { url = "https://files.pythonhosted.org/packages/a9/8f/89c1405176903e567c5f99ec53387449e62f1121894aa9fc2c4fdc51a59b/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607", size = 1805307 }, + { url = "https://files.pythonhosted.org/packages/d5/a5/1a194447d0da1ef492e3470680c66048fef56fc1f1a25cafbea4bc1d1c48/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd", size = 2000663 }, + { url = "https://files.pythonhosted.org/packages/13/a5/1df8541651de4455e7d587cf556201b4f7997191e110bca3b589218745a5/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea", size = 2655941 }, + { url = "https://files.pythonhosted.org/packages/44/31/a3899b5ce02c4316865e390107f145089876dff7e1dfc770a231d836aed8/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e", size = 2052105 }, + { url = "https://files.pythonhosted.org/packages/1b/aa/98e190f8745d5ec831f6d5449344c48c0627ac5fed4e5340a44b74878f8e/pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b", size = 1919967 }, + { url = "https://files.pythonhosted.org/packages/ae/35/b6e00b6abb2acfee3e8f85558c02a0822e9a8b2f2d812ea8b9079b118ba0/pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0", size = 1964291 }, + { url = "https://files.pythonhosted.org/packages/13/46/7bee6d32b69191cd649bbbd2361af79c472d72cb29bb2024f0b6e350ba06/pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64", size = 2109666 }, + { url = "https://files.pythonhosted.org/packages/39/ef/7b34f1b122a81b68ed0a7d0e564da9ccdc9a2924c8d6c6b5b11fa3a56970/pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f", size = 1732940 }, + { url = "https://files.pythonhosted.org/packages/2f/76/37b7e76c645843ff46c1d73e046207311ef298d3f7b2f7d8f6ac60113071/pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3", size = 1916804 }, + { url = "https://files.pythonhosted.org/packages/74/7b/8e315f80666194b354966ec84b7d567da77ad927ed6323db4006cf915f3f/pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231", size = 1856459 }, + { url = "https://files.pythonhosted.org/packages/14/de/866bdce10ed808323d437612aca1ec9971b981e1c52e5e42ad9b8e17a6f6/pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee", size = 1770007 }, + { url = "https://files.pythonhosted.org/packages/dc/69/8edd5c3cd48bb833a3f7ef9b81d7666ccddd3c9a635225214e044b6e8281/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87", size = 1790245 }, + { url = "https://files.pythonhosted.org/packages/80/33/9c24334e3af796ce80d2274940aae38dd4e5676298b4398eff103a79e02d/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8", size = 1801260 }, + { url = "https://files.pythonhosted.org/packages/a5/6f/e9567fd90104b79b101ca9d120219644d3314962caa7948dd8b965e9f83e/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327", size = 1996872 }, + { url = "https://files.pythonhosted.org/packages/2d/ad/b5f0fe9e6cfee915dd144edbd10b6e9c9c9c9d7a56b69256d124b8ac682e/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2", size = 2661617 }, + { url = "https://files.pythonhosted.org/packages/06/c8/7d4b708f8d05a5cbfda3243aad468052c6e99de7d0937c9146c24d9f12e9/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36", size = 2071831 }, + { url = "https://files.pythonhosted.org/packages/89/4d/3079d00c47f22c9a9a8220db088b309ad6e600a73d7a69473e3a8e5e3ea3/pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126", size = 1917453 }, + { url = "https://files.pythonhosted.org/packages/e9/88/9df5b7ce880a4703fcc2d76c8c2d8eb9f861f79d0c56f4b8f5f2607ccec8/pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e", size = 1968793 }, + { url = "https://files.pythonhosted.org/packages/e3/b9/41f7efe80f6ce2ed3ee3c2dcfe10ab7adc1172f778cc9659509a79518c43/pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24", size = 2116872 }, + { url = "https://files.pythonhosted.org/packages/63/08/b59b7a92e03dd25554b0436554bf23e7c29abae7cce4b1c459cd92746811/pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84", size = 1738535 }, + { url = "https://files.pythonhosted.org/packages/88/8d/479293e4d39ab409747926eec4329de5b7129beaedc3786eca070605d07f/pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9", size = 1917992 }, + { url = "https://files.pythonhosted.org/packages/ad/ef/16ee2df472bf0e419b6bc68c05bf0145c49247a1095e85cee1463c6a44a1/pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc", size = 1856143 }, + { url = "https://files.pythonhosted.org/packages/da/fa/bc3dbb83605669a34a93308e297ab22be82dfb9dcf88c6cf4b4f264e0a42/pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd", size = 1770063 }, + { url = "https://files.pythonhosted.org/packages/4e/48/e813f3bbd257a712303ebdf55c8dc46f9589ec74b384c9f652597df3288d/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05", size = 1790013 }, + { url = "https://files.pythonhosted.org/packages/b4/e0/56eda3a37929a1d297fcab1966db8c339023bcca0b64c5a84896db3fcc5c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d", size = 1801077 }, + { url = "https://files.pythonhosted.org/packages/04/be/5e49376769bfbf82486da6c5c1683b891809365c20d7c7e52792ce4c71f3/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510", size = 1996782 }, + { url = "https://files.pythonhosted.org/packages/bc/24/e3ee6c04f1d58cc15f37bcc62f32c7478ff55142b7b3e6d42ea374ea427c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6", size = 2661375 }, + { url = "https://files.pythonhosted.org/packages/c1/f8/11a9006de4e89d016b8de74ebb1db727dc100608bb1e6bbe9d56a3cbbcce/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b", size = 2071635 }, + { url = "https://files.pythonhosted.org/packages/7c/45/bdce5779b59f468bdf262a5bc9eecbae87f271c51aef628d8c073b4b4b4c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327", size = 1916994 }, + { url = "https://files.pythonhosted.org/packages/d8/fa/c648308fe711ee1f88192cad6026ab4f925396d1293e8356de7e55be89b5/pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6", size = 1968877 }, + { url = "https://files.pythonhosted.org/packages/16/16/b805c74b35607d24d37103007f899abc4880923b04929547ae68d478b7f4/pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f", size = 2116814 }, + { url = "https://files.pythonhosted.org/packages/d1/58/5305e723d9fcdf1c5a655e6a4cc2a07128bf644ff4b1d98daf7a9dbf57da/pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769", size = 1738360 }, + { url = "https://files.pythonhosted.org/packages/a5/ae/e14b0ff8b3f48e02394d8acd911376b7b66e164535687ef7dc24ea03072f/pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5", size = 1919411 }, ] [[package]] @@ -1462,15 +1461,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, ] -[[package]] -name = "tzdata" -version = "2024.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/74/5b/e025d02cb3b66b7b76093404392d4b44343c69101cc85f4d180dd5784717/tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", size = 190559 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/65/58/f9c9e6be752e9fcb8b6a0ee9fb87e6e7a1f6bcab2cdc73f02bb7ba91ada0/tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252", size = 345370 }, -] - [[package]] name = "uc-micro-py" version = "1.0.3" From e55b7c8258b2d8094246151922c7109174d3b63f Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 12:25:43 +0100 Subject: [PATCH 39/70] Update snapshots --- .coverage | Bin 53248 -> 53248 bytes .../test_snapshots/TestConfig.test_config.svg | 238 +++++++-------- ...estHelpScreen.test_help_screen_appears.svg | 276 +++++++++--------- .../TestJumpMode.test_click_switch.svg | 179 ++++++------ .../TestJumpMode.test_focus_switch.svg | 179 ++++++------ .../TestJumpMode.test_loads.svg | 189 ++++++------ ...request_loaded_into_view__query_params.svg | 234 +++++++-------- ...ethodSelection.test_select_post_method.svg | 179 ++++++------ ...uest.test_dialog_loads_and_can_be_used.svg | 196 ++++++------- ..._tree_correctly_and_notification_shown.svg | 177 +++++------ ...elected__dialog_is_prefilled_correctly.svg | 197 ++++++------- .../TestSendRequest.test_send_request.svg | 238 +++++++-------- ...UrlBar.test_dropdown_appears_on_typing.svg | 193 ++++++------ ...down_completion_selected_via_enter_key.svg | 189 ++++++------ ...opdown_completion_selected_via_tab_key.svg | 189 ++++++------ ...UrlBar.test_dropdown_filters_on_typing.svg | 191 ++++++------ ...eShortcuts.test_expand_request_section.svg | 159 +++++----- ...erfaceShortcuts.test_expand_then_reset.svg | 179 ++++++------ ...solved_variables_highlight_and_preview.svg | 193 ++++++------ 19 files changed, 1793 insertions(+), 1782 deletions(-) diff --git a/.coverage b/.coverage index 4800853ad7148eb3e6b7d239772c06f6b1bd9368..f51e32a82667bc39f234d8622a90634ad0d55f6f 100644 GIT binary patch delta 1713 zcmZA1dr(wW90%}o?{C>=1@*yXXiEbOklmd7FwLsnDM9JRD5XM6xtV>6WqO=HiI zyK2*!;vsg;S4pTvX1)*=6?vEviUm4TT7$4yW7vd9G{!@{w{s8nPv@V{_x{egzx~bG zoek7Npcbm580*&PIgGWwXfMyJMU<;9MVwW0QgcvKtuECp)y&s8HC9gIdblp`BDbI0 z&GCl2hF(Ln;X`h{A;G}t2lYF+SM(onE4ZZ`t6!{7;TGuadYx{J%h%o3{ir*k+oOA5 zx1LMZJ+Jd}u{xx^tNlUSs6DLRtKFe3*9Nr95nT-t#^F$YBZtF681*J|NP*-Z4oDr1 zQUgMLYc@*u)`{S``qmpTc^sjF<)@hH3%7X5h3;gbP!t%dx^?FM!6PBr*TbrJl2bo5 z)vpfTU)}raF0rJpgu zpB16Rn@5|PK!vB1iqX}@C~-PT`q<-2oFa!9MvIe4h>Z3^zn_@^HBMA8IcjrcLH_wn z6?Vz*g>5%ju!E!wqv-4BhkBbt*H}wFgA}Ns4V2g}cQP0PB*`0}N{*qniPYThdIqORha;)dd=p6ku%p#$CVue@4PKae}neXmsRY$-Y&l=8Q& zWsLn1*erjfVx8R-Kxr+7XccN}B^Q2F6N;yj9TT|suqJFG(am;d`p6eC+Ua3bHw|ji zs8Z;taPe{=Cv%QSp_9>^-Q@^4CbKbX#PGN}-TNCFdtA*NQB9_4zD=os`o-Xi*P56A z+0IT@^D>6+`CcLqS4T%v3uf|{-1uoS!jjxRML>aA`BumU)5QvX6~-kCHibN;3tK=O1pVB*>k4nlOMD4QFGyhN|%IZ z2_=4t>}RZ!to42th88iNii|uYz5S;n~lhwk!3E8 z!8wAr%C-_`lUBzBSlAC88gy5KC(SHXw%>fQn5J2+e}$VUkpwYc2(I}oGP5D$};P564|sxO;}N_ z#ITHS8BP#Js+P?%;c0Sni}?LXe{c7dp@Gf8(GVB*km8~U@!qfE`0xxZx%<3FQr|$w zhO)%Xtqm=+`WL?r{-L4O*e#T7@fZ)atzm|T|A-hHHpTVd?!F<^ZSk-;Ug+ME4ly`R zxb~6FiJhcnwCPQ6&*1%MQbUb6mOMMBi0#HjQp&1={89dRwO`MFry^xG9nMpe;T+Wi zjZ`Nbr^dixss#>Er^0@!9%`r@?53(=7c~@iQdO{ns)X&-5cq_ufNfOZL7;(!kCo)_ zf`zRw(C1vZOwEBy)NJUWPKS1CCS0WY-~u%RzNMx?8#NVLsa|NIra&__37V*haF)s^ zz!@5*!D*@+PElQOk{S;usBzFhjfHxu1CCMcaFl9;Bh+X(M2&)PsF84xYK5<<5%3i? s9O`7}vSIKgEtug8stNW{r@&sS5o)Oh_?)VPJyb1xM%BQl`)bqv1=C2$vH$=8 delta 1770 zcmbuJ1(w^gEV3wzTm&x|0yWx)dXJ4(k;^LHxp_xWm=*Ml zm78`9O-!0loA#kKl4@I;$?X&;{q>80Y!;<&5)l|A(?{y^QiK&loP%`o6W*dXRr&dB*?5f5CsopXaN1 zKfj4z$fxtOIE@?S?%Vpg?`)N}6n%jDYtd5BET80?JQ0kgDJr5@lZTja zM@@J)gKpeo!-b76f_3F`x9RnCgl=4^1h;Z4tgS*1tB{1yK*Fs9&o?gPt1tW9`lL&> zZcyK@utDKEvZWQaL@^uS{daV4)Eo zBdwTp)q#(YBF&{WxQ5Ca3tNE=Ouy;38S!C#Jb|&|L!^j}&w!!jh0IG3@j=qN;$Fs} zt}w$gITn0?1diC!f^T!}xQ5hTr`G>v;lP7?qr=Ui$p{m!B%u`9X-mNS)V>baTX-)C z;_XK>9*?|OmuZ&p9@2YeX}6`-;rYd-1(UK9?JvIjN$oci&!`WJto>)xoo#6ugaOSzKwc{+;Pp0J#ym z&5(8c`Z^ZQgUi&EmSh>1>g$-Q*^@jj{vRjg(DRKY^n_%SU;fkod_v^EkH|kxh+jV; z(Ri!A2SatDJ%F-$%TO`u3zCg=^JZK`M(p7IfVJZ-r1Y|Pb92aJCs!hJHX*28k&1fod zTWv_I9UILka41OaYKvsCtX^+(t-+0Cnk#iMhUxo#`<*FX!VM(wcz?SG+MN&z-*Hvo#$?0wBy=Y?G7|&S6P=+ER|2k8v)WxOKB}&7Uj!TQe)VGe z244!UCKFdjYh%A?)8k96EJFD+;lbhW8yeG^gDPqDt9n-nu2R!GQl<3Q!C&`2wY(#h z#T9C6NA}fog`(VMBFnMaaE6)=&D2zAqIhJ92Kc2YUmMzw&SYKAhZ z2}-F(D4|9`G1UNDsUSlUEm+uMB(Dz^HgBSR9-N~tfez|oXs0fOR%$M^P;=lcbpgCf z%>sp*37DDzr>XOSyw=D@eb7WrgOgNw9t3DH7i6jz8mK97f;tC|Q - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -GEThttps://jsonplaceholder.typicode.com/posts                                        ■■■■■■■ Send  - -╭─ Collection ───────────────────────╮╭─────────────────────────── Request ─╮╭───────────────── Response  200 OK ─╮ -GET echo││HeadersBodyQueryAuthInfoSBodyHeadersCookiesScriptsTra -GET get random user││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││ Content-Type     application/json   1  [ -▼ jsonplaceholder/││ Referer          https://example.c  2    {                           -▼ posts/││ Accept-Encoding  gzip               3  "userId"1,              -█ GET get all││ Cache-Control    no-cache           4  "id"1,                  -GET get one││  5  "title""sunt aut  -POS create││facere repellat provident  -DEL delete a post││occaecati excepturi optio  -▼ comments/││reprehenderit",               -GET get comments││  6  "body""quia et  -GET get comments (via param)││suscipit\nsuscipit  -PUT edit a comment││recusandae consequuntur  -▼ todos/││expedita et  -GET get all││cum\nreprehenderit  -GET get one││molestiae ut ut quas  -▼ users/││totam\nnostrum rerum est  -GET get a user││autem sunt rem eveniet  -GET get all users││architecto" -POS create a user││  7    },                          -PUT update a user││  8    {                           -DEL delete a user││  9  "userId"1,              -││ 10  "id"2,                  -││ 11  "title""qui est esse" -││Name 12  "body""est rerum  -│────────────────────────────────────││Valuetempore vitae\nsequi sint  -Retrieve all posts││ Add header 1:1read-onlyJSONWrap X -╰─────────────── sample-collections ─╯╰─────────────────────────────────────╯╰─────────────────────────────────────╯ - f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  + + +GEThttps://jsonplaceholder.typicode.com/posts                                        ■■■■■■■ Send  + +╭─ Collection ───────────────────────╮╭─────────────────────────── Request ─╮╭───────────────── Response  200 OK ─╮ +GET echo││HeadersBodyQueryAuthInfoSBodyHeadersCookiesScriptsTra +GET get random user││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││ Content-Type     application/json   1  [ +▼ jsonplaceholder/││ Referer          https://example.c  2    {                           +▼ posts/││ Accept-Encoding  gzip               3  "userId"1,              +█ GET get all││ Cache-Control    no-cache           4  "id"1,                  +GET get one││  5  "title""sunt aut  +POS create││facere repellat provident  +DEL delete a post││occaecati excepturi optio  +▼ comments/││reprehenderit",               +GET get comments││  6  "body""quia et  +GET get comments (via param)││suscipit\nsuscipit  +PUT edit a comment││recusandae consequuntur  +▼ todos/││expedita et  +GET get all││cum\nreprehenderit  +GET get one││molestiae ut ut quas  +▼ users/││totam\nnostrum rerum est  +GET get a user││autem sunt rem eveniet  +GET get all users││architecto" +POS create a user││  7    },                          +PUT update a user││  8    {                           +DEL delete a user││  9  "userId"1,              +││ 10  "id"2,                  +││ 11  "title""qui est esse" +││Name 12  "body""est rerum  +│────────────────────────────────────││Valuetempore vitae\nsequi sint  +Retrieve all posts││ Add header 1:1read-onlyJSONWrap X +╰─────────────── sample-collections ─╯╰─────────────────────────────────────╯╰─────────────────────────────────────╯ + f3 Pager  f4 Editor  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  diff --git a/tests/__snapshots__/test_snapshots/TestHelpScreen.test_help_screen_appears.svg b/tests/__snapshots__/test_snapshots/TestHelpScreen.test_help_screen_appears.svg index e5344844..aafeb68b 100644 --- a/tests/__snapshots__/test_snapshots/TestHelpScreen.test_help_screen_appears.svg +++ b/tests/__snapshots__/test_snapshots/TestHelpScreen.test_help_screen_appears.svg @@ -19,251 +19,251 @@ font-weight: 700; } - .terminal-720057009-matrix { + .terminal-2342588274-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-720057009-title { + .terminal-2342588274-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-720057009-r1 { fill: #9c9c9d } -.terminal-720057009-r2 { fill: #c5c8c6 } -.terminal-720057009-r3 { fill: #dfdfe0 } -.terminal-720057009-r4 { fill: #b2669a } -.terminal-720057009-r5 { fill: #0e0b15;text-decoration: underline; } -.terminal-720057009-r6 { fill: #0e0b15 } -.terminal-720057009-r7 { fill: #2e2540 } -.terminal-720057009-r8 { fill: #50505e } -.terminal-720057009-r9 { fill: #9d9da1 } -.terminal-720057009-r10 { fill: #a79eaf } -.terminal-720057009-r11 { fill: #6f6f73 } -.terminal-720057009-r12 { fill: #2e2e3f } -.terminal-720057009-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-720057009-r14 { fill: #dfdfe1 } -.terminal-720057009-r15 { fill: #45203a } -.terminal-720057009-r16 { fill: #0f0f1f } -.terminal-720057009-r17 { fill: #9e9ea2;font-weight: bold } -.terminal-720057009-r18 { fill: #a5a5ab;font-weight: bold } -.terminal-720057009-r19 { fill: #4a4a51 } -.terminal-720057009-r20 { fill: #0973a3 } -.terminal-720057009-r21 { fill: #191923 } -.terminal-720057009-r22 { fill: #178941 } -.terminal-720057009-r23 { fill: #19192d } -.terminal-720057009-r24 { fill: #616166 } -.terminal-720057009-r25 { fill: #616166;font-weight: bold } -.terminal-720057009-r26 { fill: #8b8b93;font-weight: bold } -.terminal-720057009-r27 { fill: #008042 } -.terminal-720057009-r28 { fill: #a72f2f } -.terminal-720057009-r29 { fill: #a5a5ab } -.terminal-720057009-r30 { fill: #ab6e07 } -.terminal-720057009-r31 { fill: #e0e0e2;font-weight: bold } -.terminal-720057009-r32 { fill: #e0e0e2 } -.terminal-720057009-r33 { fill: #e1e0e4 } -.terminal-720057009-r34 { fill: #e1e0e4;font-weight: bold } -.terminal-720057009-r35 { fill: #e2e0e5 } -.terminal-720057009-r36 { fill: #65626d } -.terminal-720057009-r37 { fill: #e2e0e5;font-weight: bold } -.terminal-720057009-r38 { fill: #20202a } -.terminal-720057009-r39 { fill: #707074 } -.terminal-720057009-r40 { fill: #11111c } -.terminal-720057009-r41 { fill: #0d0e2e } -.terminal-720057009-r42 { fill: #6f6f78;font-weight: bold } -.terminal-720057009-r43 { fill: #6f6f78 } -.terminal-720057009-r44 { fill: #5e5e64 } -.terminal-720057009-r45 { fill: #727276 } -.terminal-720057009-r46 { fill: #535359 } -.terminal-720057009-r47 { fill: #15151f } -.terminal-720057009-r48 { fill: #027d51;font-weight: bold } -.terminal-720057009-r49 { fill: #b2588c;font-weight: bold } -.terminal-720057009-r50 { fill: #99999a } + .terminal-2342588274-r1 { fill: #9c9c9d } +.terminal-2342588274-r2 { fill: #c5c8c6 } +.terminal-2342588274-r3 { fill: #dfdfe0 } +.terminal-2342588274-r4 { fill: #b2669a } +.terminal-2342588274-r5 { fill: #0e0b15;text-decoration: underline; } +.terminal-2342588274-r6 { fill: #0e0b15 } +.terminal-2342588274-r7 { fill: #2e2540 } +.terminal-2342588274-r8 { fill: #50505e } +.terminal-2342588274-r9 { fill: #9d9da1 } +.terminal-2342588274-r10 { fill: #a79eaf } +.terminal-2342588274-r11 { fill: #6f6f73 } +.terminal-2342588274-r12 { fill: #2e2e3f } +.terminal-2342588274-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-2342588274-r14 { fill: #dfdfe1 } +.terminal-2342588274-r15 { fill: #45203a } +.terminal-2342588274-r16 { fill: #0f0f1f } +.terminal-2342588274-r17 { fill: #9e9ea2;font-weight: bold } +.terminal-2342588274-r18 { fill: #a5a5ab;font-weight: bold } +.terminal-2342588274-r19 { fill: #4a4a51 } +.terminal-2342588274-r20 { fill: #0973a3 } +.terminal-2342588274-r21 { fill: #191923 } +.terminal-2342588274-r22 { fill: #178941 } +.terminal-2342588274-r23 { fill: #19192d } +.terminal-2342588274-r24 { fill: #616166 } +.terminal-2342588274-r25 { fill: #616166;font-weight: bold } +.terminal-2342588274-r26 { fill: #8b8b93;font-weight: bold } +.terminal-2342588274-r27 { fill: #008042 } +.terminal-2342588274-r28 { fill: #a72f2f } +.terminal-2342588274-r29 { fill: #a5a5ab } +.terminal-2342588274-r30 { fill: #ab6e07 } +.terminal-2342588274-r31 { fill: #e0e0e2;font-weight: bold } +.terminal-2342588274-r32 { fill: #e0e0e2 } +.terminal-2342588274-r33 { fill: #e1e0e4 } +.terminal-2342588274-r34 { fill: #e1e0e4;font-weight: bold } +.terminal-2342588274-r35 { fill: #e2e0e5 } +.terminal-2342588274-r36 { fill: #65626d } +.terminal-2342588274-r37 { fill: #e2e0e5;font-weight: bold } +.terminal-2342588274-r38 { fill: #20202a } +.terminal-2342588274-r39 { fill: #707074 } +.terminal-2342588274-r40 { fill: #11111c } +.terminal-2342588274-r41 { fill: #0d0e2e } +.terminal-2342588274-r42 { fill: #6f6f78;font-weight: bold } +.terminal-2342588274-r43 { fill: #6f6f78 } +.terminal-2342588274-r44 { fill: #5e5e64 } +.terminal-2342588274-r45 { fill: #727276 } +.terminal-2342588274-r46 { fill: #535359 } +.terminal-2342588274-r47 { fill: #15151f } +.terminal-2342588274-r48 { fill: #027d51;font-weight: bold } +.terminal-2342588274-r49 { fill: #b2588c;font-weight: bold } +.terminal-2342588274-r50 { fill: #99999a } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                    - -GETEnter a URL... Send  -▁▁Focused Widget Help (Address Bar)▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ -╭─ Collectio Request ─╮ - GET echoAddress BariptsOptio -GET get raEnter the URL to send a request to. Refer to ━━━━━━━━━━━ -POS echo pvariables from the environment (loaded via ╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplace--env) using $variable or ${variable} syntax. ╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/Resolved variables will be highlighted green. ╱╱╱╱╱╱╱╱╱╱╱ -GET geMove the cursor over a variable to preview the╱╱╱╱╱╱╱╱╱╱╱ -GET gevalue. Base URL suggestions are loaded based ╱╱╱╱╱╱╱╱╱╱╱ -POS cron the URLs found in the currently open ╱╱╱╱╱╱╱╱╱╱╱ -DEL decollection. Press ctrl+l to quickly focus this╱╱╱╱╱╱╱╱╱╱╱ -▼ commebar from elsewhere.╱╱╱╱╱╱╱╱╱╱╱ -GET╱╱╱╱╱╱╱╱╱╱╱ -GETAll Keybindings╱╱╱╱╱╱╱╱╱╱╱ -PUT Key   Description                   ╱╱╱╱╱╱╱╱╱╱╱ -▼ todos/ cursor left                   ╱╱╱╱╱╱╱╱╱╱╱ -GET ge^← cursor left word               header  -GET ge cursor right                  ───────────╯ -▼ users/^→ cursor right word              Response ─╮ -GET ge delete left                   e -GET gehome home                          ━━━━━━━━━━━ -POS cr^a home                           -PUT upend end                            -DEL de^e end                            -del delete right                   -^d delete right                   - submit                         - -Press ESC to dismiss. -│───────────Note: This page relates to the widget that is  -This is ancurrently focused. -server we  -see exactl▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + +Posting                                                                    + +GETEnter a URL... Send  +▁▁Focused Widget Help (Address Bar)▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ +╭─ Collectio Request ─╮ + GET echoAddress BariptsOptio +GET get raEnter the URL to send a request to. Refer to ━━━━━━━━━━━ +POS echo pvariables from the environment (loaded via ╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplace--env) using $variable or ${variable} syntax. ╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/Resolved variables will be highlighted green. ╱╱╱╱╱╱╱╱╱╱╱ +GET geMove the cursor over a variable to preview the╱╱╱╱╱╱╱╱╱╱╱ +GET gevalue. Base URL suggestions are loaded based ╱╱╱╱╱╱╱╱╱╱╱ +POS cron the URLs found in the currently open ╱╱╱╱╱╱╱╱╱╱╱ +DEL decollection. Press ctrl+l to quickly focus this╱╱╱╱╱╱╱╱╱╱╱ +▼ commebar from elsewhere.╱╱╱╱╱╱╱╱╱╱╱ +GET╱╱╱╱╱╱╱╱╱╱╱ +GETAll Keybindings╱╱╱╱╱╱╱╱╱╱╱ +PUT Key   Description                   ╱╱╱╱╱╱╱╱╱╱╱ +▼ todos/ move cursor left              ╱╱╱╱╱╱╱╱╱╱╱ +GET ge^← move cursor left a word        header  +GET ge move cursor right             ───────────╯ +▼ users/^→ move cursor right a word       Response ─╮ +GET ge delete character left         e +GET gehome go to start                   ━━━━━━━━━━━ +POS cr^a go to start                    +PUT upend go to end                      +DEL de^e go to end                      +del delete character right         +^d delete character right         + submit                         + +Press ESC to dismiss. +│───────────Note: This page relates to the widget that is  +This is ancurrently focused. +server we  +see exactl▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg b/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg index 91781e50..edf831c0 100644 --- a/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg +++ b/tests/__snapshots__/test_snapshots/TestJumpMode.test_click_switch.svg @@ -19,166 +19,167 @@ font-weight: 700; } - .terminal-1529731282-matrix { + .terminal-3341743032-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1529731282-title { + .terminal-3341743032-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1529731282-r1 { fill: #dfdfe1 } -.terminal-1529731282-r2 { fill: #c5c8c6 } -.terminal-1529731282-r3 { fill: #ff93dd } -.terminal-1529731282-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1529731282-r5 { fill: #15111e } -.terminal-1529731282-r6 { fill: #43365c } -.terminal-1529731282-r7 { fill: #737387 } -.terminal-1529731282-r8 { fill: #e1e1e6 } -.terminal-1529731282-r9 { fill: #efe3fb } -.terminal-1529731282-r10 { fill: #9f9fa5 } -.terminal-1529731282-r11 { fill: #632e53 } -.terminal-1529731282-r12 { fill: #ff69b4 } -.terminal-1529731282-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-1529731282-r14 { fill: #e3e3e8;font-weight: bold } -.terminal-1529731282-r15 { fill: #6a6a74 } -.terminal-1529731282-r16 { fill: #0ea5e9 } -.terminal-1529731282-r17 { fill: #873c69 } -.terminal-1529731282-r18 { fill: #22c55e } -.terminal-1529731282-r19 { fill: #30303b } -.terminal-1529731282-r20 { fill: #00fa9a;font-weight: bold } -.terminal-1529731282-r21 { fill: #8b8b93 } -.terminal-1529731282-r22 { fill: #8b8b93;font-weight: bold } -.terminal-1529731282-r23 { fill: #0d0e2e } -.terminal-1529731282-r24 { fill: #00b85f } -.terminal-1529731282-r25 { fill: #ef4444 } -.terminal-1529731282-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-1529731282-r27 { fill: #2e2e3c } -.terminal-1529731282-r28 { fill: #a0a0a6 } -.terminal-1529731282-r29 { fill: #191928 } -.terminal-1529731282-r30 { fill: #b74e87 } -.terminal-1529731282-r31 { fill: #87878f } -.terminal-1529731282-r32 { fill: #a3a3a9 } -.terminal-1529731282-r33 { fill: #777780 } -.terminal-1529731282-r34 { fill: #1f1f2d } -.terminal-1529731282-r35 { fill: #04b375;font-weight: bold } -.terminal-1529731282-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-1529731282-r37 { fill: #dbdbdd } + .terminal-3341743032-r1 { fill: #dfdfe1 } +.terminal-3341743032-r2 { fill: #c5c8c6 } +.terminal-3341743032-r3 { fill: #ff93dd } +.terminal-3341743032-r4 { fill: #15111e;text-decoration: underline; } +.terminal-3341743032-r5 { fill: #15111e } +.terminal-3341743032-r6 { fill: #43365c } +.terminal-3341743032-r7 { fill: #737387 } +.terminal-3341743032-r8 { fill: #e1e1e6 } +.terminal-3341743032-r9 { fill: #efe3fb } +.terminal-3341743032-r10 { fill: #9f9fa5 } +.terminal-3341743032-r11 { fill: #632e53 } +.terminal-3341743032-r12 { fill: #ff69b4 } +.terminal-3341743032-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-3341743032-r14 { fill: #e3e3e8;font-weight: bold } +.terminal-3341743032-r15 { fill: #0f0f1f } +.terminal-3341743032-r16 { fill: #6a6a74 } +.terminal-3341743032-r17 { fill: #0ea5e9 } +.terminal-3341743032-r18 { fill: #873c69 } +.terminal-3341743032-r19 { fill: #22c55e } +.terminal-3341743032-r20 { fill: #30303b } +.terminal-3341743032-r21 { fill: #00fa9a;font-weight: bold } +.terminal-3341743032-r22 { fill: #8b8b93 } +.terminal-3341743032-r23 { fill: #8b8b93;font-weight: bold } +.terminal-3341743032-r24 { fill: #0d0e2e } +.terminal-3341743032-r25 { fill: #00b85f } +.terminal-3341743032-r26 { fill: #ef4444 } +.terminal-3341743032-r27 { fill: #2e2e3c;font-weight: bold } +.terminal-3341743032-r28 { fill: #2e2e3c } +.terminal-3341743032-r29 { fill: #a0a0a6 } +.terminal-3341743032-r30 { fill: #191928 } +.terminal-3341743032-r31 { fill: #b74e87 } +.terminal-3341743032-r32 { fill: #87878f } +.terminal-3341743032-r33 { fill: #a3a3a9 } +.terminal-3341743032-r34 { fill: #777780 } +.terminal-3341743032-r35 { fill: #1f1f2d } +.terminal-3341743032-r36 { fill: #04b375;font-weight: bold } +.terminal-3341743032-r37 { fill: #ff7ec8;font-weight: bold } +.terminal-3341743032-r38 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echoadersBodyQueryAuthInfoScriptsOptions -GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━ -POS echo postX Follow redirects -▼ jsonplaceholder/ -▼ posts/X Verify SSL certificates -GET get all -GET get one╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesScriptsTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echoadersBodyQueryAuthInfoScriptsOptions +GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━ +POS echo postX Follow redirects +▼ jsonplaceholder/ +▼ posts/X Verify SSL certificates +GET get all +GET get one╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestJumpMode.test_focus_switch.svg b/tests/__snapshots__/test_snapshots/TestJumpMode.test_focus_switch.svg index 1fc84515..d50a0146 100644 --- a/tests/__snapshots__/test_snapshots/TestJumpMode.test_focus_switch.svg +++ b/tests/__snapshots__/test_snapshots/TestJumpMode.test_focus_switch.svg @@ -19,166 +19,167 @@ font-weight: 700; } - .terminal-3849372867-matrix { + .terminal-2748765789-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3849372867-title { + .terminal-2748765789-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3849372867-r1 { fill: #dfdfe1 } -.terminal-3849372867-r2 { fill: #c5c8c6 } -.terminal-3849372867-r3 { fill: #ff93dd } -.terminal-3849372867-r4 { fill: #15111e;text-decoration: underline; } -.terminal-3849372867-r5 { fill: #15111e } -.terminal-3849372867-r6 { fill: #43365c } -.terminal-3849372867-r7 { fill: #737387 } -.terminal-3849372867-r8 { fill: #e1e1e6 } -.terminal-3849372867-r9 { fill: #efe3fb } -.terminal-3849372867-r10 { fill: #9f9fa5 } -.terminal-3849372867-r11 { fill: #ff69b4 } -.terminal-3849372867-r12 { fill: #dfdfe1;font-weight: bold } -.terminal-3849372867-r13 { fill: #632e53 } -.terminal-3849372867-r14 { fill: #210d17;font-weight: bold } -.terminal-3849372867-r15 { fill: #6a6a74 } -.terminal-3849372867-r16 { fill: #0ea5e9 } -.terminal-3849372867-r17 { fill: #252532 } -.terminal-3849372867-r18 { fill: #22c55e } -.terminal-3849372867-r19 { fill: #252441 } -.terminal-3849372867-r20 { fill: #8b8b93 } -.terminal-3849372867-r21 { fill: #8b8b93;font-weight: bold } -.terminal-3849372867-r22 { fill: #0d0e2e } -.terminal-3849372867-r23 { fill: #00b85f } -.terminal-3849372867-r24 { fill: #918d9d } -.terminal-3849372867-r25 { fill: #ef4444 } -.terminal-3849372867-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-3849372867-r27 { fill: #2e2e3c } -.terminal-3849372867-r28 { fill: #a0a0a6 } -.terminal-3849372867-r29 { fill: #191928 } -.terminal-3849372867-r30 { fill: #b74e87 } -.terminal-3849372867-r31 { fill: #87878f } -.terminal-3849372867-r32 { fill: #a3a3a9 } -.terminal-3849372867-r33 { fill: #777780 } -.terminal-3849372867-r34 { fill: #1f1f2d } -.terminal-3849372867-r35 { fill: #04b375;font-weight: bold } -.terminal-3849372867-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-3849372867-r37 { fill: #dbdbdd } + .terminal-2748765789-r1 { fill: #dfdfe1 } +.terminal-2748765789-r2 { fill: #c5c8c6 } +.terminal-2748765789-r3 { fill: #ff93dd } +.terminal-2748765789-r4 { fill: #15111e;text-decoration: underline; } +.terminal-2748765789-r5 { fill: #15111e } +.terminal-2748765789-r6 { fill: #43365c } +.terminal-2748765789-r7 { fill: #737387 } +.terminal-2748765789-r8 { fill: #e1e1e6 } +.terminal-2748765789-r9 { fill: #efe3fb } +.terminal-2748765789-r10 { fill: #9f9fa5 } +.terminal-2748765789-r11 { fill: #ff69b4 } +.terminal-2748765789-r12 { fill: #dfdfe1;font-weight: bold } +.terminal-2748765789-r13 { fill: #632e53 } +.terminal-2748765789-r14 { fill: #210d17;font-weight: bold } +.terminal-2748765789-r15 { fill: #0f0f1f } +.terminal-2748765789-r16 { fill: #6a6a74 } +.terminal-2748765789-r17 { fill: #0ea5e9 } +.terminal-2748765789-r18 { fill: #252532 } +.terminal-2748765789-r19 { fill: #22c55e } +.terminal-2748765789-r20 { fill: #252441 } +.terminal-2748765789-r21 { fill: #8b8b93 } +.terminal-2748765789-r22 { fill: #8b8b93;font-weight: bold } +.terminal-2748765789-r23 { fill: #0d0e2e } +.terminal-2748765789-r24 { fill: #00b85f } +.terminal-2748765789-r25 { fill: #918d9d } +.terminal-2748765789-r26 { fill: #ef4444 } +.terminal-2748765789-r27 { fill: #2e2e3c;font-weight: bold } +.terminal-2748765789-r28 { fill: #2e2e3c } +.terminal-2748765789-r29 { fill: #a0a0a6 } +.terminal-2748765789-r30 { fill: #191928 } +.terminal-2748765789-r31 { fill: #b74e87 } +.terminal-2748765789-r32 { fill: #87878f } +.terminal-2748765789-r33 { fill: #a3a3a9 } +.terminal-2748765789-r34 { fill: #777780 } +.terminal-2748765789-r35 { fill: #1f1f2d } +.terminal-2748765789-r36 { fill: #04b375;font-weight: bold } +.terminal-2748765789-r37 { fill: #ff7ec8;font-weight: bold } +.terminal-2748765789-r38 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echoHeadersBodyQueryAuthInfoScriptsOptio -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get allNameValue Add header  -GET get one╰─────────────────────────────────────────────────╯ -POS create╭────────────────────────────────────── Response ─╮ -DEL delete a postBodyHeadersCookiesScriptsTrace -───────────────────────━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo  -server we can use to  -see exactly what  -request is being  -sent.1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get allNameValue Add header  +GET get one╰─────────────────────────────────────────────────╯ +POS create╭────────────────────────────────────── Response ─╮ +DEL delete a postBodyHeadersCookiesScriptsTrace +───────────────────────━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo  +server we can use to  +see exactly what  +request is being  +sent.1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump diff --git a/tests/__snapshots__/test_snapshots/TestJumpMode.test_loads.svg b/tests/__snapshots__/test_snapshots/TestJumpMode.test_loads.svg index c0d291a0..54bb5db3 100644 --- a/tests/__snapshots__/test_snapshots/TestJumpMode.test_loads.svg +++ b/tests/__snapshots__/test_snapshots/TestJumpMode.test_loads.svg @@ -19,171 +19,172 @@ font-weight: 700; } - .terminal-3355451680-matrix { + .terminal-3231724221-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3355451680-title { + .terminal-3231724221-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3355451680-r1 { fill: #9c9c9d } -.terminal-3355451680-r2 { fill: #c5c8c6 } -.terminal-3355451680-r3 { fill: #dfdfe0 } -.terminal-3355451680-r4 { fill: #b2669a } -.terminal-3355451680-r5 { fill: #21131c;font-weight: bold } -.terminal-3355451680-r6 { fill: #0e0b15;text-decoration: underline; } -.terminal-3355451680-r7 { fill: #0e0b15 } -.terminal-3355451680-r8 { fill: #2e2540 } -.terminal-3355451680-r9 { fill: #50505e } -.terminal-3355451680-r10 { fill: #9d9da1 } -.terminal-3355451680-r11 { fill: #a79eaf } -.terminal-3355451680-r12 { fill: #6f6f73 } -.terminal-3355451680-r13 { fill: #45203a } -.terminal-3355451680-r14 { fill: #9e9ea2;font-weight: bold } -.terminal-3355451680-r15 { fill: #9c9c9d;font-weight: bold } -.terminal-3355451680-r16 { fill: #4a4a51 } -.terminal-3355451680-r17 { fill: #0973a3 } -.terminal-3355451680-r18 { fill: #191923 } -.terminal-3355451680-r19 { fill: #b2497e } -.terminal-3355451680-r20 { fill: #178941 } -.terminal-3355451680-r21 { fill: #19192d } -.terminal-3355451680-r22 { fill: #616166 } -.terminal-3355451680-r23 { fill: #616166;font-weight: bold } -.terminal-3355451680-r24 { fill: #090920 } -.terminal-3355451680-r25 { fill: #008042 } -.terminal-3355451680-r26 { fill: #65626d } -.terminal-3355451680-r27 { fill: #a72f2f } -.terminal-3355451680-r28 { fill: #20202a;font-weight: bold } -.terminal-3355451680-r29 { fill: #20202a } -.terminal-3355451680-r30 { fill: #707074 } -.terminal-3355451680-r31 { fill: #11111c } -.terminal-3355451680-r32 { fill: #80365e } -.terminal-3355451680-r33 { fill: #5e5e64 } -.terminal-3355451680-r34 { fill: #727276 } -.terminal-3355451680-r35 { fill: #535359 } -.terminal-3355451680-r36 { fill: #15151f } -.terminal-3355451680-r37 { fill: #027d51;font-weight: bold } -.terminal-3355451680-r38 { fill: #d13c8c } -.terminal-3355451680-r39 { fill: #210d17 } -.terminal-3355451680-r40 { fill: #707077 } -.terminal-3355451680-r41 { fill: #707077;font-weight: bold } + .terminal-3231724221-r1 { fill: #9c9c9d } +.terminal-3231724221-r2 { fill: #c5c8c6 } +.terminal-3231724221-r3 { fill: #dfdfe0 } +.terminal-3231724221-r4 { fill: #b2669a } +.terminal-3231724221-r5 { fill: #21131c;font-weight: bold } +.terminal-3231724221-r6 { fill: #0e0b15;text-decoration: underline; } +.terminal-3231724221-r7 { fill: #0e0b15 } +.terminal-3231724221-r8 { fill: #2e2540 } +.terminal-3231724221-r9 { fill: #50505e } +.terminal-3231724221-r10 { fill: #9d9da1 } +.terminal-3231724221-r11 { fill: #a79eaf } +.terminal-3231724221-r12 { fill: #6f6f73 } +.terminal-3231724221-r13 { fill: #45203a } +.terminal-3231724221-r14 { fill: #9e9ea2;font-weight: bold } +.terminal-3231724221-r15 { fill: #0a0a15 } +.terminal-3231724221-r16 { fill: #9c9c9d;font-weight: bold } +.terminal-3231724221-r17 { fill: #4a4a51 } +.terminal-3231724221-r18 { fill: #0973a3 } +.terminal-3231724221-r19 { fill: #191923 } +.terminal-3231724221-r20 { fill: #b2497e } +.terminal-3231724221-r21 { fill: #178941 } +.terminal-3231724221-r22 { fill: #19192d } +.terminal-3231724221-r23 { fill: #616166 } +.terminal-3231724221-r24 { fill: #616166;font-weight: bold } +.terminal-3231724221-r25 { fill: #090920 } +.terminal-3231724221-r26 { fill: #008042 } +.terminal-3231724221-r27 { fill: #65626d } +.terminal-3231724221-r28 { fill: #a72f2f } +.terminal-3231724221-r29 { fill: #20202a;font-weight: bold } +.terminal-3231724221-r30 { fill: #20202a } +.terminal-3231724221-r31 { fill: #707074 } +.terminal-3231724221-r32 { fill: #11111c } +.terminal-3231724221-r33 { fill: #80365e } +.terminal-3231724221-r34 { fill: #5e5e64 } +.terminal-3231724221-r35 { fill: #727276 } +.terminal-3231724221-r36 { fill: #535359 } +.terminal-3231724221-r37 { fill: #15151f } +.terminal-3231724221-r38 { fill: #027d51;font-weight: bold } +.terminal-3231724221-r39 { fill: #d13c8c } +.terminal-3231724221-r40 { fill: #210d17 } +.terminal-3231724221-r41 { fill: #707077 } +.terminal-3231724221-r42 { fill: #707077;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                    - -1GET2Enter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -tabT echo││qHeaderswBodyeQueryrAuthtInfoyScriptsuOptio -GET get random user  ││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post        ││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all      ││NameValue Add header  -GET get one      │╰─────────────────────────────────────────────────╯ -POS create       │╭────────────────────────────────────── Response ─╮ -DEL delete a post││aBodysHeadersdCookiesfScriptsgTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱Press a key to jump╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -ESC to dismiss                                  + + +Posting                                                                    + +1GET2Enter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +tabT echo││qHeaderswBodyeQueryrAuthtInfoyScriptsuOptio +GET get random user  ││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post        ││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all      ││NameValue Add header  +GET get one      │╰─────────────────────────────────────────────────╯ +POS create       │╭────────────────────────────────────── Response ─╮ +DEL delete a post││aBodysHeadersdCookiesfScriptsgTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱Press a key to jump╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +ESC to dismiss                                  diff --git a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__query_params.svg b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__query_params.svg index a62d9117..2036d094 100644 --- a/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__query_params.svg +++ b/tests/__snapshots__/test_snapshots/TestLoadingRequest.test_request_loaded_into_view__query_params.svg @@ -19,214 +19,214 @@ font-weight: 700; } - .terminal-1427682135-matrix { + .terminal-1114639255-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1427682135-title { + .terminal-1114639255-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1427682135-r1 { fill: #dfdfe1 } -.terminal-1427682135-r2 { fill: #c5c8c6 } -.terminal-1427682135-r3 { fill: #ff93dd } -.terminal-1427682135-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1427682135-r5 { fill: #15111e } -.terminal-1427682135-r6 { fill: #43365c } -.terminal-1427682135-r7 { fill: #ff69b4 } -.terminal-1427682135-r8 { fill: #9393a3 } -.terminal-1427682135-r9 { fill: #a684e8 } -.terminal-1427682135-r10 { fill: #e1e1e6 } -.terminal-1427682135-r11 { fill: #efe3fb } -.terminal-1427682135-r12 { fill: #9f9fa5 } -.terminal-1427682135-r13 { fill: #632e53 } -.terminal-1427682135-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-1427682135-r15 { fill: #0ea5e9 } -.terminal-1427682135-r16 { fill: #6a6a74 } -.terminal-1427682135-r17 { fill: #58d1eb;font-weight: bold } -.terminal-1427682135-r18 { fill: #873c69 } -.terminal-1427682135-r19 { fill: #22c55e } -.terminal-1427682135-r20 { fill: #0f0f1f } -.terminal-1427682135-r21 { fill: #ede2f7 } -.terminal-1427682135-r22 { fill: #e1e0e4 } -.terminal-1427682135-r23 { fill: #e2e0e5 } -.terminal-1427682135-r24 { fill: #8b8b93 } -.terminal-1427682135-r25 { fill: #8b8b93;font-weight: bold } -.terminal-1427682135-r26 { fill: #e9e1f1 } -.terminal-1427682135-r27 { fill: #00b85f } -.terminal-1427682135-r28 { fill: #ef4444 } -.terminal-1427682135-r29 { fill: #737387 } -.terminal-1427682135-r30 { fill: #918d9d } -.terminal-1427682135-r31 { fill: #e3e3e8;font-weight: bold } -.terminal-1427682135-r32 { fill: #f59e0b } -.terminal-1427682135-r33 { fill: #2e2e3c;font-weight: bold } -.terminal-1427682135-r34 { fill: #2e2e3c } -.terminal-1427682135-r35 { fill: #a0a0a6 } -.terminal-1427682135-r36 { fill: #191928 } -.terminal-1427682135-r37 { fill: #b74e87 } -.terminal-1427682135-r38 { fill: #0d0e2e } -.terminal-1427682135-r39 { fill: #87878f } -.terminal-1427682135-r40 { fill: #a3a3a9 } -.terminal-1427682135-r41 { fill: #777780 } -.terminal-1427682135-r42 { fill: #1f1f2d } -.terminal-1427682135-r43 { fill: #04b375;font-weight: bold } -.terminal-1427682135-r44 { fill: #ff7ec8;font-weight: bold } -.terminal-1427682135-r45 { fill: #dbdbdd } + .terminal-1114639255-r1 { fill: #dfdfe1 } +.terminal-1114639255-r2 { fill: #c5c8c6 } +.terminal-1114639255-r3 { fill: #ff93dd } +.terminal-1114639255-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1114639255-r5 { fill: #15111e } +.terminal-1114639255-r6 { fill: #43365c } +.terminal-1114639255-r7 { fill: #ff69b4 } +.terminal-1114639255-r8 { fill: #9393a3 } +.terminal-1114639255-r9 { fill: #a684e8 } +.terminal-1114639255-r10 { fill: #e1e1e6 } +.terminal-1114639255-r11 { fill: #efe3fb } +.terminal-1114639255-r12 { fill: #9f9fa5 } +.terminal-1114639255-r13 { fill: #632e53 } +.terminal-1114639255-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-1114639255-r15 { fill: #0ea5e9 } +.terminal-1114639255-r16 { fill: #0f0f1f } +.terminal-1114639255-r17 { fill: #6a6a74 } +.terminal-1114639255-r18 { fill: #58d1eb;font-weight: bold } +.terminal-1114639255-r19 { fill: #873c69 } +.terminal-1114639255-r20 { fill: #22c55e } +.terminal-1114639255-r21 { fill: #ede2f7 } +.terminal-1114639255-r22 { fill: #e1e0e4 } +.terminal-1114639255-r23 { fill: #e2e0e5 } +.terminal-1114639255-r24 { fill: #8b8b93 } +.terminal-1114639255-r25 { fill: #8b8b93;font-weight: bold } +.terminal-1114639255-r26 { fill: #e9e1f1 } +.terminal-1114639255-r27 { fill: #00b85f } +.terminal-1114639255-r28 { fill: #ef4444 } +.terminal-1114639255-r29 { fill: #737387 } +.terminal-1114639255-r30 { fill: #918d9d } +.terminal-1114639255-r31 { fill: #e3e3e8;font-weight: bold } +.terminal-1114639255-r32 { fill: #f59e0b } +.terminal-1114639255-r33 { fill: #2e2e3c;font-weight: bold } +.terminal-1114639255-r34 { fill: #2e2e3c } +.terminal-1114639255-r35 { fill: #a0a0a6 } +.terminal-1114639255-r36 { fill: #191928 } +.terminal-1114639255-r37 { fill: #b74e87 } +.terminal-1114639255-r38 { fill: #0d0e2e } +.terminal-1114639255-r39 { fill: #87878f } +.terminal-1114639255-r40 { fill: #a3a3a9 } +.terminal-1114639255-r41 { fill: #777780 } +.terminal-1114639255-r42 { fill: #1f1f2d } +.terminal-1114639255-r43 { fill: #04b375;font-weight: bold } +.terminal-1114639255-r44 { fill: #ff7ec8;font-weight: bold } +.terminal-1114639255-r45 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                    - -GEThttps://jsonplaceholder.typicode.com/comments       Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoScriptsOpt -GET get random user━━━━━━━━━━━━━━━━╸━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post postId                            1       -▼ jsonplaceholder/ foo                               bar     -▼ posts/ beep                              boop    -GET get all onetwothree                       123     -GET get one areallyreallyreallyreallylongkey  avalue  -POS create -DEL delete a post -▼ comments/ -GET get commentKeyValue Add   -█ GET get commen╰─────────────────────────────────────────────────╯ -PUT edit a comm│╭────────────────────────────────────── Response ─╮ -▼ todos/││BodyHeadersCookiesScriptsTrace -GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get one││ -▼ users/││ -GET get a user││ -GET get all users││ -POS create a user││ -PUT update a user││ -│───────────────────────││ -Retrieve the comments││ -for a post using the ││ -query string││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + +Posting                                                                    + +GEThttps://jsonplaceholder.typicode.com/comments       Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOpt +GET get random user━━━━━━━━━━━━━━━━╸━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post postId                            1       +▼ jsonplaceholder/ foo                               bar     +▼ posts/ beep                              boop    +GET get all onetwothree                       123     +GET get one areallyreallyreallyreallylongkey  avalue  +POS create +DEL delete a post +▼ comments/ +GET get commentKeyValue Add   +█ GET get commen╰─────────────────────────────────────────────────╯ +PUT edit a comm│╭────────────────────────────────────── Response ─╮ +▼ todos/││BodyHeadersCookiesScriptsTrace +GET get all││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get one││ +▼ users/││ +GET get a user││ +GET get all users││ +POS create a user││ +PUT update a user││ +│───────────────────────││ +Retrieve the comments││ +for a post using the ││ +query string││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestMethodSelection.test_select_post_method.svg b/tests/__snapshots__/test_snapshots/TestMethodSelection.test_select_post_method.svg index bf1cbbab..f07dfbbb 100644 --- a/tests/__snapshots__/test_snapshots/TestMethodSelection.test_select_post_method.svg +++ b/tests/__snapshots__/test_snapshots/TestMethodSelection.test_select_post_method.svg @@ -19,166 +19,167 @@ font-weight: 700; } - .terminal-928820218-matrix { + .terminal-1642642836-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-928820218-title { + .terminal-1642642836-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-928820218-r1 { fill: #dfdfe1 } -.terminal-928820218-r2 { fill: #c5c8c6 } -.terminal-928820218-r3 { fill: #ff93dd } -.terminal-928820218-r4 { fill: #21101a;text-decoration: underline; } -.terminal-928820218-r5 { fill: #21101a } -.terminal-928820218-r6 { fill: #663250 } -.terminal-928820218-r7 { fill: #737387 } -.terminal-928820218-r8 { fill: #e1e1e6 } -.terminal-928820218-r9 { fill: #efe3fb } -.terminal-928820218-r10 { fill: #9f9fa5 } -.terminal-928820218-r11 { fill: #632e53 } -.terminal-928820218-r12 { fill: #e3e3e8;font-weight: bold } -.terminal-928820218-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-928820218-r14 { fill: #6a6a74 } -.terminal-928820218-r15 { fill: #0ea5e9 } -.terminal-928820218-r16 { fill: #252532 } -.terminal-928820218-r17 { fill: #ff69b4 } -.terminal-928820218-r18 { fill: #22c55e } -.terminal-928820218-r19 { fill: #252441 } -.terminal-928820218-r20 { fill: #8b8b93 } -.terminal-928820218-r21 { fill: #8b8b93;font-weight: bold } -.terminal-928820218-r22 { fill: #0d0e2e } -.terminal-928820218-r23 { fill: #00b85f } -.terminal-928820218-r24 { fill: #918d9d } -.terminal-928820218-r25 { fill: #ef4444 } -.terminal-928820218-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-928820218-r27 { fill: #2e2e3c } -.terminal-928820218-r28 { fill: #a0a0a6 } -.terminal-928820218-r29 { fill: #191928 } -.terminal-928820218-r30 { fill: #b74e87 } -.terminal-928820218-r31 { fill: #87878f } -.terminal-928820218-r32 { fill: #a3a3a9 } -.terminal-928820218-r33 { fill: #777780 } -.terminal-928820218-r34 { fill: #1f1f2d } -.terminal-928820218-r35 { fill: #04b375;font-weight: bold } -.terminal-928820218-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-928820218-r37 { fill: #dbdbdd } + .terminal-1642642836-r1 { fill: #dfdfe1 } +.terminal-1642642836-r2 { fill: #c5c8c6 } +.terminal-1642642836-r3 { fill: #ff93dd } +.terminal-1642642836-r4 { fill: #21101a;text-decoration: underline; } +.terminal-1642642836-r5 { fill: #21101a } +.terminal-1642642836-r6 { fill: #663250 } +.terminal-1642642836-r7 { fill: #737387 } +.terminal-1642642836-r8 { fill: #e1e1e6 } +.terminal-1642642836-r9 { fill: #efe3fb } +.terminal-1642642836-r10 { fill: #9f9fa5 } +.terminal-1642642836-r11 { fill: #632e53 } +.terminal-1642642836-r12 { fill: #e3e3e8;font-weight: bold } +.terminal-1642642836-r13 { fill: #0f0f1f } +.terminal-1642642836-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-1642642836-r15 { fill: #6a6a74 } +.terminal-1642642836-r16 { fill: #0ea5e9 } +.terminal-1642642836-r17 { fill: #252532 } +.terminal-1642642836-r18 { fill: #ff69b4 } +.terminal-1642642836-r19 { fill: #22c55e } +.terminal-1642642836-r20 { fill: #252441 } +.terminal-1642642836-r21 { fill: #8b8b93 } +.terminal-1642642836-r22 { fill: #8b8b93;font-weight: bold } +.terminal-1642642836-r23 { fill: #0d0e2e } +.terminal-1642642836-r24 { fill: #00b85f } +.terminal-1642642836-r25 { fill: #918d9d } +.terminal-1642642836-r26 { fill: #ef4444 } +.terminal-1642642836-r27 { fill: #2e2e3c;font-weight: bold } +.terminal-1642642836-r28 { fill: #2e2e3c } +.terminal-1642642836-r29 { fill: #a0a0a6 } +.terminal-1642642836-r30 { fill: #191928 } +.terminal-1642642836-r31 { fill: #b74e87 } +.terminal-1642642836-r32 { fill: #87878f } +.terminal-1642642836-r33 { fill: #a3a3a9 } +.terminal-1642642836-r34 { fill: #777780 } +.terminal-1642642836-r35 { fill: #1f1f2d } +.terminal-1642642836-r36 { fill: #04b375;font-weight: bold } +.terminal-1642642836-r37 { fill: #ff7ec8;font-weight: bold } +.terminal-1642642836-r38 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                    - -POSTEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoScriptsOptio -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesScriptsTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + +Posting                                                                    + +POSTEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echo││HeadersBodyQueryAuthInfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestNewRequest.test_dialog_loads_and_can_be_used.svg b/tests/__snapshots__/test_snapshots/TestNewRequest.test_dialog_loads_and_can_be_used.svg index e12c3923..889d47f4 100644 --- a/tests/__snapshots__/test_snapshots/TestNewRequest.test_dialog_loads_and_can_be_used.svg +++ b/tests/__snapshots__/test_snapshots/TestNewRequest.test_dialog_loads_and_can_be_used.svg @@ -19,175 +19,175 @@ font-weight: 700; } - .terminal-789658086-matrix { + .terminal-2722473803-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-789658086-title { + .terminal-2722473803-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-789658086-r1 { fill: #9c9c9d } -.terminal-789658086-r2 { fill: #c5c8c6 } -.terminal-789658086-r3 { fill: #dfdfe0 } -.terminal-789658086-r4 { fill: #b2669a } -.terminal-789658086-r5 { fill: #0e0b15;text-decoration: underline; } -.terminal-789658086-r6 { fill: #0e0b15 } -.terminal-789658086-r7 { fill: #2e2540 } -.terminal-789658086-r8 { fill: #50505e } -.terminal-789658086-r9 { fill: #2e2e3f } -.terminal-789658086-r10 { fill: #dfdfe1;font-weight: bold } -.terminal-789658086-r11 { fill: #9d9da1 } -.terminal-789658086-r12 { fill: #a79eaf } -.terminal-789658086-r13 { fill: #6f6f73 } -.terminal-789658086-r14 { fill: #0f0f1f } -.terminal-789658086-r15 { fill: #45203a } -.terminal-789658086-r16 { fill: #dfdfe1 } -.terminal-789658086-r17 { fill: #0973a3 } -.terminal-789658086-r18 { fill: #e1e1e6 } -.terminal-789658086-r19 { fill: #4a4a51 } -.terminal-789658086-r20 { fill: #191923 } -.terminal-789658086-r21 { fill: #178941 } -.terminal-789658086-r22 { fill: #8b8b93 } -.terminal-789658086-r23 { fill: #19192d } -.terminal-789658086-r24 { fill: #616166 } -.terminal-789658086-r25 { fill: #616166;font-weight: bold } -.terminal-789658086-r26 { fill: #a5a5b2 } -.terminal-789658086-r27 { fill: #008042 } -.terminal-789658086-r28 { fill: #9e9ea2;font-weight: bold } -.terminal-789658086-r29 { fill: #65626d } -.terminal-789658086-r30 { fill: #403e62 } -.terminal-789658086-r31 { fill: #e3e3e8 } -.terminal-789658086-r32 { fill: #e5e4e9 } -.terminal-789658086-r33 { fill: #210d17 } -.terminal-789658086-r34 { fill: #a72f2f } -.terminal-789658086-r35 { fill: #0d0e2e } -.terminal-789658086-r36 { fill: #20202a } -.terminal-789658086-r37 { fill: #707074 } -.terminal-789658086-r38 { fill: #11111c } -.terminal-789658086-r39 { fill: #ab6e07 } -.terminal-789658086-r40 { fill: #5e5e64 } -.terminal-789658086-r41 { fill: #727276 } -.terminal-789658086-r42 { fill: #535359 } -.terminal-789658086-r43 { fill: #15151f } -.terminal-789658086-r44 { fill: #027d51;font-weight: bold } -.terminal-789658086-r45 { fill: #ff7ec8;font-weight: bold } -.terminal-789658086-r46 { fill: #dadadb } + .terminal-2722473803-r1 { fill: #9c9c9d } +.terminal-2722473803-r2 { fill: #c5c8c6 } +.terminal-2722473803-r3 { fill: #dfdfe0 } +.terminal-2722473803-r4 { fill: #b2669a } +.terminal-2722473803-r5 { fill: #0e0b15;text-decoration: underline; } +.terminal-2722473803-r6 { fill: #0e0b15 } +.terminal-2722473803-r7 { fill: #2e2540 } +.terminal-2722473803-r8 { fill: #50505e } +.terminal-2722473803-r9 { fill: #2e2e3f } +.terminal-2722473803-r10 { fill: #dfdfe1;font-weight: bold } +.terminal-2722473803-r11 { fill: #9d9da1 } +.terminal-2722473803-r12 { fill: #a79eaf } +.terminal-2722473803-r13 { fill: #6f6f73 } +.terminal-2722473803-r14 { fill: #0f0f1f } +.terminal-2722473803-r15 { fill: #45203a } +.terminal-2722473803-r16 { fill: #dfdfe1 } +.terminal-2722473803-r17 { fill: #0973a3 } +.terminal-2722473803-r18 { fill: #e1e1e6 } +.terminal-2722473803-r19 { fill: #4a4a51 } +.terminal-2722473803-r20 { fill: #191923 } +.terminal-2722473803-r21 { fill: #178941 } +.terminal-2722473803-r22 { fill: #8b8b93 } +.terminal-2722473803-r23 { fill: #19192d } +.terminal-2722473803-r24 { fill: #616166 } +.terminal-2722473803-r25 { fill: #616166;font-weight: bold } +.terminal-2722473803-r26 { fill: #a5a5b2 } +.terminal-2722473803-r27 { fill: #008042 } +.terminal-2722473803-r28 { fill: #9e9ea2;font-weight: bold } +.terminal-2722473803-r29 { fill: #65626d } +.terminal-2722473803-r30 { fill: #403e62 } +.terminal-2722473803-r31 { fill: #e3e3e8 } +.terminal-2722473803-r32 { fill: #e5e4e9 } +.terminal-2722473803-r33 { fill: #210d17 } +.terminal-2722473803-r34 { fill: #a72f2f } +.terminal-2722473803-r35 { fill: #0d0e2e } +.terminal-2722473803-r36 { fill: #20202a } +.terminal-2722473803-r37 { fill: #707074 } +.terminal-2722473803-r38 { fill: #11111c } +.terminal-2722473803-r39 { fill: #ab6e07 } +.terminal-2722473803-r40 { fill: #5e5e64 } +.terminal-2722473803-r41 { fill: #727276 } +.terminal-2722473803-r42 { fill: #535359 } +.terminal-2722473803-r43 { fill: #15151f } +.terminal-2722473803-r44 { fill: #027d51;font-weight: bold } +.terminal-2722473803-r45 { fill: #ff7ec8;font-weight: bold } +.terminal-2722473803-r46 { fill: #dadadb } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                    - -GETEnter▁▁ New request ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ Send  - -╭─ Collection ────Title                            ─────── Request ─╮ -GET echo        foo                            oScriptsOptio -GET get random u━━━━━━━━━━━━━━━━━ -POS echo post   File name optional╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholderfoo               .posting.yamlrs.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all Description optional Add header  -GET get one bar─────────────────╯ -POS create  ────── Response ─╮ -DEL delete aDirectory                        Trace -▼ comments/jsonplaceholder/posts          ━━━━━━━━━━━━━━━━━ -GET get co -GET get co▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ -PUT edit a comm││ -▼ todos/││ -GET get all      ││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - f3 Pager  f4 Editor  esc Cancel  ^n Create  + + +Posting                                                                    + +GETEnter▁▁ New request ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ Send  + +╭─ Collection ────Title                            ─────── Request ─╮ +GET echo        foo                            oScriptsOptio +GET get random u━━━━━━━━━━━━━━━━━ +POS echo post   File name optional╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholderfoo               .posting.yamlrs.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all Description optional Add header  +GET get one bar─────────────────╯ +POS create  ────── Response ─╮ +DEL delete aDirectory                        Trace +▼ comments/jsonplaceholder/posts          ━━━━━━━━━━━━━━━━━ +GET get co +GET get co▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +PUT edit a comm││ +▼ todos/││ +GET get all      ││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + f3 Pager  f4 Editor  esc Cancel  ^n Create  diff --git a/tests/__snapshots__/test_snapshots/TestNewRequest.test_new_request_added_to_tree_correctly_and_notification_shown.svg b/tests/__snapshots__/test_snapshots/TestNewRequest.test_new_request_added_to_tree_correctly_and_notification_shown.svg index aa89a3f1..7386178e 100644 --- a/tests/__snapshots__/test_snapshots/TestNewRequest.test_new_request_added_to_tree_correctly_and_notification_shown.svg +++ b/tests/__snapshots__/test_snapshots/TestNewRequest.test_new_request_added_to_tree_correctly_and_notification_shown.svg @@ -19,164 +19,165 @@ font-weight: 700; } - .terminal-3433822046-matrix { + .terminal-4182121337-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3433822046-title { + .terminal-4182121337-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3433822046-r1 { fill: #dfdfe1 } -.terminal-3433822046-r2 { fill: #c5c8c6 } -.terminal-3433822046-r3 { fill: #ff93dd } -.terminal-3433822046-r4 { fill: #15111e;text-decoration: underline; } -.terminal-3433822046-r5 { fill: #15111e } -.terminal-3433822046-r6 { fill: #43365c } -.terminal-3433822046-r7 { fill: #737387 } -.terminal-3433822046-r8 { fill: #e1e1e6 } -.terminal-3433822046-r9 { fill: #efe3fb } -.terminal-3433822046-r10 { fill: #9f9fa5 } -.terminal-3433822046-r11 { fill: #ff69b4 } -.terminal-3433822046-r12 { fill: #dfdfe1;font-weight: bold } -.terminal-3433822046-r13 { fill: #632e53 } -.terminal-3433822046-r14 { fill: #0ea5e9 } -.terminal-3433822046-r15 { fill: #6a6a74 } -.terminal-3433822046-r16 { fill: #252532 } -.terminal-3433822046-r17 { fill: #22c55e } -.terminal-3433822046-r18 { fill: #252441 } -.terminal-3433822046-r19 { fill: #8b8b93 } -.terminal-3433822046-r20 { fill: #8b8b93;font-weight: bold } -.terminal-3433822046-r21 { fill: #00b85f } -.terminal-3433822046-r22 { fill: #210d17;font-weight: bold } -.terminal-3433822046-r23 { fill: #918d9d } -.terminal-3433822046-r24 { fill: #0d0e2e } -.terminal-3433822046-r25 { fill: #2e2e3c;font-weight: bold } -.terminal-3433822046-r26 { fill: #2e2e3c } -.terminal-3433822046-r27 { fill: #a0a0a6 } -.terminal-3433822046-r28 { fill: #ef4444 } -.terminal-3433822046-r29 { fill: #191928 } -.terminal-3433822046-r30 { fill: #b74e87 } -.terminal-3433822046-r31 { fill: #0cfa9f } -.terminal-3433822046-r32 { fill: #0ce48c;font-weight: bold } -.terminal-3433822046-r33 { fill: #e3e3e6 } -.terminal-3433822046-r34 { fill: #ff7ec8;font-weight: bold } -.terminal-3433822046-r35 { fill: #dbdbdd } + .terminal-4182121337-r1 { fill: #dfdfe1 } +.terminal-4182121337-r2 { fill: #c5c8c6 } +.terminal-4182121337-r3 { fill: #ff93dd } +.terminal-4182121337-r4 { fill: #15111e;text-decoration: underline; } +.terminal-4182121337-r5 { fill: #15111e } +.terminal-4182121337-r6 { fill: #43365c } +.terminal-4182121337-r7 { fill: #737387 } +.terminal-4182121337-r8 { fill: #e1e1e6 } +.terminal-4182121337-r9 { fill: #efe3fb } +.terminal-4182121337-r10 { fill: #9f9fa5 } +.terminal-4182121337-r11 { fill: #ff69b4 } +.terminal-4182121337-r12 { fill: #dfdfe1;font-weight: bold } +.terminal-4182121337-r13 { fill: #632e53 } +.terminal-4182121337-r14 { fill: #0ea5e9 } +.terminal-4182121337-r15 { fill: #0f0f1f } +.terminal-4182121337-r16 { fill: #6a6a74 } +.terminal-4182121337-r17 { fill: #252532 } +.terminal-4182121337-r18 { fill: #22c55e } +.terminal-4182121337-r19 { fill: #252441 } +.terminal-4182121337-r20 { fill: #8b8b93 } +.terminal-4182121337-r21 { fill: #8b8b93;font-weight: bold } +.terminal-4182121337-r22 { fill: #00b85f } +.terminal-4182121337-r23 { fill: #210d17;font-weight: bold } +.terminal-4182121337-r24 { fill: #918d9d } +.terminal-4182121337-r25 { fill: #0d0e2e } +.terminal-4182121337-r26 { fill: #2e2e3c;font-weight: bold } +.terminal-4182121337-r27 { fill: #2e2e3c } +.terminal-4182121337-r28 { fill: #a0a0a6 } +.terminal-4182121337-r29 { fill: #ef4444 } +.terminal-4182121337-r30 { fill: #191928 } +.terminal-4182121337-r31 { fill: #b74e87 } +.terminal-4182121337-r32 { fill: #0cfa9f } +.terminal-4182121337-r33 { fill: #0ce48c;font-weight: bold } +.terminal-4182121337-r34 { fill: #e3e3e6 } +.terminal-4182121337-r35 { fill: #ff7ec8;font-weight: bold } +.terminal-4182121337-r36 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoScriptsOptio -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -█ GET fooNameValue Add header  -GET get all╰─────────────────────────────────────────────────╯ -GET get one╭────────────────────────────────────── Response ─╮ -POS createBodyHeadersCookiesScriptsTrace -DEL delete a post━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -▼ comments/ -GET get comment -GET get comment -───────────────────────Request saved -barjsonplaceholder/posts/foo.posting.ya -╰── sample-collections ─╯╰───────────ml - d Dupe  ⌫ Delete  ^j Send  ^t Method + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +█ GET fooNameValue Add header  +GET get all╰─────────────────────────────────────────────────╯ +GET get one╭────────────────────────────────────── Response ─╮ +POS createBodyHeadersCookiesScriptsTrace +DEL delete a post━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +▼ comments/ +GET get comment +GET get comment +───────────────────────Request saved +barjsonplaceholder/posts/foo.posting.ya +╰── sample-collections ─╯╰────────────ml + d Dupe  ⌫ Delete  ^j Send  ^t Method  diff --git a/tests/__snapshots__/test_snapshots/TestSave.test_no_request_selected__dialog_is_prefilled_correctly.svg b/tests/__snapshots__/test_snapshots/TestSave.test_no_request_selected__dialog_is_prefilled_correctly.svg index f5f9f3bc..fe91829f 100644 --- a/tests/__snapshots__/test_snapshots/TestSave.test_no_request_selected__dialog_is_prefilled_correctly.svg +++ b/tests/__snapshots__/test_snapshots/TestSave.test_no_request_selected__dialog_is_prefilled_correctly.svg @@ -19,175 +19,176 @@ font-weight: 700; } - .terminal-1299397484-matrix { + .terminal-3331567905-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1299397484-title { + .terminal-3331567905-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1299397484-r1 { fill: #9c9c9d } -.terminal-1299397484-r2 { fill: #c5c8c6 } -.terminal-1299397484-r3 { fill: #dfdfe0 } -.terminal-1299397484-r4 { fill: #b2669a } -.terminal-1299397484-r5 { fill: #0e0b15;text-decoration: underline; } -.terminal-1299397484-r6 { fill: #0e0b15 } -.terminal-1299397484-r7 { fill: #2e2540 } -.terminal-1299397484-r8 { fill: #50505e } -.terminal-1299397484-r9 { fill: #2e2e3f } -.terminal-1299397484-r10 { fill: #dfdfe1;font-weight: bold } -.terminal-1299397484-r11 { fill: #9d9da1 } -.terminal-1299397484-r12 { fill: #a79eaf } -.terminal-1299397484-r13 { fill: #6f6f73 } -.terminal-1299397484-r14 { fill: #0f0f1f } -.terminal-1299397484-r15 { fill: #45203a } -.terminal-1299397484-r16 { fill: #dfdfe1 } -.terminal-1299397484-r17 { fill: #0973a3 } -.terminal-1299397484-r18 { fill: #403e62 } -.terminal-1299397484-r19 { fill: #e3e3e8 } -.terminal-1299397484-r20 { fill: #210d17 } -.terminal-1299397484-r21 { fill: #4a4a51 } -.terminal-1299397484-r22 { fill: #191923 } -.terminal-1299397484-r23 { fill: #178941 } -.terminal-1299397484-r24 { fill: #8b8b93 } -.terminal-1299397484-r25 { fill: #616166 } -.terminal-1299397484-r26 { fill: #616166;font-weight: bold } -.terminal-1299397484-r27 { fill: #e1e1e6 } -.terminal-1299397484-r28 { fill: #a5a5b2 } -.terminal-1299397484-r29 { fill: #3b1c3c } -.terminal-1299397484-r30 { fill: #008042 } -.terminal-1299397484-r31 { fill: #9e9ea1 } -.terminal-1299397484-r32 { fill: #9e9ea2;font-weight: bold } -.terminal-1299397484-r33 { fill: #e2e2e6 } -.terminal-1299397484-r34 { fill: #a72f2f } -.terminal-1299397484-r35 { fill: #0d0e2e } -.terminal-1299397484-r36 { fill: #20202a } -.terminal-1299397484-r37 { fill: #707074 } -.terminal-1299397484-r38 { fill: #11111c } -.terminal-1299397484-r39 { fill: #ab6e07 } -.terminal-1299397484-r40 { fill: #5e5e64 } -.terminal-1299397484-r41 { fill: #727276 } -.terminal-1299397484-r42 { fill: #535359 } -.terminal-1299397484-r43 { fill: #15151f } -.terminal-1299397484-r44 { fill: #027d51;font-weight: bold } -.terminal-1299397484-r45 { fill: #ff7ec8;font-weight: bold } -.terminal-1299397484-r46 { fill: #dadadb } + .terminal-3331567905-r1 { fill: #9c9c9d } +.terminal-3331567905-r2 { fill: #c5c8c6 } +.terminal-3331567905-r3 { fill: #dfdfe0 } +.terminal-3331567905-r4 { fill: #b2669a } +.terminal-3331567905-r5 { fill: #0e0b15;text-decoration: underline; } +.terminal-3331567905-r6 { fill: #0e0b15 } +.terminal-3331567905-r7 { fill: #2e2540 } +.terminal-3331567905-r8 { fill: #50505e } +.terminal-3331567905-r9 { fill: #2e2e3f } +.terminal-3331567905-r10 { fill: #dfdfe1;font-weight: bold } +.terminal-3331567905-r11 { fill: #9d9da1 } +.terminal-3331567905-r12 { fill: #a79eaf } +.terminal-3331567905-r13 { fill: #6f6f73 } +.terminal-3331567905-r14 { fill: #0f0f1f } +.terminal-3331567905-r15 { fill: #45203a } +.terminal-3331567905-r16 { fill: #dfdfe1 } +.terminal-3331567905-r17 { fill: #0973a3 } +.terminal-3331567905-r18 { fill: #403e62 } +.terminal-3331567905-r19 { fill: #e3e3e8 } +.terminal-3331567905-r20 { fill: #210d17 } +.terminal-3331567905-r21 { fill: #4a4a51 } +.terminal-3331567905-r22 { fill: #191923 } +.terminal-3331567905-r23 { fill: #178941 } +.terminal-3331567905-r24 { fill: #8b8b93 } +.terminal-3331567905-r25 { fill: #616166 } +.terminal-3331567905-r26 { fill: #616166;font-weight: bold } +.terminal-3331567905-r27 { fill: #e1e1e6 } +.terminal-3331567905-r28 { fill: #a5a5b2 } +.terminal-3331567905-r29 { fill: #3b1c3c } +.terminal-3331567905-r30 { fill: #008042 } +.terminal-3331567905-r31 { fill: #9e9ea1 } +.terminal-3331567905-r32 { fill: #0a0a15 } +.terminal-3331567905-r33 { fill: #9e9ea2;font-weight: bold } +.terminal-3331567905-r34 { fill: #e2e2e6 } +.terminal-3331567905-r35 { fill: #a72f2f } +.terminal-3331567905-r36 { fill: #0d0e2e } +.terminal-3331567905-r37 { fill: #20202a } +.terminal-3331567905-r38 { fill: #707074 } +.terminal-3331567905-r39 { fill: #11111c } +.terminal-3331567905-r40 { fill: #ab6e07 } +.terminal-3331567905-r41 { fill: #5e5e64 } +.terminal-3331567905-r42 { fill: #727276 } +.terminal-3331567905-r43 { fill: #535359 } +.terminal-3331567905-r44 { fill: #15151f } +.terminal-3331567905-r45 { fill: #027d51;font-weight: bold } +.terminal-3331567905-r46 { fill: #ff7ec8;font-weight: bold } +.terminal-3331567905-r47 { fill: #dadadb } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                    - -GETEnter▁▁ New request ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ Send  - -╭─ Collection ────Title                            ─────── Request ─╮ -GET echo        Foo: BarScriptsOptions -GET get random u━━━━━━━━━━━━━━━━━ -POS echo post   File name optional -▼ jsonplaceholderfoo-bar           .posting.yaml -▼ posts/ - GET get allDescription optional -GET get one baz                             ─────────────────╯ -POS create  ────── Response ─╮ -DEL delete aDirectory                        Trace -▼ comments/jsonplaceholder/posts          ━━━━━━━━━━━━━━━━━ -GET get co -GET get co▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ -PUT edit a comm││ -│───────────────────────││ -Retrieve all posts││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - esc Cancel  ^n Create  + + +Posting                                                                    + +GETEnter▁▁ New request ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ Send  + +╭─ Collection ────Title                            ─────── Request ─╮ +GET echo        Foo: BarScriptsOptions +GET get random u━━━━━━━━━━━━━━━━━ +POS echo post   File name optional +▼ jsonplaceholderfoo-bar           .posting.yaml +▼ posts/ + GET get allDescription optional +GET get one baz                             ─────────────────╯ +POS create  ────── Response ─╮ +DEL delete aDirectory                        Trace +▼ comments/jsonplaceholder/posts          ━━━━━━━━━━━━━━━━━ +GET get co +GET get co▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +PUT edit a comm││ +│───────────────────────││ +Retrieve all posts││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + esc Cancel  ^n Create  diff --git a/tests/__snapshots__/test_snapshots/TestSendRequest.test_send_request.svg b/tests/__snapshots__/test_snapshots/TestSendRequest.test_send_request.svg index 18c53cf8..388595f2 100644 --- a/tests/__snapshots__/test_snapshots/TestSendRequest.test_send_request.svg +++ b/tests/__snapshots__/test_snapshots/TestSendRequest.test_send_request.svg @@ -19,216 +19,216 @@ font-weight: 700; } - .terminal-442820388-matrix { + .terminal-61074251-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-442820388-title { + .terminal-61074251-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-442820388-r1 { fill: #dfdfe1 } -.terminal-442820388-r2 { fill: #c5c8c6 } -.terminal-442820388-r3 { fill: #ff93dd } -.terminal-442820388-r4 { fill: #15111e;text-decoration: underline; } -.terminal-442820388-r5 { fill: #15111e } -.terminal-442820388-r6 { fill: #43365c } -.terminal-442820388-r7 { fill: #ff69b4 } -.terminal-442820388-r8 { fill: #9393a3 } -.terminal-442820388-r9 { fill: #a684e8 } -.terminal-442820388-r10 { fill: #e1e1e6 } -.terminal-442820388-r11 { fill: #00fa9a } -.terminal-442820388-r12 { fill: #efe3fb } -.terminal-442820388-r13 { fill: #9f9fa5 } -.terminal-442820388-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-442820388-r15 { fill: #632e53 } -.terminal-442820388-r16 { fill: #0ea5e9 } -.terminal-442820388-r17 { fill: #58d1eb;font-weight: bold } -.terminal-442820388-r18 { fill: #6a6a74 } -.terminal-442820388-r19 { fill: #252532 } -.terminal-442820388-r20 { fill: #22c55e } -.terminal-442820388-r21 { fill: #0f0f1f } -.terminal-442820388-r22 { fill: #ede2f7 } -.terminal-442820388-r23 { fill: #e1e0e4 } -.terminal-442820388-r24 { fill: #e2e0e5 } -.terminal-442820388-r25 { fill: #8b8b93 } -.terminal-442820388-r26 { fill: #8b8b93;font-weight: bold } -.terminal-442820388-r27 { fill: #e9e1f1 } -.terminal-442820388-r28 { fill: #00b85f } -.terminal-442820388-r29 { fill: #210d17;font-weight: bold } -.terminal-442820388-r30 { fill: #ef4444 } -.terminal-442820388-r31 { fill: #737387 } -.terminal-442820388-r32 { fill: #918d9d } -.terminal-442820388-r33 { fill: #f59e0b } -.terminal-442820388-r34 { fill: #002014 } -.terminal-442820388-r35 { fill: #a2a2a8;font-weight: bold } -.terminal-442820388-r36 { fill: #e8e8e9 } -.terminal-442820388-r37 { fill: #e0e0e2 } -.terminal-442820388-r38 { fill: #6f6f78 } -.terminal-442820388-r39 { fill: #f92672;font-weight: bold } -.terminal-442820388-r40 { fill: #ae81ff } -.terminal-442820388-r41 { fill: #e6db74 } -.terminal-442820388-r42 { fill: #87878f } -.terminal-442820388-r43 { fill: #a2a2a8 } -.terminal-442820388-r44 { fill: #30303b } -.terminal-442820388-r45 { fill: #00fa9a;font-weight: bold } -.terminal-442820388-r46 { fill: #ff7ec8;font-weight: bold } -.terminal-442820388-r47 { fill: #dbdbdd } + .terminal-61074251-r1 { fill: #dfdfe1 } +.terminal-61074251-r2 { fill: #c5c8c6 } +.terminal-61074251-r3 { fill: #ff93dd } +.terminal-61074251-r4 { fill: #15111e;text-decoration: underline; } +.terminal-61074251-r5 { fill: #15111e } +.terminal-61074251-r6 { fill: #43365c } +.terminal-61074251-r7 { fill: #ff69b4 } +.terminal-61074251-r8 { fill: #9393a3 } +.terminal-61074251-r9 { fill: #a684e8 } +.terminal-61074251-r10 { fill: #e1e1e6 } +.terminal-61074251-r11 { fill: #00fa9a } +.terminal-61074251-r12 { fill: #efe3fb } +.terminal-61074251-r13 { fill: #9f9fa5 } +.terminal-61074251-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-61074251-r15 { fill: #632e53 } +.terminal-61074251-r16 { fill: #0ea5e9 } +.terminal-61074251-r17 { fill: #58d1eb;font-weight: bold } +.terminal-61074251-r18 { fill: #6a6a74 } +.terminal-61074251-r19 { fill: #252532 } +.terminal-61074251-r20 { fill: #22c55e } +.terminal-61074251-r21 { fill: #0f0f1f } +.terminal-61074251-r22 { fill: #ede2f7 } +.terminal-61074251-r23 { fill: #e1e0e4 } +.terminal-61074251-r24 { fill: #e2e0e5 } +.terminal-61074251-r25 { fill: #8b8b93 } +.terminal-61074251-r26 { fill: #8b8b93;font-weight: bold } +.terminal-61074251-r27 { fill: #e9e1f1 } +.terminal-61074251-r28 { fill: #00b85f } +.terminal-61074251-r29 { fill: #210d17;font-weight: bold } +.terminal-61074251-r30 { fill: #ef4444 } +.terminal-61074251-r31 { fill: #737387 } +.terminal-61074251-r32 { fill: #918d9d } +.terminal-61074251-r33 { fill: #f59e0b } +.terminal-61074251-r34 { fill: #002014 } +.terminal-61074251-r35 { fill: #a2a2a8;font-weight: bold } +.terminal-61074251-r36 { fill: #e8e8e9 } +.terminal-61074251-r37 { fill: #e0e0e2 } +.terminal-61074251-r38 { fill: #6f6f78 } +.terminal-61074251-r39 { fill: #f92672;font-weight: bold } +.terminal-61074251-r40 { fill: #ae81ff } +.terminal-61074251-r41 { fill: #e6db74 } +.terminal-61074251-r42 { fill: #87878f } +.terminal-61074251-r43 { fill: #a2a2a8 } +.terminal-61074251-r44 { fill: #30303b } +.terminal-61074251-r45 { fill: #00fa9a;font-weight: bold } +.terminal-61074251-r46 { fill: #ff7ec8;font-weight: bold } +.terminal-61074251-r47 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                            - -GEThttps://jsonplaceholder.typicode.com/posts        ■■■■■■■ Send  - -╭─ Collection ────────────╮╭───────────────────────────────────────────── Request ─╮ -GET echoHeadersBodyQueryAuthInfoScriptsOptions -GET get random user━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post Content-Type     application/json      -▼ jsonplaceholder/ Referer          https://example.com/  -▼ posts/ Accept-Encoding  gzip                  -█ GET get all Cache-Control    no-cache              -GET get one -POS create -DEL delete a post -▼ comments/ -GET get commentsNameValue Add header  -GET get comments (╰───────────────────────────────────────────────────────╯ -PUT edit a comment╭─────────────────────────────────── Response  200 OK ─╮ -▼ todos/BodyHeadersCookiesScriptsTrace -GET get all━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -GET get one  1  [ -▼ users/  2    {                                             -GET get a user  3  "userId"1,                                -GET get all users  4  "id"1,                                    -POS create a user  5  "title""sunt aut facere repellat  -PUT update a userprovident occaecati excepturi optio  -DEL delete a userreprehenderit",                                 -  6  "body""quia et suscipit\nsuscipit  -─────────────────────────recusandae consequuntur expedita et  -Retrieve all posts1:1read-onlyJSONWrap X -╰──── sample-collections ─╯╰───────────────────────────────────────────────────────╯ - d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Qui + + +Posting                                                                            + +GEThttps://jsonplaceholder.typicode.com/posts        ■■■■■■■ Send  + +╭─ Collection ────────────╮╭───────────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOptions +GET get random user━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post Content-Type     application/json      +▼ jsonplaceholder/ Referer          https://example.com/  +▼ posts/ Accept-Encoding  gzip                  +█ GET get all Cache-Control    no-cache              +GET get one +POS create +DEL delete a post +▼ comments/ +GET get commentsNameValue Add header  +GET get comments (╰───────────────────────────────────────────────────────╯ +PUT edit a comment╭─────────────────────────────────── Response  200 OK ─╮ +▼ todos/BodyHeadersCookiesScriptsTrace +GET get all━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get one  1  [ +▼ users/  2    {                                             +GET get a user  3  "userId"1,                                +GET get all users  4  "id"1,                                    +POS create a user  5  "title""sunt aut facere repellat  +PUT update a userprovident occaecati excepturi optio  +DEL delete a userreprehenderit",                                 +  6  "body""quia et suscipit\nsuscipit  +─────────────────────────recusandae consequuntur expedita et  +Retrieve all posts1:1read-onlyJSONWrap X +╰──── sample-collections ─╯╰───────────────────────────────────────────────────────╯ + d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Qui diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_appears_on_typing.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_appears_on_typing.svg index db50181e..8b176a8c 100644 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_appears_on_typing.svg +++ b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_appears_on_typing.svg @@ -19,172 +19,173 @@ font-weight: 700; } - .terminal-1949332948-matrix { + .terminal-875603998-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1949332948-title { + .terminal-875603998-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1949332948-r1 { fill: #dfdfe1 } -.terminal-1949332948-r2 { fill: #c5c8c6 } -.terminal-1949332948-r3 { fill: #ff93dd } -.terminal-1949332948-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1949332948-r5 { fill: #15111e } -.terminal-1949332948-r6 { fill: #43365c } -.terminal-1949332948-r7 { fill: #403e62 } -.terminal-1949332948-r8 { fill: #e3e3e8 } -.terminal-1949332948-r9 { fill: #210d17 } -.terminal-1949332948-r10 { fill: #efe3fb } -.terminal-1949332948-r11 { fill: #9f9fa5 } -.terminal-1949332948-r12 { fill: #ff69b4 } -.terminal-1949332948-r13 { fill: #170b21;font-weight: bold } -.terminal-1949332948-r14 { fill: #e5e5ea;font-weight: bold } -.terminal-1949332948-r15 { fill: #632e53 } -.terminal-1949332948-r16 { fill: #170b21 } -.terminal-1949332948-r17 { fill: #a5a5b2 } -.terminal-1949332948-r18 { fill: #e3e3e8;font-weight: bold } -.terminal-1949332948-r19 { fill: #6a6a74 } -.terminal-1949332948-r20 { fill: #0ea5e9 } -.terminal-1949332948-r21 { fill: #252532 } -.terminal-1949332948-r22 { fill: #22c55e } -.terminal-1949332948-r23 { fill: #252441 } -.terminal-1949332948-r24 { fill: #8b8b93 } -.terminal-1949332948-r25 { fill: #8b8b93;font-weight: bold } -.terminal-1949332948-r26 { fill: #0d0e2e } -.terminal-1949332948-r27 { fill: #00b85f } -.terminal-1949332948-r28 { fill: #737387 } -.terminal-1949332948-r29 { fill: #e1e1e6 } -.terminal-1949332948-r30 { fill: #918d9d } -.terminal-1949332948-r31 { fill: #ef4444 } -.terminal-1949332948-r32 { fill: #2e2e3c;font-weight: bold } -.terminal-1949332948-r33 { fill: #2e2e3c } -.terminal-1949332948-r34 { fill: #a0a0a6 } -.terminal-1949332948-r35 { fill: #191928 } -.terminal-1949332948-r36 { fill: #b74e87 } -.terminal-1949332948-r37 { fill: #87878f } -.terminal-1949332948-r38 { fill: #a3a3a9 } -.terminal-1949332948-r39 { fill: #777780 } -.terminal-1949332948-r40 { fill: #1f1f2d } -.terminal-1949332948-r41 { fill: #04b375;font-weight: bold } -.terminal-1949332948-r42 { fill: #ff7ec8;font-weight: bold } -.terminal-1949332948-r43 { fill: #dbdbdd } + .terminal-875603998-r1 { fill: #dfdfe1 } +.terminal-875603998-r2 { fill: #c5c8c6 } +.terminal-875603998-r3 { fill: #ff93dd } +.terminal-875603998-r4 { fill: #15111e;text-decoration: underline; } +.terminal-875603998-r5 { fill: #15111e } +.terminal-875603998-r6 { fill: #43365c } +.terminal-875603998-r7 { fill: #403e62 } +.terminal-875603998-r8 { fill: #e3e3e8 } +.terminal-875603998-r9 { fill: #210d17 } +.terminal-875603998-r10 { fill: #efe3fb } +.terminal-875603998-r11 { fill: #9f9fa5 } +.terminal-875603998-r12 { fill: #ff69b4 } +.terminal-875603998-r13 { fill: #170b21;font-weight: bold } +.terminal-875603998-r14 { fill: #e5e5ea;font-weight: bold } +.terminal-875603998-r15 { fill: #632e53 } +.terminal-875603998-r16 { fill: #170b21 } +.terminal-875603998-r17 { fill: #a5a5b2 } +.terminal-875603998-r18 { fill: #e3e3e8;font-weight: bold } +.terminal-875603998-r19 { fill: #6a6a74 } +.terminal-875603998-r20 { fill: #0ea5e9 } +.terminal-875603998-r21 { fill: #0f0f1f } +.terminal-875603998-r22 { fill: #252532 } +.terminal-875603998-r23 { fill: #22c55e } +.terminal-875603998-r24 { fill: #252441 } +.terminal-875603998-r25 { fill: #8b8b93 } +.terminal-875603998-r26 { fill: #8b8b93;font-weight: bold } +.terminal-875603998-r27 { fill: #0d0e2e } +.terminal-875603998-r28 { fill: #00b85f } +.terminal-875603998-r29 { fill: #737387 } +.terminal-875603998-r30 { fill: #e1e1e6 } +.terminal-875603998-r31 { fill: #918d9d } +.terminal-875603998-r32 { fill: #ef4444 } +.terminal-875603998-r33 { fill: #2e2e3c;font-weight: bold } +.terminal-875603998-r34 { fill: #2e2e3c } +.terminal-875603998-r35 { fill: #a0a0a6 } +.terminal-875603998-r36 { fill: #191928 } +.terminal-875603998-r37 { fill: #b74e87 } +.terminal-875603998-r38 { fill: #87878f } +.terminal-875603998-r39 { fill: #a3a3a9 } +.terminal-875603998-r40 { fill: #777780 } +.terminal-875603998-r41 { fill: #1f1f2d } +.terminal-875603998-r42 { fill: #04b375;font-weight: bold } +.terminal-875603998-r43 { fill: #ff7ec8;font-weight: bold } +.terminal-875603998-r44 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttp Send  -https://api.randomuser.me            -╭─ Collection ────https://jsonplaceholder.typicode.com────────── Request ─╮ - GET echohttps://postman-echo.com            InfoScriptsOptio -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesScriptsTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttp Send  +https://api.randomuser.me            +╭─ Collection ───https://jsonplaceholder.typicode.com─────────── Request ─╮ + GET echohttps://postman-echo.com            InfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_enter_key.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_enter_key.svg index bc0bfd96..e235ffd5 100644 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_enter_key.svg +++ b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_enter_key.svg @@ -19,171 +19,172 @@ font-weight: 700; } - .terminal-1279950685-matrix { + .terminal-1166774519-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1279950685-title { + .terminal-1166774519-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1279950685-r1 { fill: #dfdfe1 } -.terminal-1279950685-r2 { fill: #c5c8c6 } -.terminal-1279950685-r3 { fill: #ff93dd } -.terminal-1279950685-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1279950685-r5 { fill: #15111e } -.terminal-1279950685-r6 { fill: #43365c } -.terminal-1279950685-r7 { fill: #403e62 } -.terminal-1279950685-r8 { fill: #ff69b4 } -.terminal-1279950685-r9 { fill: #9b9aab } -.terminal-1279950685-r10 { fill: #a684e8 } -.terminal-1279950685-r11 { fill: #210d17 } -.terminal-1279950685-r12 { fill: #e3e3e8 } -.terminal-1279950685-r13 { fill: #efe3fb } -.terminal-1279950685-r14 { fill: #9f9fa5 } -.terminal-1279950685-r15 { fill: #632e53 } -.terminal-1279950685-r16 { fill: #e3e3e8;font-weight: bold } -.terminal-1279950685-r17 { fill: #dfdfe1;font-weight: bold } -.terminal-1279950685-r18 { fill: #6a6a74 } -.terminal-1279950685-r19 { fill: #0ea5e9 } -.terminal-1279950685-r20 { fill: #252532 } -.terminal-1279950685-r21 { fill: #22c55e } -.terminal-1279950685-r22 { fill: #252441 } -.terminal-1279950685-r23 { fill: #8b8b93 } -.terminal-1279950685-r24 { fill: #8b8b93;font-weight: bold } -.terminal-1279950685-r25 { fill: #0d0e2e } -.terminal-1279950685-r26 { fill: #00b85f } -.terminal-1279950685-r27 { fill: #737387 } -.terminal-1279950685-r28 { fill: #e1e1e6 } -.terminal-1279950685-r29 { fill: #918d9d } -.terminal-1279950685-r30 { fill: #ef4444 } -.terminal-1279950685-r31 { fill: #2e2e3c;font-weight: bold } -.terminal-1279950685-r32 { fill: #2e2e3c } -.terminal-1279950685-r33 { fill: #a0a0a6 } -.terminal-1279950685-r34 { fill: #191928 } -.terminal-1279950685-r35 { fill: #b74e87 } -.terminal-1279950685-r36 { fill: #87878f } -.terminal-1279950685-r37 { fill: #a3a3a9 } -.terminal-1279950685-r38 { fill: #777780 } -.terminal-1279950685-r39 { fill: #1f1f2d } -.terminal-1279950685-r40 { fill: #04b375;font-weight: bold } -.terminal-1279950685-r41 { fill: #ff7ec8;font-weight: bold } -.terminal-1279950685-r42 { fill: #dbdbdd } + .terminal-1166774519-r1 { fill: #dfdfe1 } +.terminal-1166774519-r2 { fill: #c5c8c6 } +.terminal-1166774519-r3 { fill: #ff93dd } +.terminal-1166774519-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1166774519-r5 { fill: #15111e } +.terminal-1166774519-r6 { fill: #43365c } +.terminal-1166774519-r7 { fill: #403e62 } +.terminal-1166774519-r8 { fill: #ff69b4 } +.terminal-1166774519-r9 { fill: #9b9aab } +.terminal-1166774519-r10 { fill: #a684e8 } +.terminal-1166774519-r11 { fill: #210d17 } +.terminal-1166774519-r12 { fill: #e3e3e8 } +.terminal-1166774519-r13 { fill: #efe3fb } +.terminal-1166774519-r14 { fill: #9f9fa5 } +.terminal-1166774519-r15 { fill: #632e53 } +.terminal-1166774519-r16 { fill: #e3e3e8;font-weight: bold } +.terminal-1166774519-r17 { fill: #0f0f1f } +.terminal-1166774519-r18 { fill: #dfdfe1;font-weight: bold } +.terminal-1166774519-r19 { fill: #6a6a74 } +.terminal-1166774519-r20 { fill: #0ea5e9 } +.terminal-1166774519-r21 { fill: #252532 } +.terminal-1166774519-r22 { fill: #22c55e } +.terminal-1166774519-r23 { fill: #252441 } +.terminal-1166774519-r24 { fill: #8b8b93 } +.terminal-1166774519-r25 { fill: #8b8b93;font-weight: bold } +.terminal-1166774519-r26 { fill: #0d0e2e } +.terminal-1166774519-r27 { fill: #00b85f } +.terminal-1166774519-r28 { fill: #737387 } +.terminal-1166774519-r29 { fill: #e1e1e6 } +.terminal-1166774519-r30 { fill: #918d9d } +.terminal-1166774519-r31 { fill: #ef4444 } +.terminal-1166774519-r32 { fill: #2e2e3c;font-weight: bold } +.terminal-1166774519-r33 { fill: #2e2e3c } +.terminal-1166774519-r34 { fill: #a0a0a6 } +.terminal-1166774519-r35 { fill: #191928 } +.terminal-1166774519-r36 { fill: #b74e87 } +.terminal-1166774519-r37 { fill: #87878f } +.terminal-1166774519-r38 { fill: #a3a3a9 } +.terminal-1166774519-r39 { fill: #777780 } +.terminal-1166774519-r40 { fill: #1f1f2d } +.terminal-1166774519-r41 { fill: #04b375;font-weight: bold } +.terminal-1166774519-r42 { fill: #ff7ec8;font-weight: bold } +.terminal-1166774519-r43 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                    - -GEThttps://jsonplaceholder.typicode.com Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoScriptsOptio -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesScriptsTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + +Posting                                                                    + +GEThttps://jsonplaceholder.typicode.com Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echo││HeadersBodyQueryAuthInfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_tab_key.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_tab_key.svg index bc0bfd96..e235ffd5 100644 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_tab_key.svg +++ b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_completion_selected_via_tab_key.svg @@ -19,171 +19,172 @@ font-weight: 700; } - .terminal-1279950685-matrix { + .terminal-1166774519-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1279950685-title { + .terminal-1166774519-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1279950685-r1 { fill: #dfdfe1 } -.terminal-1279950685-r2 { fill: #c5c8c6 } -.terminal-1279950685-r3 { fill: #ff93dd } -.terminal-1279950685-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1279950685-r5 { fill: #15111e } -.terminal-1279950685-r6 { fill: #43365c } -.terminal-1279950685-r7 { fill: #403e62 } -.terminal-1279950685-r8 { fill: #ff69b4 } -.terminal-1279950685-r9 { fill: #9b9aab } -.terminal-1279950685-r10 { fill: #a684e8 } -.terminal-1279950685-r11 { fill: #210d17 } -.terminal-1279950685-r12 { fill: #e3e3e8 } -.terminal-1279950685-r13 { fill: #efe3fb } -.terminal-1279950685-r14 { fill: #9f9fa5 } -.terminal-1279950685-r15 { fill: #632e53 } -.terminal-1279950685-r16 { fill: #e3e3e8;font-weight: bold } -.terminal-1279950685-r17 { fill: #dfdfe1;font-weight: bold } -.terminal-1279950685-r18 { fill: #6a6a74 } -.terminal-1279950685-r19 { fill: #0ea5e9 } -.terminal-1279950685-r20 { fill: #252532 } -.terminal-1279950685-r21 { fill: #22c55e } -.terminal-1279950685-r22 { fill: #252441 } -.terminal-1279950685-r23 { fill: #8b8b93 } -.terminal-1279950685-r24 { fill: #8b8b93;font-weight: bold } -.terminal-1279950685-r25 { fill: #0d0e2e } -.terminal-1279950685-r26 { fill: #00b85f } -.terminal-1279950685-r27 { fill: #737387 } -.terminal-1279950685-r28 { fill: #e1e1e6 } -.terminal-1279950685-r29 { fill: #918d9d } -.terminal-1279950685-r30 { fill: #ef4444 } -.terminal-1279950685-r31 { fill: #2e2e3c;font-weight: bold } -.terminal-1279950685-r32 { fill: #2e2e3c } -.terminal-1279950685-r33 { fill: #a0a0a6 } -.terminal-1279950685-r34 { fill: #191928 } -.terminal-1279950685-r35 { fill: #b74e87 } -.terminal-1279950685-r36 { fill: #87878f } -.terminal-1279950685-r37 { fill: #a3a3a9 } -.terminal-1279950685-r38 { fill: #777780 } -.terminal-1279950685-r39 { fill: #1f1f2d } -.terminal-1279950685-r40 { fill: #04b375;font-weight: bold } -.terminal-1279950685-r41 { fill: #ff7ec8;font-weight: bold } -.terminal-1279950685-r42 { fill: #dbdbdd } + .terminal-1166774519-r1 { fill: #dfdfe1 } +.terminal-1166774519-r2 { fill: #c5c8c6 } +.terminal-1166774519-r3 { fill: #ff93dd } +.terminal-1166774519-r4 { fill: #15111e;text-decoration: underline; } +.terminal-1166774519-r5 { fill: #15111e } +.terminal-1166774519-r6 { fill: #43365c } +.terminal-1166774519-r7 { fill: #403e62 } +.terminal-1166774519-r8 { fill: #ff69b4 } +.terminal-1166774519-r9 { fill: #9b9aab } +.terminal-1166774519-r10 { fill: #a684e8 } +.terminal-1166774519-r11 { fill: #210d17 } +.terminal-1166774519-r12 { fill: #e3e3e8 } +.terminal-1166774519-r13 { fill: #efe3fb } +.terminal-1166774519-r14 { fill: #9f9fa5 } +.terminal-1166774519-r15 { fill: #632e53 } +.terminal-1166774519-r16 { fill: #e3e3e8;font-weight: bold } +.terminal-1166774519-r17 { fill: #0f0f1f } +.terminal-1166774519-r18 { fill: #dfdfe1;font-weight: bold } +.terminal-1166774519-r19 { fill: #6a6a74 } +.terminal-1166774519-r20 { fill: #0ea5e9 } +.terminal-1166774519-r21 { fill: #252532 } +.terminal-1166774519-r22 { fill: #22c55e } +.terminal-1166774519-r23 { fill: #252441 } +.terminal-1166774519-r24 { fill: #8b8b93 } +.terminal-1166774519-r25 { fill: #8b8b93;font-weight: bold } +.terminal-1166774519-r26 { fill: #0d0e2e } +.terminal-1166774519-r27 { fill: #00b85f } +.terminal-1166774519-r28 { fill: #737387 } +.terminal-1166774519-r29 { fill: #e1e1e6 } +.terminal-1166774519-r30 { fill: #918d9d } +.terminal-1166774519-r31 { fill: #ef4444 } +.terminal-1166774519-r32 { fill: #2e2e3c;font-weight: bold } +.terminal-1166774519-r33 { fill: #2e2e3c } +.terminal-1166774519-r34 { fill: #a0a0a6 } +.terminal-1166774519-r35 { fill: #191928 } +.terminal-1166774519-r36 { fill: #b74e87 } +.terminal-1166774519-r37 { fill: #87878f } +.terminal-1166774519-r38 { fill: #a3a3a9 } +.terminal-1166774519-r39 { fill: #777780 } +.terminal-1166774519-r40 { fill: #1f1f2d } +.terminal-1166774519-r41 { fill: #04b375;font-weight: bold } +.terminal-1166774519-r42 { fill: #ff7ec8;font-weight: bold } +.terminal-1166774519-r43 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                    - -GEThttps://jsonplaceholder.typicode.com Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoScriptsOptio -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesScriptsTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + +Posting                                                                    + +GEThttps://jsonplaceholder.typicode.com Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echo││HeadersBodyQueryAuthInfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_filters_on_typing.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_filters_on_typing.svg index 0610fd46..a41f3b1a 100644 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_filters_on_typing.svg +++ b/tests/__snapshots__/test_snapshots/TestUrlBar.test_dropdown_filters_on_typing.svg @@ -19,171 +19,172 @@ font-weight: 700; } - .terminal-2529389070-matrix { + .terminal-2482994088-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2529389070-title { + .terminal-2482994088-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2529389070-r1 { fill: #dfdfe1 } -.terminal-2529389070-r2 { fill: #c5c8c6 } -.terminal-2529389070-r3 { fill: #ff93dd } -.terminal-2529389070-r4 { fill: #15111e;text-decoration: underline; } -.terminal-2529389070-r5 { fill: #15111e } -.terminal-2529389070-r6 { fill: #43365c } -.terminal-2529389070-r7 { fill: #403e62 } -.terminal-2529389070-r8 { fill: #e3e3e8 } -.terminal-2529389070-r9 { fill: #210d17 } -.terminal-2529389070-r10 { fill: #efe3fb } -.terminal-2529389070-r11 { fill: #9f9fa5 } -.terminal-2529389070-r12 { fill: #ff69b4 } -.terminal-2529389070-r13 { fill: #e5e5ea;font-weight: bold } -.terminal-2529389070-r14 { fill: #170b21;font-weight: bold } -.terminal-2529389070-r15 { fill: #632e53 } -.terminal-2529389070-r16 { fill: #e3e3e8;font-weight: bold } -.terminal-2529389070-r17 { fill: #dfdfe1;font-weight: bold } -.terminal-2529389070-r18 { fill: #6a6a74 } -.terminal-2529389070-r19 { fill: #0ea5e9 } -.terminal-2529389070-r20 { fill: #252532 } -.terminal-2529389070-r21 { fill: #22c55e } -.terminal-2529389070-r22 { fill: #252441 } -.terminal-2529389070-r23 { fill: #8b8b93 } -.terminal-2529389070-r24 { fill: #8b8b93;font-weight: bold } -.terminal-2529389070-r25 { fill: #0d0e2e } -.terminal-2529389070-r26 { fill: #00b85f } -.terminal-2529389070-r27 { fill: #737387 } -.terminal-2529389070-r28 { fill: #e1e1e6 } -.terminal-2529389070-r29 { fill: #918d9d } -.terminal-2529389070-r30 { fill: #ef4444 } -.terminal-2529389070-r31 { fill: #2e2e3c;font-weight: bold } -.terminal-2529389070-r32 { fill: #2e2e3c } -.terminal-2529389070-r33 { fill: #a0a0a6 } -.terminal-2529389070-r34 { fill: #191928 } -.terminal-2529389070-r35 { fill: #b74e87 } -.terminal-2529389070-r36 { fill: #87878f } -.terminal-2529389070-r37 { fill: #a3a3a9 } -.terminal-2529389070-r38 { fill: #777780 } -.terminal-2529389070-r39 { fill: #1f1f2d } -.terminal-2529389070-r40 { fill: #04b375;font-weight: bold } -.terminal-2529389070-r41 { fill: #ff7ec8;font-weight: bold } -.terminal-2529389070-r42 { fill: #dbdbdd } + .terminal-2482994088-r1 { fill: #dfdfe1 } +.terminal-2482994088-r2 { fill: #c5c8c6 } +.terminal-2482994088-r3 { fill: #ff93dd } +.terminal-2482994088-r4 { fill: #15111e;text-decoration: underline; } +.terminal-2482994088-r5 { fill: #15111e } +.terminal-2482994088-r6 { fill: #43365c } +.terminal-2482994088-r7 { fill: #403e62 } +.terminal-2482994088-r8 { fill: #e3e3e8 } +.terminal-2482994088-r9 { fill: #210d17 } +.terminal-2482994088-r10 { fill: #efe3fb } +.terminal-2482994088-r11 { fill: #9f9fa5 } +.terminal-2482994088-r12 { fill: #ff69b4 } +.terminal-2482994088-r13 { fill: #e5e5ea;font-weight: bold } +.terminal-2482994088-r14 { fill: #170b21;font-weight: bold } +.terminal-2482994088-r15 { fill: #632e53 } +.terminal-2482994088-r16 { fill: #e3e3e8;font-weight: bold } +.terminal-2482994088-r17 { fill: #0f0f1f } +.terminal-2482994088-r18 { fill: #dfdfe1;font-weight: bold } +.terminal-2482994088-r19 { fill: #6a6a74 } +.terminal-2482994088-r20 { fill: #0ea5e9 } +.terminal-2482994088-r21 { fill: #252532 } +.terminal-2482994088-r22 { fill: #22c55e } +.terminal-2482994088-r23 { fill: #252441 } +.terminal-2482994088-r24 { fill: #8b8b93 } +.terminal-2482994088-r25 { fill: #8b8b93;font-weight: bold } +.terminal-2482994088-r26 { fill: #0d0e2e } +.terminal-2482994088-r27 { fill: #00b85f } +.terminal-2482994088-r28 { fill: #737387 } +.terminal-2482994088-r29 { fill: #e1e1e6 } +.terminal-2482994088-r30 { fill: #918d9d } +.terminal-2482994088-r31 { fill: #ef4444 } +.terminal-2482994088-r32 { fill: #2e2e3c;font-weight: bold } +.terminal-2482994088-r33 { fill: #2e2e3c } +.terminal-2482994088-r34 { fill: #a0a0a6 } +.terminal-2482994088-r35 { fill: #191928 } +.terminal-2482994088-r36 { fill: #b74e87 } +.terminal-2482994088-r37 { fill: #87878f } +.terminal-2482994088-r38 { fill: #a3a3a9 } +.terminal-2482994088-r39 { fill: #777780 } +.terminal-2482994088-r40 { fill: #1f1f2d } +.terminal-2482994088-r41 { fill: #04b375;font-weight: bold } +.terminal-2482994088-r42 { fill: #ff7ec8;font-weight: bold } +.terminal-2482994088-r43 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETjson Send  -https://jsonplaceholder.typicode.com -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoScriptsOptio -GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all││NameValue Add header  -GET get one│╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesScriptsTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETjson Send  +https://jsonplaceholder.typicode.com +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echo││HeadersBodyQueryAuthInfoScriptsOptio +GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_request_section.svg b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_request_section.svg index 9b007755..234b85a7 100644 --- a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_request_section.svg +++ b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_request_section.svg @@ -19,156 +19,157 @@ font-weight: 700; } - .terminal-3116075932-matrix { + .terminal-366583094-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3116075932-title { + .terminal-366583094-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3116075932-r1 { fill: #dfdfe1 } -.terminal-3116075932-r2 { fill: #c5c8c6 } -.terminal-3116075932-r3 { fill: #ff93dd } -.terminal-3116075932-r4 { fill: #15111e;text-decoration: underline; } -.terminal-3116075932-r5 { fill: #15111e } -.terminal-3116075932-r6 { fill: #43365c } -.terminal-3116075932-r7 { fill: #737387 } -.terminal-3116075932-r8 { fill: #e1e1e6 } -.terminal-3116075932-r9 { fill: #efe3fb } -.terminal-3116075932-r10 { fill: #9f9fa5 } -.terminal-3116075932-r11 { fill: #632e53 } -.terminal-3116075932-r12 { fill: #ff69b4 } -.terminal-3116075932-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-3116075932-r14 { fill: #e3e3e8;font-weight: bold } -.terminal-3116075932-r15 { fill: #6a6a74 } -.terminal-3116075932-r16 { fill: #0ea5e9 } -.terminal-3116075932-r17 { fill: #873c69 } -.terminal-3116075932-r18 { fill: #22c55e } -.terminal-3116075932-r19 { fill: #252441 } -.terminal-3116075932-r20 { fill: #8b8b93 } -.terminal-3116075932-r21 { fill: #8b8b93;font-weight: bold } -.terminal-3116075932-r22 { fill: #0d0e2e } -.terminal-3116075932-r23 { fill: #00b85f } -.terminal-3116075932-r24 { fill: #ef4444 } -.terminal-3116075932-r25 { fill: #918d9d } -.terminal-3116075932-r26 { fill: #ff7ec8;font-weight: bold } -.terminal-3116075932-r27 { fill: #dbdbdd } + .terminal-366583094-r1 { fill: #dfdfe1 } +.terminal-366583094-r2 { fill: #c5c8c6 } +.terminal-366583094-r3 { fill: #ff93dd } +.terminal-366583094-r4 { fill: #15111e;text-decoration: underline; } +.terminal-366583094-r5 { fill: #15111e } +.terminal-366583094-r6 { fill: #43365c } +.terminal-366583094-r7 { fill: #737387 } +.terminal-366583094-r8 { fill: #e1e1e6 } +.terminal-366583094-r9 { fill: #efe3fb } +.terminal-366583094-r10 { fill: #9f9fa5 } +.terminal-366583094-r11 { fill: #632e53 } +.terminal-366583094-r12 { fill: #ff69b4 } +.terminal-366583094-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-366583094-r14 { fill: #e3e3e8;font-weight: bold } +.terminal-366583094-r15 { fill: #0f0f1f } +.terminal-366583094-r16 { fill: #6a6a74 } +.terminal-366583094-r17 { fill: #0ea5e9 } +.terminal-366583094-r18 { fill: #873c69 } +.terminal-366583094-r19 { fill: #22c55e } +.terminal-366583094-r20 { fill: #252441 } +.terminal-366583094-r21 { fill: #8b8b93 } +.terminal-366583094-r22 { fill: #8b8b93;font-weight: bold } +.terminal-366583094-r23 { fill: #0d0e2e } +.terminal-366583094-r24 { fill: #00b85f } +.terminal-366583094-r25 { fill: #ef4444 } +.terminal-366583094-r26 { fill: #918d9d } +.terminal-366583094-r27 { fill: #ff7ec8;font-weight: bold } +.terminal-366583094-r28 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echoHeadersBodyQueryAuthInfoScriptsOptio -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get all╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get one╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -POS create╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -DEL delete a post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -│───────────────────────│╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -This is an echo ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -server we can use to ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -see exactly what ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -request is being ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -sent.NameValue Add header  -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get one╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +POS create╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +DEL delete a post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +│───────────────────────│╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +This is an echo ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +server we can use to ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +see exactly what ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +request is being ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +sent.NameValue Add header  +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_then_reset.svg b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_then_reset.svg index 912a3379..75228411 100644 --- a/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_then_reset.svg +++ b/tests/__snapshots__/test_snapshots/TestUserInterfaceShortcuts.test_expand_then_reset.svg @@ -19,166 +19,167 @@ font-weight: 700; } - .terminal-307614538-matrix { + .terminal-58320100-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-307614538-title { + .terminal-58320100-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-307614538-r1 { fill: #dfdfe1 } -.terminal-307614538-r2 { fill: #c5c8c6 } -.terminal-307614538-r3 { fill: #ff93dd } -.terminal-307614538-r4 { fill: #15111e;text-decoration: underline; } -.terminal-307614538-r5 { fill: #15111e } -.terminal-307614538-r6 { fill: #43365c } -.terminal-307614538-r7 { fill: #737387 } -.terminal-307614538-r8 { fill: #e1e1e6 } -.terminal-307614538-r9 { fill: #efe3fb } -.terminal-307614538-r10 { fill: #9f9fa5 } -.terminal-307614538-r11 { fill: #632e53 } -.terminal-307614538-r12 { fill: #ff69b4 } -.terminal-307614538-r13 { fill: #dfdfe1;font-weight: bold } -.terminal-307614538-r14 { fill: #e3e3e8;font-weight: bold } -.terminal-307614538-r15 { fill: #6a6a74 } -.terminal-307614538-r16 { fill: #0ea5e9 } -.terminal-307614538-r17 { fill: #873c69 } -.terminal-307614538-r18 { fill: #22c55e } -.terminal-307614538-r19 { fill: #252441 } -.terminal-307614538-r20 { fill: #8b8b93 } -.terminal-307614538-r21 { fill: #8b8b93;font-weight: bold } -.terminal-307614538-r22 { fill: #0d0e2e } -.terminal-307614538-r23 { fill: #00b85f } -.terminal-307614538-r24 { fill: #918d9d } -.terminal-307614538-r25 { fill: #ef4444 } -.terminal-307614538-r26 { fill: #2e2e3c;font-weight: bold } -.terminal-307614538-r27 { fill: #2e2e3c } -.terminal-307614538-r28 { fill: #a0a0a6 } -.terminal-307614538-r29 { fill: #191928 } -.terminal-307614538-r30 { fill: #b74e87 } -.terminal-307614538-r31 { fill: #87878f } -.terminal-307614538-r32 { fill: #a3a3a9 } -.terminal-307614538-r33 { fill: #777780 } -.terminal-307614538-r34 { fill: #1f1f2d } -.terminal-307614538-r35 { fill: #04b375;font-weight: bold } -.terminal-307614538-r36 { fill: #ff7ec8;font-weight: bold } -.terminal-307614538-r37 { fill: #dbdbdd } + .terminal-58320100-r1 { fill: #dfdfe1 } +.terminal-58320100-r2 { fill: #c5c8c6 } +.terminal-58320100-r3 { fill: #ff93dd } +.terminal-58320100-r4 { fill: #15111e;text-decoration: underline; } +.terminal-58320100-r5 { fill: #15111e } +.terminal-58320100-r6 { fill: #43365c } +.terminal-58320100-r7 { fill: #737387 } +.terminal-58320100-r8 { fill: #e1e1e6 } +.terminal-58320100-r9 { fill: #efe3fb } +.terminal-58320100-r10 { fill: #9f9fa5 } +.terminal-58320100-r11 { fill: #632e53 } +.terminal-58320100-r12 { fill: #ff69b4 } +.terminal-58320100-r13 { fill: #dfdfe1;font-weight: bold } +.terminal-58320100-r14 { fill: #e3e3e8;font-weight: bold } +.terminal-58320100-r15 { fill: #0f0f1f } +.terminal-58320100-r16 { fill: #6a6a74 } +.terminal-58320100-r17 { fill: #0ea5e9 } +.terminal-58320100-r18 { fill: #873c69 } +.terminal-58320100-r19 { fill: #22c55e } +.terminal-58320100-r20 { fill: #252441 } +.terminal-58320100-r21 { fill: #8b8b93 } +.terminal-58320100-r22 { fill: #8b8b93;font-weight: bold } +.terminal-58320100-r23 { fill: #0d0e2e } +.terminal-58320100-r24 { fill: #00b85f } +.terminal-58320100-r25 { fill: #918d9d } +.terminal-58320100-r26 { fill: #ef4444 } +.terminal-58320100-r27 { fill: #2e2e3c;font-weight: bold } +.terminal-58320100-r28 { fill: #2e2e3c } +.terminal-58320100-r29 { fill: #a0a0a6 } +.terminal-58320100-r30 { fill: #191928 } +.terminal-58320100-r31 { fill: #b74e87 } +.terminal-58320100-r32 { fill: #87878f } +.terminal-58320100-r33 { fill: #a3a3a9 } +.terminal-58320100-r34 { fill: #777780 } +.terminal-58320100-r35 { fill: #1f1f2d } +.terminal-58320100-r36 { fill: #04b375;font-weight: bold } +.terminal-58320100-r37 { fill: #ff7ec8;font-weight: bold } +.terminal-58320100-r38 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - + - - -Posting                                                                    - -GETEnter a URL... Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echoHeadersBodyQueryAuthInfoScriptsOptio -GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -GET get allNameValue Add header  -GET get one╰─────────────────────────────────────────────────╯ -POS create│╭────────────────────────────────────── Response ─╮ -DEL delete a post││BodyHeadersCookiesScriptsTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + +Posting                                                                    + +GETEnter a URL... Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ + GET echoHeadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get allNameValue Add header  +GET get one╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestVariables.test_resolved_variables_highlight_and_preview.svg b/tests/__snapshots__/test_snapshots/TestVariables.test_resolved_variables_highlight_and_preview.svg index 155e0d74..1b285691 100644 --- a/tests/__snapshots__/test_snapshots/TestVariables.test_resolved_variables_highlight_and_preview.svg +++ b/tests/__snapshots__/test_snapshots/TestVariables.test_resolved_variables_highlight_and_preview.svg @@ -19,173 +19,172 @@ font-weight: 700; } - .terminal-774853547-matrix { + .terminal-277448910-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-774853547-title { + .terminal-277448910-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-774853547-r1 { fill: #dfdfe1 } -.terminal-774853547-r2 { fill: #c5c8c6 } -.terminal-774853547-r3 { fill: #ff93dd } -.terminal-774853547-r4 { fill: #15111e;text-decoration: underline; } -.terminal-774853547-r5 { fill: #15111e } -.terminal-774853547-r6 { fill: #43365c } -.terminal-774853547-r7 { fill: #403e62 } -.terminal-774853547-r8 { fill: #ff69b4 } -.terminal-774853547-r9 { fill: #9b9aab } -.terminal-774853547-r10 { fill: #a684e8 } -.terminal-774853547-r11 { fill: #e3e3e8 } -.terminal-774853547-r12 { fill: #00fa9a;text-decoration: underline; } -.terminal-774853547-r13 { fill: #210d17 } -.terminal-774853547-r14 { fill: #efe3fb } -.terminal-774853547-r15 { fill: #9f9fa5 } -.terminal-774853547-r16 { fill: #170b21;font-weight: bold } -.terminal-774853547-r17 { fill: #632e53 } -.terminal-774853547-r18 { fill: #0ea5e9 } -.terminal-774853547-r19 { fill: #dfdfe1;font-weight: bold } -.terminal-774853547-r20 { fill: #58d1eb;font-weight: bold } -.terminal-774853547-r21 { fill: #6a6a74 } -.terminal-774853547-r22 { fill: #e3e3e8;font-weight: bold } -.terminal-774853547-r23 { fill: #252532 } -.terminal-774853547-r24 { fill: #0f0f1f } -.terminal-774853547-r25 { fill: #ede2f7 } -.terminal-774853547-r26 { fill: #e1e0e4 } -.terminal-774853547-r27 { fill: #e2e0e5 } -.terminal-774853547-r28 { fill: #e9e1f1 } -.terminal-774853547-r29 { fill: #0d0e2e } -.terminal-774853547-r30 { fill: #737387 } -.terminal-774853547-r31 { fill: #e1e1e6 } -.terminal-774853547-r32 { fill: #918d9d } -.terminal-774853547-r33 { fill: #2e2e3c;font-weight: bold } -.terminal-774853547-r34 { fill: #2e2e3c } -.terminal-774853547-r35 { fill: #a0a0a6 } -.terminal-774853547-r36 { fill: #191928 } -.terminal-774853547-r37 { fill: #b74e87 } -.terminal-774853547-r38 { fill: #87878f } -.terminal-774853547-r39 { fill: #a3a3a9 } -.terminal-774853547-r40 { fill: #777780 } -.terminal-774853547-r41 { fill: #1f1f2d } -.terminal-774853547-r42 { fill: #04b375;font-weight: bold } -.terminal-774853547-r43 { fill: #ff7ec8;font-weight: bold } -.terminal-774853547-r44 { fill: #dbdbdd } + .terminal-277448910-r1 { fill: #dfdfe1 } +.terminal-277448910-r2 { fill: #c5c8c6 } +.terminal-277448910-r3 { fill: #ff93dd } +.terminal-277448910-r4 { fill: #15111e;text-decoration: underline; } +.terminal-277448910-r5 { fill: #15111e } +.terminal-277448910-r6 { fill: #43365c } +.terminal-277448910-r7 { fill: #403e62 } +.terminal-277448910-r8 { fill: #ff69b4 } +.terminal-277448910-r9 { fill: #9b9aab } +.terminal-277448910-r10 { fill: #a684e8 } +.terminal-277448910-r11 { fill: #e3e3e8 } +.terminal-277448910-r12 { fill: #00fa9a;text-decoration: underline; } +.terminal-277448910-r13 { fill: #210d17 } +.terminal-277448910-r14 { fill: #efe3fb } +.terminal-277448910-r15 { fill: #9f9fa5 } +.terminal-277448910-r16 { fill: #632e53 } +.terminal-277448910-r17 { fill: #0ea5e9 } +.terminal-277448910-r18 { fill: #dfdfe1;font-weight: bold } +.terminal-277448910-r19 { fill: #58d1eb;font-weight: bold } +.terminal-277448910-r20 { fill: #6a6a74 } +.terminal-277448910-r21 { fill: #e3e3e8;font-weight: bold } +.terminal-277448910-r22 { fill: #252532 } +.terminal-277448910-r23 { fill: #0f0f1f } +.terminal-277448910-r24 { fill: #ede2f7 } +.terminal-277448910-r25 { fill: #e1e0e4 } +.terminal-277448910-r26 { fill: #e2e0e5 } +.terminal-277448910-r27 { fill: #e9e1f1 } +.terminal-277448910-r28 { fill: #0d0e2e } +.terminal-277448910-r29 { fill: #737387 } +.terminal-277448910-r30 { fill: #e1e1e6 } +.terminal-277448910-r31 { fill: #918d9d } +.terminal-277448910-r32 { fill: #2e2e3c;font-weight: bold } +.terminal-277448910-r33 { fill: #2e2e3c } +.terminal-277448910-r34 { fill: #a0a0a6 } +.terminal-277448910-r35 { fill: #191928 } +.terminal-277448910-r36 { fill: #b74e87 } +.terminal-277448910-r37 { fill: #87878f } +.terminal-277448910-r38 { fill: #a3a3a9 } +.terminal-277448910-r39 { fill: #777780 } +.terminal-277448910-r40 { fill: #1f1f2d } +.terminal-277448910-r41 { fill: #04b375;font-weight: bold } +.terminal-277448910-r42 { fill: #ff7ec8;font-weight: bold } +.terminal-277448910-r43 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID Send  -                               TODO_ID = 1                      $TODO_ID -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ -GET get all││HeadersBodyQueryAuthInfoScriptsOpti -█ GET get one││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -││ Content-Type     application/json      -││ Referer          https://example.com/  -││ Accept-Encoding  gzip                  -││NameValue Add header  -│╰─────────────────────────────────────────────────╯ -│╭────────────────────────────────────── Response ─╮ -││BodyHeadersCookiesScriptsTrace -││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -││ -││ -││ -│───────────────────────││ -Retrieve one todo││1:1read-onlyJSONWrap X -╰─────────────── todos ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttps://jsonplaceholder.typicode.com/todos/$TODO_ID Send  +                               TODO_ID = 1                                 +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET get all││HeadersBodyQueryAuthInfoScriptsOpti +█ GET get one││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +││ Content-Type     application/json      +││ Referer          https://example.com/  +││ Accept-Encoding  gzip                  +││NameValue Add header  +│╰─────────────────────────────────────────────────╯ +│╭────────────────────────────────────── Response ─╮ +││BodyHeadersCookiesScriptsTrace +││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +││ +││ +││ +│───────────────────────││ +Retrieve one todo││1:1read-onlyJSONWrap X +╰─────────────── todos ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help From ba7f12beaf9a105e33e95a1f2ab4e5014e084672 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 13:28:34 +0100 Subject: [PATCH 40/70] Support for keymaps at the highest level --- docs/guide/keymap.md | 77 ++++++++++++++++++++++++++++++++++++++++ mkdocs.yml | 1 + src/posting/app.py | 67 ++++++++++++++++++++++++++++++---- src/posting/posting.scss | 3 +- 4 files changed, 139 insertions(+), 9 deletions(-) create mode 100644 docs/guide/keymap.md diff --git a/docs/guide/keymap.md b/docs/guide/keymap.md new file mode 100644 index 00000000..ec8c8718 --- /dev/null +++ b/docs/guide/keymap.md @@ -0,0 +1,77 @@ +## Overview + +As explained in the [Help System](./help_system.md) section, you can view the keybindings for any widget by pressing `F1` or `?` when that widget has focus. + +If you wish to use different keybindings, you can do so by editing the `keymap` section of your `config.yaml` file. + +### Changing the keymap + +Actions in Posting have unique IDs which map to a keybinding (listed at the bottom of this page). +For any of these IDs, you can change the keybinding by adding an entry to the `keymap` section of your `config.yaml` file: + +```yaml +keymap: + : +``` + +Here's an example of changing the keybinding for the "Send Request" action: + +```yaml +keymap: + send-request: ctrl+r +``` + +After adding the above entry to `config.yaml` and restarting Posting, you'll notice that that the footer of the app now shows `^r` to send a request rather than the default `^j`. + +Now you can press `^r` to send a request *instead of* `^j`. + +You can also have multiple keys map to the same action by separating them with commas: + +```yaml +keymap: + send-request: ctrl+r,ctrl+i +``` + +Note that by adding an entry to the `keymap` you are overriding the default keybinding for that action, so if you wish to keep the default keybinding, you'll need to specify it again: + +```yaml +keymap: + send-request: ctrl+r,ctrl+i,ctrl+j +``` + +### Key format + +Support for keys in the terminal varies between terminals, multiplexers and operating systems. +It's a complex topic, and one that may involve some trial and error. +Some keys might be intercepted before reaching Posting, and your emulator might not support certain keys. + +- To specify ++ctrl+x++, use `ctrl+x`. +- To specify ++ctrl+shift+x++, use `ctrl+X` (control plus uppercase "X"). +- To specify multiple keys, separate them with commas: `ctrl+shift+left,ctrl+y`. +- To specify a function key, use `f`. For example, ++f1++ would be `f1`. +- To specify `@` (at) use `at` (*not* e.g. ++shift+2++ as this only applies to some keyboard layouts). +- Arrow keys can be specified as `left`, `right`, `up` and `down`. +- `shift` works as a modifier non-printable keys e.g. `shift+backspace`, `shift+enter`, `shift+right` are all acceptable. Support may vary depending on your emulator. +- `ctrl+enter`, `ctrl+backspace`, `ctrl+shift+enter`, `ctrl+shift+space` etc. are supported if your terminal supports the Kitty keyboard protocol. +- Other keys include `comma`, `full_stop`, `colon`, `semicolon`, `quotation_mark`, `apostrophe`, `left_bracket`, `right_square_bracket`, `left_square_bracket`, `backslash`, `vertical_line` (pipe), `plus`, `minus`, `equals_sign`, `slash`, `asterisk`,`tilde`, `percent_sign`. + +The only way to know for sure which keys are supported in your particular terminal emulator is to install Textual, run `textual keys`, press the key you want to use, and look at the `key` field of the printed output. + +!!! note + In the future, I hope to make it easier to discover which keys are supported and when key presses they correspond to for a particular environment directly within Posting. This will likely take the form of a CLI command that outputs key names and their corresponding key presses. For now, if you need assistance, please open a discussion on [GitHub](https://github.com/darrenburns/posting/discussions). + +### Binding IDs + +These are the IDs of the actions that you can change the keybinding for: + +- `send-request` - Send the current request. Default: `ctrl+j`. +- `focus-method` - Focus the method selector. Default: `ctrl+t`. +- `focus-url` - Focus the URL input. Default: `ctrl+l`. +- `save-request` - Save the current request. Default: `ctrl+s`. +- `expand-section` - Expand or shrink the section which has focus. Default: `ctrl+m`. +- `toggle-collection` - Toggle the collection browser. Default: `ctrl+h`. +- `new-request` - Create a new request. Default: `ctrl+n`. +- `commands` - Open the command palette. Default: `ctrl+p`. +- `help` - Open the help dialog for the currently focused widget. Default: `f1,?`. +- `quit` - Quit the application. Default: `ctrl+c`. +- `jump` - Enter jump mode. Default: `ctrl+o`. diff --git a/mkdocs.yml b/mkdocs.yml index 9de91133..3de9832e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -34,6 +34,7 @@ nav: - "Command Palette": "guide/command_palette.md" - "Help System": "guide/help_system.md" - "Themes": "guide/themes.md" + - "Keymaps": "guide/keymap.md" - "Importing": "guide/importing.md" - "Scripting": "guide/scripting.md" - Roadmap: "roadmap.md" diff --git a/src/posting/app.py b/src/posting/app.py index b0e2ffd9..045bd1fe 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -119,17 +119,57 @@ class AppBody(Vertical): class MainScreen(Screen[None]): AUTO_FOCUS = None BINDINGS = [ - Binding("ctrl+j", "send_request", "Send"), - Binding("ctrl+t", "change_method", "Method"), - Binding("ctrl+l", "app.focus('url-input')", "Focus URL input", show=False), - Binding("ctrl+s", "save_request", "Save"), - Binding("ctrl+n", "new_request", "New"), - Binding("ctrl+m", "toggle_expanded", "Expand section", show=False), + Binding( + "ctrl+j", + "send_request", + "Send", + tooltip="Send the current request.", + id="send-request", + ), + Binding( + "ctrl+t", + "change_method", + "Method", + tooltip="Focus the method selector.", + id="focus-method", + ), + Binding( + "ctrl+l", + "app.focus('url-input')", + "Focus URL input", + show=False, + tooltip="Focus the URL input.", + id="focus-url", + ), + Binding( + "ctrl+s", + "save_request", + "Save", + tooltip="Save the current request. If a request is open, this will overwrite it.", + id="save-request", + ), + Binding( + "ctrl+n", + "new_request", + "New", + tooltip="Create a new request", + id="new-request", + ), + Binding( + "ctrl+m", + "toggle_expanded", + "Expand section", + show=False, + tooltip="Expand or shrink the section (request or response) which has focus", + id="expand-section", + ), Binding( "ctrl+h", "toggle_collection_browser", "Toggle collection browser", show=False, + tooltip="Toggle the collection browser", + id="toggle-collection", ), ] @@ -738,19 +778,31 @@ class Posting(App[None], inherit_bindings=False): "ctrl+p", "command_palette", description="Commands", + tooltip="Open the command palette to search and run commands.", + id="commands", ), Binding( "ctrl+o", "toggle_jump_mode", description="Jump", + tooltip="Activate jump mode to quickly move focus between widgets.", + id="jump", ), Binding( "ctrl+c", "app.quit", description="Quit", + tooltip="Quit the application.", priority=True, + id="quit", + ), + Binding( + "f1,ctrl+question_mark", + "help", + "Help", + tooltip="Open the help dialog for the currently focused widget.", + id="help", ), - Binding("f1,ctrl+question_mark", "help", "Help"), Binding("f8", "save_screenshot", "Save screenshot", show=False), ] @@ -873,6 +925,7 @@ async def watch_collection_files(self) -> None: pass def on_mount(self) -> None: + self.set_keymap(self.settings.keymap) self.jumper = Jumper( { "method-selector": "1", diff --git a/src/posting/posting.scss b/src/posting/posting.scss index 9d63ed74..298bf77f 100644 --- a/src/posting/posting.scss +++ b/src/posting/posting.scss @@ -13,8 +13,7 @@ } Tooltip { - background: $surface-darken-1; - border-left: wide $accent; + background: $surface-darken-2; } AutoComplete { From cfb00f70818f8dfa7032fa0d270e58ed020f2bb8 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 13:31:48 +0100 Subject: [PATCH 41/70] docs updates for keymaps --- docs/guide/keymap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/keymap.md b/docs/guide/keymap.md index ec8c8718..cc3515b0 100644 --- a/docs/guide/keymap.md +++ b/docs/guide/keymap.md @@ -57,7 +57,7 @@ Some keys might be intercepted before reaching Posting, and your emulator might The only way to know for sure which keys are supported in your particular terminal emulator is to install Textual, run `textual keys`, press the key you want to use, and look at the `key` field of the printed output. -!!! note +!!! example "Work in progress" In the future, I hope to make it easier to discover which keys are supported and when key presses they correspond to for a particular environment directly within Posting. This will likely take the form of a CLI command that outputs key names and their corresponding key presses. For now, if you need assistance, please open a discussion on [GitHub](https://github.com/darrenburns/posting/discussions). ### Binding IDs From b038089c026317cc59ecf7abf07642c5006902a9 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 19:45:15 +0100 Subject: [PATCH 42/70] Remove the "COMING SOON" from scripting on the homepage --- docs/overrides/home.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/overrides/home.html b/docs/overrides/home.html index 73af9c34..869d363e 100644 --- a/docs/overrides/home.html +++ b/docs/overrides/home.html @@ -1714,9 +1714,8 @@

Contextual help

Scripting

- Coming Soon!

- Enhance your workflow with custom scripts, allowing you to automate repetitive tasks and extend Posting's functionality. + Run Python code before and after requests to prepare headers, set variables, and more.

From 24c6aba340bedd9e9552039dc618afb7581f0b79 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 20:00:15 +0100 Subject: [PATCH 43/70] Add alt+enter keybinding for sending request --- docs/guide/keymap.md | 7 ++++--- src/posting/app.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/guide/keymap.md b/docs/guide/keymap.md index cc3515b0..cde0cc75 100644 --- a/docs/guide/keymap.md +++ b/docs/guide/keymap.md @@ -52,8 +52,9 @@ Some keys might be intercepted before reaching Posting, and your emulator might - To specify `@` (at) use `at` (*not* e.g. ++shift+2++ as this only applies to some keyboard layouts). - Arrow keys can be specified as `left`, `right`, `up` and `down`. - `shift` works as a modifier non-printable keys e.g. `shift+backspace`, `shift+enter`, `shift+right` are all acceptable. Support may vary depending on your emulator. -- `ctrl+enter`, `ctrl+backspace`, `ctrl+shift+enter`, `ctrl+shift+space` etc. are supported if your terminal supports the Kitty keyboard protocol. -- Other keys include `comma`, `full_stop`, `colon`, `semicolon`, `quotation_mark`, `apostrophe`, `left_bracket`, `right_square_bracket`, `left_square_bracket`, `backslash`, `vertical_line` (pipe), `plus`, `minus`, `equals_sign`, `slash`, `asterisk`,`tilde`, `percent_sign`. +- `alt` also works as a modifier e.g. `alt+enter`. +- `ctrl+enter`, `alt+enter`,`ctrl+backspace`, `ctrl+shift+enter`, `ctrl+shift+space` etc. are supported if your terminal supports the Kitty keyboard protocol. +- Other keys include (but are not limited to) `comma`, `full_stop`, `colon`, `semicolon`, `quotation_mark`, `apostrophe`, `left_bracket`, `right_square_bracket`, `left_square_bracket`, `backslash`, `vertical_line` (pipe |), `plus`, `minus`, `equals_sign`, `slash`, `asterisk`,`tilde`, `percent_sign`. The only way to know for sure which keys are supported in your particular terminal emulator is to install Textual, run `textual keys`, press the key you want to use, and look at the `key` field of the printed output. @@ -64,7 +65,7 @@ The only way to know for sure which keys are supported in your particular termin These are the IDs of the actions that you can change the keybinding for: -- `send-request` - Send the current request. Default: `ctrl+j`. +- `send-request` - Send the current request. Default: `ctrl+j,alt+enter`. - `focus-method` - Focus the method selector. Default: `ctrl+t`. - `focus-url` - Focus the URL input. Default: `ctrl+l`. - `save-request` - Save the current request. Default: `ctrl+s`. diff --git a/src/posting/app.py b/src/posting/app.py index 045bd1fe..f7a672f3 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -120,7 +120,7 @@ class MainScreen(Screen[None]): AUTO_FOCUS = None BINDINGS = [ Binding( - "ctrl+j", + "ctrl+j,alt+enter", "send_request", "Send", tooltip="Send the current request.", From ce7c02ba8e2210b67f7370350f9cac8a83a1399e Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 20:08:12 +0100 Subject: [PATCH 44/70] Add note on keymaps to home page, allow moving cursor in confirmation dialog using arrow keys --- docs/overrides/home.html | 5 ++++- src/posting/widgets/confirmation.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/docs/overrides/home.html b/docs/overrides/home.html index 869d363e..230491ab 100644 --- a/docs/overrides/home.html +++ b/docs/overrides/home.html @@ -1696,7 +1696,10 @@

Adjust the user interface to your liking through the configuration system or at runtime. -

+

+

+ Customize keybindings to your liking using the keymap system. +

A selection of Posting's themes stacked on top of each other. diff --git a/src/posting/widgets/confirmation.py b/src/posting/widgets/confirmation.py index 5a9225dc..e584965d 100644 --- a/src/posting/widgets/confirmation.py +++ b/src/posting/widgets/confirmation.py @@ -3,6 +3,7 @@ from typing import Literal from textual import on from textual.app import ComposeResult +from textual.binding import Binding from textual.containers import Horizontal, Vertical from textual.screen import ModalScreen from textual.widgets import Button, Static @@ -26,6 +27,15 @@ class ConfirmationModal(ModalScreen[bool]): } """ + BINDINGS = [ + Binding( + "left,right,up,down,h,j,k,l", + "move_focus", + "Navigate", + show=False, + ) + ] + def __init__( self, message: str, @@ -68,3 +78,7 @@ def confirm(self) -> None: @on(Button.Pressed, "#cancel-button") def cancel(self) -> None: self.dismiss(False) + + def action_move_focus(self) -> None: + # It's enough to just call focus_next here as there are only two buttons. + self.screen.focus_next() From 8b4f84bf37b53767d56a196a64498ad45573dd79 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 20:16:22 +0100 Subject: [PATCH 45/70] More docs --- docs/guide/requests.md | 12 +++++++++++- docs/guide/scripting.md | 4 ++++ src/posting/widgets/variable_autocomplete.py | 2 -- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/docs/guide/requests.md b/docs/guide/requests.md index 8cde56c5..5a845059 100644 --- a/docs/guide/requests.md +++ b/docs/guide/requests.md @@ -37,6 +37,12 @@ By default, this name is used to generate the filename, but you can also choose Within the "Directory" field of this dialog, it's important to note that `.` refers to the currently loaded *collection* directory (that is, the directory that was loaded using the `--collection` option), and *not* necessarily the current working directory. +### Duplicating a request + +With a the cursor over a request in the collection tree, press ++d++ to create a duplicate of that request. This will bring up a dialog allowing you to change the name and description of the request, or move it to another location. + +To skip the dialog and quickly duplicate the request, press ++shift+d++, creating it as a sibling of the original request. The file name of the new request will be generated automatically. You can always modify the name and description after it's created in the `Info` tab. + ## Saving a request Press ++ctrl+s++ to save the currently open request. @@ -49,4 +55,8 @@ If the request is already saved on disk, ++ctrl+s++ will overwrite the previous Requests are stored on your file system as simple YAML files, suffixed with `.posting.yaml`. -A directory can be loaded into Posting using the `--collection` option, and all `.posting.yaml` files in that directory will be displayed in the sidebar. \ No newline at end of file +A directory can be loaded into Posting using the `--collection` option, and all `.posting.yaml` files in that directory will be displayed in the sidebar. + +## Deleting a request + +You can delete a request by moving the cursor over it in the tree, and pressing ++backspace++. diff --git a/docs/guide/scripting.md b/docs/guide/scripting.md index 6d8512c6..13477396 100644 --- a/docs/guide/scripting.md +++ b/docs/guide/scripting.md @@ -46,6 +46,10 @@ Press ++ctrl+e++ while a script input field inside the `Scripts` tab is focused !!! warning As of version 2.0.0, the script file must exist *before* pressing ++ctrl+e++. Posting will not create the file for you. +## Script logs + +If your script writes to `stdout` or `stderr`, you'll see the output in the `Scripts` tab in the Response section. + ### Example: Setup script The **setup script** is run before the request is built. diff --git a/src/posting/widgets/variable_autocomplete.py b/src/posting/widgets/variable_autocomplete.py index 14689388..a16380a3 100644 --- a/src/posting/widgets/variable_autocomplete.py +++ b/src/posting/widgets/variable_autocomplete.py @@ -87,10 +87,8 @@ def _search_string(self, target_state: TargetState) -> str: text = target_state.text if is_cursor_within_variable(cursor, text): variable_at_cursor = get_variable_at_cursor(cursor, text) - print(f"search string = {variable_at_cursor}") return variable_at_cursor or "" else: - print(f"search string = {target_state.text}") return target_state.text def get_variable_candidates(self, target_state: TargetState) -> list[DropdownItem]: From ecfe35f0764b2cb8fd0162c5ec95f8cafdb12021 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 20:17:24 +0100 Subject: [PATCH 46/70] Full stops in tooltips --- src/posting/app.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/posting/app.py b/src/posting/app.py index f7a672f3..df30696a 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -152,7 +152,7 @@ class MainScreen(Screen[None]): "ctrl+n", "new_request", "New", - tooltip="Create a new request", + tooltip="Create a new request.", id="new-request", ), Binding( @@ -160,7 +160,7 @@ class MainScreen(Screen[None]): "toggle_expanded", "Expand section", show=False, - tooltip="Expand or shrink the section (request or response) which has focus", + tooltip="Expand or shrink the section (request or response) which has focus.", id="expand-section", ), Binding( @@ -168,7 +168,7 @@ class MainScreen(Screen[None]): "toggle_collection_browser", "Toggle collection browser", show=False, - tooltip="Toggle the collection browser", + tooltip="Toggle the collection browser.", id="toggle-collection", ), ] @@ -803,7 +803,7 @@ class Posting(App[None], inherit_bindings=False): tooltip="Open the help dialog for the currently focused widget.", id="help", ), - Binding("f8", "save_screenshot", "Save screenshot", show=False), + Binding("f8", "save_screenshot", "Save screenshot.", show=False), ] def __init__( From 8c384baf27506fdf9670a49001a744634c7cc32a Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 21:51:16 +0100 Subject: [PATCH 47/70] Recommend `uv` for installation --- README.md | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 18fde5cf..4e4609bf 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,9 @@ Some notable features include: - autocompletion - syntax highlighting using tree-sitter - Vim keys +- customizable keybindings - user-defined themes +- run Python code before and after requests - configuration - "open in $EDITOR" - a command palette for quickly accessing functionality @@ -22,28 +24,21 @@ Visit the [website](https://posting.sh) for more information, the roadmap, and t ## Installation -Posting can be installed via [`pipx`](https://pipx.pypa.io/stable/) or [Rye](https://rye-up.com/guide/installation) on MacOS, Linux, and Windows: +Posting can be installed via [uv](https://docs.astral.sh/uv/getting-started/installation/) on MacOS, Linux, and Windows. -```bash -pipx install posting -# or -rye install posting -``` +`uv` is a single Rust binary that you can use to install Python packages in an isolated environment on MacOS, Linux, and Windows. It's significantly faster than alternative tools, and will have you up and running in seconds. -### Rye is recommended - -Rye is recommended, as it is significantly faster than Homebrew and `pipx`, and can install Posting in under a second. +You don't even need to worry about installing Python yourself - `uv` will manage everything for you. ```bash # quick install on MacOS/Linux -curl -sSf https://rye.astral.sh/get | bash +curl -LsSf https://astral.sh/uv/install.sh | sh # install Posting -rye install posting +uv tool install --python 3.11 posting ``` -Windows users should follow the guide [Rye](https://rye-up.com/guide/installation) to learn how to install Rye. - +`uv` can also be installed via Homebrew, Cargo, Winget, pipx, and more. See the [installation guide](https://docs.astral.sh/uv/getting-started/installation/) for more information. ## Learn More From 42b0f5ddceb5cf5be0b89d31af62678442b50abe Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 22:03:44 +0100 Subject: [PATCH 48/70] uv shill --- README.md | 12 +++++++++--- src/posting/config.py | 7 +++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4e4609bf..bebd803f 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Visit the [website](https://posting.sh) for more information, the roadmap, and t Posting can be installed via [uv](https://docs.astral.sh/uv/getting-started/installation/) on MacOS, Linux, and Windows. -`uv` is a single Rust binary that you can use to install Python packages in an isolated environment on MacOS, Linux, and Windows. It's significantly faster than alternative tools, and will have you up and running in seconds. +`uv` is a single Rust binary that you can use to install Python apps. It's significantly faster than alternative tools, and will get you up and running with Posting in seconds. You don't even need to worry about installing Python yourself - `uv` will manage everything for you. @@ -34,12 +34,18 @@ You don't even need to worry about installing Python yourself - `uv` will manage # quick install on MacOS/Linux curl -LsSf https://astral.sh/uv/install.sh | sh -# install Posting -uv tool install --python 3.11 posting +# install Posting (will also quickly install Python 3.12 if needed) +uv tool install --python 3.12 posting ``` `uv` can also be installed via Homebrew, Cargo, Winget, pipx, and more. See the [installation guide](https://docs.astral.sh/uv/getting-started/installation/) for more information. +`uv` also makes it easy to install additional Python packages into your Posting environment, which you can then use in your pre-request/post-response scripts. + +### Prefer `pipx`? + +If you'd prefer to use `pipx`, that works too: `pipx install posting`. + ## Learn More Learn more about Posting at [https://posting.sh](https://posting.sh). diff --git a/src/posting/config.py b/src/posting/config.py index afefc4d5..ae023993 100644 --- a/src/posting/config.py +++ b/src/posting/config.py @@ -54,6 +54,13 @@ class FocusSettings(BaseModel): If this value is unset, focus will not shift when a response is received.""" + on_request_open: ( + Literal["headers", "body", "query", "auth", "info", "scripts", "options"] | None + ) = Field(default=None) + """On opening a request using the sidebar collection browser, move focus to the specified target. + + If this value is unset, focus will not shift when a request is opened.""" + class CertificateSettings(BaseModel): """Configuration for SSL CA bundles and client certificates.""" From c7452df7e59fea9b7a293157e70a8ea5c9bad38c Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 22:26:50 +0100 Subject: [PATCH 49/70] Config to switch focus automatically when a request is opened --- src/posting/app.py | 11 +++++++++++ src/posting/config.py | 6 +++++- src/posting/widgets/request/query_editor.py | 7 ++++++- src/posting/widgets/request/request_editor.py | 4 ++++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/posting/app.py b/src/posting/app.py index df30696a..25efdd4b 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -472,6 +472,17 @@ def on_response_received(self, event: HttpResponseReceived) -> None: def on_request_selected(self, event: CollectionTree.RequestSelected) -> None: """Load a request model into the UI when a request is selected.""" self.load_request_model(event.request) + if focus_on_request_open := self.settings.focus.on_request_open: + targets = { + "headers": self.headers_table, + "body": self.request_editor.request_body_type_select, + "query": self.request_editor.query_editor.query_key_input, + "info": self.request_metadata.request_name_input, + "url": self.url_input, + "method": self.method_selector, + } + if target := targets.get(focus_on_request_open): + self.set_focus(target) @on(CollectionTree.RequestCacheUpdated) def on_request_cache_updated( diff --git a/src/posting/config.py b/src/posting/config.py index ae023993..f61fca33 100644 --- a/src/posting/config.py +++ b/src/posting/config.py @@ -55,10 +55,14 @@ class FocusSettings(BaseModel): If this value is unset, focus will not shift when a response is received.""" on_request_open: ( - Literal["headers", "body", "query", "auth", "info", "scripts", "options"] | None + Literal["headers", "body", "query", "info", "url", "method"] | None ) = Field(default=None) """On opening a request using the sidebar collection browser, move focus to the specified target. + Valid values are: `headers`, `body`, `query`, `info`, `url`, `method`. + + This will move focus *inside* the target tab, to the topmost widget in the tab. + If this value is unset, focus will not shift when a request is opened.""" diff --git a/src/posting/widgets/request/query_editor.py b/src/posting/widgets/request/query_editor.py index 3e79a01b..df0f9c92 100644 --- a/src/posting/widgets/request/query_editor.py +++ b/src/posting/widgets/request/query_editor.py @@ -1,6 +1,7 @@ from textual.app import ComposeResult from textual.binding import Binding from textual.containers import Vertical +from textual.widgets import Input from posting.collection import QueryParam from posting.widgets.datatable import PostingDataTable @@ -60,9 +61,13 @@ def compose(self) -> ComposeResult: yield KeyValueEditor( ParamsTable(), KeyValueInput( - VariableInput(placeholder="Key"), + VariableInput(placeholder="Key", id="query-key-input"), VariableInput(placeholder="Value"), button_label="Add parameter", ), empty_message="There are no parameters.", ) + + @property + def query_key_input(self) -> Input: + return self.query_one("#query-key-input", Input) diff --git a/src/posting/widgets/request/request_editor.py b/src/posting/widgets/request/request_editor.py index b7b8f56a..70c448fd 100644 --- a/src/posting/widgets/request/request_editor.py +++ b/src/posting/widgets/request/request_editor.py @@ -122,6 +122,10 @@ def text_editor(self) -> TextEditor: def form_editor(self) -> FormEditor: return self.query_one("#form-body-editor", FormEditor) + @property + def query_editor(self) -> QueryStringEditor: + return self.query_one(QueryStringEditor) + def to_request_model_args(self) -> dict[str, Any]: """Returns a dictionary containing the arguments that should be passed to the httpx.Request object. The keys will depend on the From bee0cc3da102db57a59f730cf4c286dd73c350ec Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 22:28:29 +0100 Subject: [PATCH 50/70] Focus on request open documentation --- docs/guide/configuration.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md index 1f4ff54a..da19145b 100644 --- a/docs/guide/configuration.md +++ b/docs/guide/configuration.md @@ -129,6 +129,7 @@ The table below lists all available configuration options and their environment | `ssl.password` (`POSTING_SSL__PASSWORD`) | Password for the key file. (Default: `unset`) | Password to decrypt the key file if it's encrypted. | | `focus.on_startup` (`POSTING_FOCUS__ON_STARTUP`) | `"url"`, `"method", "collection"` (Default: `"url"`) | Automatically focus the URL bar, method, or collection browser when the app starts. | | `focus.on_response` (`POSTING_FOCUS__ON_RESPONSE`) | `"body"`, `"tabs"` (Default: `unset`)| Automatically focus the response tabs or response body text area when a response is received. | +| `focus.on_request_open` (`POSTING_FOCUS__ON_REQUEST_OPEN`) | `"headers"`, `"body"`, `"query"`, `"info"`, `"url"`, `"method"` (Default: `unset`) | Automatically focus the specified target when a request is opened from the collection browser. | | `text_input.blinking_cursor` (`POSTING_TEXT_INPUT__BLINKING_CURSOR`) | `true`, `false` (Default: `true`) | If enabled, the cursor will blink in input widgets and text area widgets. | | `command_palette.theme_preview` (`POSTING_COMMAND_PALETTE__THEME_PREVIEW`) | `true`, `false` (Default: `false`) | If enabled, the command palette will display a preview of the selected theme when the cursor is over it. This will slow down cursor movement and so is disabled by default. | | `use_xresources` (`POSTING_USE_XRESOURCES`) | `true`, `false` (Default: `false`) | Try to create themes called `xresources-dark` and `xresources-light` (see the section below) | From b755e7b6c580d8b7b35dfb3de6ce8e1509d44257 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 23:02:40 +0100 Subject: [PATCH 51/70] Fixing snapshots --- .coverage | Bin 53248 -> 53248 bytes src/posting/variables.py | 2 +- ...n_run_command__hide_collection_browser.svg | 172 ++++++------- ...alette.test_can_type_to_filter_options.svg | 182 +++++++------- ...test_loads_and_shows_discovery_options.svg | 228 +++++++++--------- ...focus_on_request_open__open_body[body].svg | 197 +++++++++++++++ ...us_on_request_open__open_body[headers].svg | 192 +++++++++++++++ ...focus_on_request_open__open_body[info].svg | 189 +++++++++++++++ ...cus_on_request_open__open_body[method].svg | 192 +++++++++++++++ ...ocus_on_request_open__open_body[query].svg | 196 +++++++++++++++ ..._focus_on_request_open__open_body[url].svg | 195 +++++++++++++++ tests/test_snapshots.py | 30 ++- 12 files changed, 1485 insertions(+), 290 deletions(-) create mode 100644 tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[body].svg create mode 100644 tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[headers].svg create mode 100644 tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[info].svg create mode 100644 tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[method].svg create mode 100644 tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[query].svg create mode 100644 tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[url].svg diff --git a/.coverage b/.coverage index f51e32a82667bc39f234d8622a90634ad0d55f6f..b3c13d425ab32ee9b32a446febde601f9f722725 100644 GIT binary patch delta 750 zcmZ{eSx8i26vw~Yo$apQI5><8=x92IdoE)xG)7@rLHbZ3nhT;t4E4~W6gqco`Oq14 z@KQd6AodbMPSUFu?KgxIVH+VD8a^JYO+)eH>SIC{_ zj&iZ=3j2W_W&7Dq_C9N4tJz96hfQF$tb$o(J~B_34(1wD#vEZ{m@r1mFtkLk(qrIn zb?ekqsa`@XA!oG=<+ zn*kWazwJmRQ6-@#^D3(qpwuoY+TFKYglkxI*fLl-@{>^%PvEg~ang1mvz(wbhn$jX z7Z8+x+N564|MP0>fu7@n6Bl9!*(RVrM|PGQ1xt3U()>LM9nLlkh!CCdM}&&x9xo z_xjk`KmekryZZV_7G+`*6yr-D0NatI4rSmrG1})nGp+&~p=DJbU)AEm!WU9(YfL)^ zQQGc))XU_3!sc+x?^aTcjF^NQ*2YNR8xN5BHv^R@6(e=zB%whm*cl>t*=I?zyz5;8 zzdjKn*QBQu=pat`uxDaiQ-RJO#p5nI#8(qCS5j-Tllc0DQYhv(1ca(l49>!Xx01nN zvrnm#jmsz$jgfy)@!_Eqv9)QLR-#A@)Y=D7tZ%LoEe%Bl`%y4PCz#s2&8w~nV@RoF zHoAAZC(LGd&vPSi_jpHsKthLt@KhpQJl#ewDLw0PE05-)22C?2r2+-wgs13m6o5^R SYR&Er7XerolWfHuj_f~TSO-r4 delta 740 zcmXYtYes5mOEcGp$_OI;5R&M$D|8VBF{8-6N_0@C z2`^+C(K7IZ;H516uq1<|%(SAiV(EmaFL^^z=cT=!rRUS{|9j5!aGoQ$Nx@Ba6M~Zp zfHbNUKpp*zZl@cmQaXpuqD{08O3({O;VbwEwm>I8&5!f_d<`t;ck%=`#WleT+%1>~ zbD)en#wEZbTolK$ewfMrVn4G_+57BGwj9Q@Cs->qvVfUpMwmXPgL%j_F?Ec<lCkrXZ+lt->MM=LG3>pVR}u#JMU-?5Z(47u!1(wz06rySU|x=W&5=v0(gS zbD*THq->zyvw0SLYi)(Y%9i5GuI~T{1OR@iFs3l-Xtwey07ZhNbbGIN6WxRKTOijW ztDK-Lk%1eLlZBOb7bz1~4i)hV6e6c6j!+{zE{7)mj*;^yBO9|JenJO;j2?oVu&~LMnlXha2q>u$it=^IOGFgS9F>Au^@Zxksey$Nk z;CPU(%w8$$9!Z^gFmnE$v$wgv*xNg%Eb{hB{&izG(&Ib3pd)|dxA0!T0KgzYDv=IX zI0~B3Rt$&LOD?ZT1YkjIz3mXqwdr!)Q7^u)jXoO$yv*KCNxgwu+o(anV}e?fI?r#~ z6zfmm-?Yi|stt-ws!k-qWWbkqsXzD6plrit?3tNOI)lT9<>f@je&-u;xb~~qQI{3V zpndo``nW*a3$PYVZb9idS}lRU$KR=eKk8J4FHkW%W6cy3UA8n1*>E*7WpOI%OHMooebenTyR3fst&j% TLPjKs*XrlRD-9K`jR*b#N7VG8 diff --git a/src/posting/variables.py b/src/posting/variables.py index 4673562c..98a731b3 100644 --- a/src/posting/variables.py +++ b/src/posting/variables.py @@ -55,7 +55,7 @@ def load_variables( existing_variables = get_variables() if existing_variables and not avoid_cache: - return {key: value for key, value in existing_variables} + return {key: value for key, value in existing_variables.items()} variables: dict[str, object] = { key: value diff --git a/tests/__snapshots__/test_snapshots/TestCommandPalette.test_can_run_command__hide_collection_browser.svg b/tests/__snapshots__/test_snapshots/TestCommandPalette.test_can_run_command__hide_collection_browser.svg index 24cca2e8..101c7dfa 100644 --- a/tests/__snapshots__/test_snapshots/TestCommandPalette.test_can_run_command__hide_collection_browser.svg +++ b/tests/__snapshots__/test_snapshots/TestCommandPalette.test_can_run_command__hide_collection_browser.svg @@ -19,162 +19,162 @@ font-weight: 700; } - .terminal-3721920745-matrix { + .terminal-139384128-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3721920745-title { + .terminal-139384128-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3721920745-r1 { fill: #dfdfe1 } -.terminal-3721920745-r2 { fill: #c5c8c6 } -.terminal-3721920745-r3 { fill: #ff93dd } -.terminal-3721920745-r4 { fill: #15111e;text-decoration: underline; } -.terminal-3721920745-r5 { fill: #15111e } -.terminal-3721920745-r6 { fill: #43365c } -.terminal-3721920745-r7 { fill: #403e62 } -.terminal-3721920745-r8 { fill: #210d17 } -.terminal-3721920745-r9 { fill: #7e7c92 } -.terminal-3721920745-r10 { fill: #e3e3e8 } -.terminal-3721920745-r11 { fill: #efe3fb } -.terminal-3721920745-r12 { fill: #9f9fa5 } -.terminal-3721920745-r13 { fill: #632e53 } -.terminal-3721920745-r14 { fill: #dfdfe1;font-weight: bold } -.terminal-3721920745-r15 { fill: #6a6a74 } -.terminal-3721920745-r16 { fill: #252532 } -.terminal-3721920745-r17 { fill: #ff69b4 } -.terminal-3721920745-r18 { fill: #252441 } -.terminal-3721920745-r19 { fill: #737387 } -.terminal-3721920745-r20 { fill: #e1e1e6 } -.terminal-3721920745-r21 { fill: #918d9d } -.terminal-3721920745-r22 { fill: #2e2e3c;font-weight: bold } -.terminal-3721920745-r23 { fill: #2e2e3c } -.terminal-3721920745-r24 { fill: #a0a0a6 } -.terminal-3721920745-r25 { fill: #191928 } -.terminal-3721920745-r26 { fill: #b74e87 } -.terminal-3721920745-r27 { fill: #87878f } -.terminal-3721920745-r28 { fill: #a3a3a9 } -.terminal-3721920745-r29 { fill: #777780 } -.terminal-3721920745-r30 { fill: #1f1f2d } -.terminal-3721920745-r31 { fill: #04b375;font-weight: bold } -.terminal-3721920745-r32 { fill: #ff7ec8;font-weight: bold } -.terminal-3721920745-r33 { fill: #dbdbdd } + .terminal-139384128-r1 { fill: #dfdfe1 } +.terminal-139384128-r2 { fill: #c5c8c6 } +.terminal-139384128-r3 { fill: #ff93dd } +.terminal-139384128-r4 { fill: #15111e;text-decoration: underline; } +.terminal-139384128-r5 { fill: #15111e } +.terminal-139384128-r6 { fill: #43365c } +.terminal-139384128-r7 { fill: #403e62 } +.terminal-139384128-r8 { fill: #210d17 } +.terminal-139384128-r9 { fill: #7e7c92 } +.terminal-139384128-r10 { fill: #e3e3e8 } +.terminal-139384128-r11 { fill: #efe3fb } +.terminal-139384128-r12 { fill: #9f9fa5 } +.terminal-139384128-r13 { fill: #632e53 } +.terminal-139384128-r14 { fill: #dfdfe1;font-weight: bold } +.terminal-139384128-r15 { fill: #6a6a74 } +.terminal-139384128-r16 { fill: #252532 } +.terminal-139384128-r17 { fill: #ff69b4 } +.terminal-139384128-r18 { fill: #252441 } +.terminal-139384128-r19 { fill: #737387 } +.terminal-139384128-r20 { fill: #e1e1e6 } +.terminal-139384128-r21 { fill: #918d9d } +.terminal-139384128-r22 { fill: #2e2e3c;font-weight: bold } +.terminal-139384128-r23 { fill: #2e2e3c } +.terminal-139384128-r24 { fill: #a0a0a6 } +.terminal-139384128-r25 { fill: #191928 } +.terminal-139384128-r26 { fill: #b74e87 } +.terminal-139384128-r27 { fill: #87878f } +.terminal-139384128-r28 { fill: #a3a3a9 } +.terminal-139384128-r29 { fill: #777780 } +.terminal-139384128-r30 { fill: #1f1f2d } +.terminal-139384128-r31 { fill: #04b375;font-weight: bold } +.terminal-139384128-r32 { fill: #ff7ec8;font-weight: bold } +.terminal-139384128-r33 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GETEnter a URL... Send  - -╭──────────────────────────────────────────────────────────────── Request ─╮ -HeadersBodyQueryAuthInfoOptions -━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -NameValue Add header  -╰──────────────────────────────────────────────────────────────────────────╯ -╭─────────────────────────────────────────────────────────────── Response ─╮ -BodyHeadersCookiesTrace -━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - - - -1:1read-onlyJSONWrap X -╰──────────────────────────────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GETEnter a URL... Send  + +╭──────────────────────────────────────────────────────────────── Request ─╮ +HeadersBodyQueryAuthInfoScriptsOptions +━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +NameValue Add header  +╰──────────────────────────────────────────────────────────────────────────╯ +╭─────────────────────────────────────────────────────────────── Response ─╮ +BodyHeadersCookiesScriptsTrace +━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + + + +1:1read-onlyJSONWrap X +╰──────────────────────────────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestCommandPalette.test_can_type_to_filter_options.svg b/tests/__snapshots__/test_snapshots/TestCommandPalette.test_can_type_to_filter_options.svg index 0cde64f3..5b02333a 100644 --- a/tests/__snapshots__/test_snapshots/TestCommandPalette.test_can_type_to_filter_options.svg +++ b/tests/__snapshots__/test_snapshots/TestCommandPalette.test_can_type_to_filter_options.svg @@ -19,166 +19,168 @@ font-weight: 700; } - .terminal-2331259748-matrix { + .terminal-3180261465-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2331259748-title { + .terminal-3180261465-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2331259748-r1 { fill: #b2b2b4 } -.terminal-2331259748-r2 { fill: #c5c8c6 } -.terminal-2331259748-r3 { fill: #dfdfe0 } -.terminal-2331259748-r4 { fill: #cc75b0 } -.terminal-2331259748-r5 { fill: #100d18;text-decoration: underline; } -.terminal-2331259748-r6 { fill: #100d18 } -.terminal-2331259748-r7 { fill: #352b49 } -.terminal-2331259748-r8 { fill: #33314e } -.terminal-2331259748-r9 { fill: #ff69b4 } -.terminal-2331259748-r10 { fill: #b5b5b9 } -.terminal-2331259748-r11 { fill: #bfb5c8 } -.terminal-2331259748-r12 { fill: #7f7f84 } -.terminal-2331259748-r13 { fill: #210d17 } -.terminal-2331259748-r14 { fill: #4f2442 } -.terminal-2331259748-r15 { fill: #7b7b88;font-weight: bold } -.terminal-2331259748-r16 { fill: #b5b5b9;font-weight: bold } -.terminal-2331259748-r17 { fill: #dfdfe0;font-weight: bold } -.terminal-2331259748-r18 { fill: #fed700;font-weight: bold } -.terminal-2331259748-r19 { fill: #54545c } -.terminal-2331259748-r20 { fill: #6f6f75 } -.terminal-2331259748-r21 { fill: #1d1d28 } -.terminal-2331259748-r22 { fill: #1d1c34 } -.terminal-2331259748-r23 { fill: #6f6f75;font-weight: bold } -.terminal-2331259748-r24 { fill: #00934c } -.terminal-2331259748-r25 { fill: #74707d } -.terminal-2331259748-r26 { fill: #242430;font-weight: bold } -.terminal-2331259748-r27 { fill: #242430 } -.terminal-2331259748-r28 { fill: #808084 } -.terminal-2331259748-r29 { fill: #141420 } -.terminal-2331259748-r30 { fill: #923e6c } -.terminal-2331259748-r31 { fill: #6c6c72 } -.terminal-2331259748-r32 { fill: #828287 } -.terminal-2331259748-r33 { fill: #5f5f66 } -.terminal-2331259748-r34 { fill: #181824 } -.terminal-2331259748-r35 { fill: #038f5d;font-weight: bold } -.terminal-2331259748-r36 { fill: #cc64a0;font-weight: bold } -.terminal-2331259748-r37 { fill: #afafb0 } + .terminal-3180261465-r1 { fill: #b2b2b4 } +.terminal-3180261465-r2 { fill: #c5c8c6 } +.terminal-3180261465-r3 { fill: #dfdfe0 } +.terminal-3180261465-r4 { fill: #cc75b0 } +.terminal-3180261465-r5 { fill: #100d18;text-decoration: underline; } +.terminal-3180261465-r6 { fill: #100d18 } +.terminal-3180261465-r7 { fill: #352b49 } +.terminal-3180261465-r8 { fill: #33314e } +.terminal-3180261465-r9 { fill: #ff69b4 } +.terminal-3180261465-r10 { fill: #b5b5b9 } +.terminal-3180261465-r11 { fill: #bfb5c8 } +.terminal-3180261465-r12 { fill: #7f7f84 } +.terminal-3180261465-r13 { fill: #210d17 } +.terminal-3180261465-r14 { fill: #4f2442 } +.terminal-3180261465-r15 { fill: #b5b5b9;font-weight: bold } +.terminal-3180261465-r16 { fill: #dfdfe0;font-weight: bold } +.terminal-3180261465-r17 { fill: #fed700;font-weight: bold } +.terminal-3180261465-r18 { fill: #54545c } +.terminal-3180261465-r19 { fill: #0b84ba } +.terminal-3180261465-r20 { fill: #1d1d28 } +.terminal-3180261465-r21 { fill: #1b9d4b } +.terminal-3180261465-r22 { fill: #1d1c34 } +.terminal-3180261465-r23 { fill: #6f6f75 } +.terminal-3180261465-r24 { fill: #6f6f75;font-weight: bold } +.terminal-3180261465-r25 { fill: #00934c } +.terminal-3180261465-r26 { fill: #74707d } +.terminal-3180261465-r27 { fill: #bf3636 } +.terminal-3180261465-r28 { fill: #242430;font-weight: bold } +.terminal-3180261465-r29 { fill: #242430 } +.terminal-3180261465-r30 { fill: #808084 } +.terminal-3180261465-r31 { fill: #141420 } +.terminal-3180261465-r32 { fill: #923e6c } +.terminal-3180261465-r33 { fill: #6c6c72 } +.terminal-3180261465-r34 { fill: #828287 } +.terminal-3180261465-r35 { fill: #5f5f66 } +.terminal-3180261465-r36 { fill: #181824 } +.terminal-3180261465-r37 { fill: #038f5d;font-weight: bold } +.terminal-3180261465-r38 { fill: #cc64a0;font-weight: bold } +.terminal-3180261465-r39 { fill: #afafb0 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GET Send  -view -╭─ Collection── Request ─╮ - GET echoview: expand request                           tions - GET get ranExpand the request section━━━━━━━━━━━━ - POS echo poview: expand response                          ╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplacehExpand the response section╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/view: toggle collection browser                ╱╱╱╱╱╱╱╱╱╱╱╱ - GET getToggle the collection browserd header  - GET get────────────╯ - POS create       │╭────────────────────────────────────── Response ─╮ - DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GET Send  +view +╭─ Collection── Request ─╮ + GET echoview: expand request                           riptsOptio +GET get ranExpand the request section━━━━━━━━━━━━ +POS echo poview: expand response                          ╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplacehExpand the response section╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/view: toggle collection browser                ╱╱╱╱╱╱╱╱╱╱╱╱ +GET getToggle the collection browserd header  +GET get────────────╯ +POS create       │╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo ││ +server we can use to ││ +see exactly what ││ +request is being ││ +sent.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help diff --git a/tests/__snapshots__/test_snapshots/TestCommandPalette.test_loads_and_shows_discovery_options.svg b/tests/__snapshots__/test_snapshots/TestCommandPalette.test_loads_and_shows_discovery_options.svg index 1ea586fd..a461773e 100644 --- a/tests/__snapshots__/test_snapshots/TestCommandPalette.test_loads_and_shows_discovery_options.svg +++ b/tests/__snapshots__/test_snapshots/TestCommandPalette.test_loads_and_shows_discovery_options.svg @@ -19,206 +19,214 @@ font-weight: 700; } - .terminal-892557118-matrix { + .terminal-3512500749-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-892557118-title { + .terminal-3512500749-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-892557118-r1 { fill: #b2b2b4 } -.terminal-892557118-r2 { fill: #c5c8c6 } -.terminal-892557118-r3 { fill: #dfdfe0 } -.terminal-892557118-r4 { fill: #cc75b0 } -.terminal-892557118-r5 { fill: #100d18;text-decoration: underline; } -.terminal-892557118-r6 { fill: #100d18 } -.terminal-892557118-r7 { fill: #352b49 } -.terminal-892557118-r8 { fill: #33314e } -.terminal-892557118-r9 { fill: #1a0a12 } -.terminal-892557118-r10 { fill: #646374 } -.terminal-892557118-r11 { fill: #b5b5b9 } -.terminal-892557118-r12 { fill: #ff69b4 } -.terminal-892557118-r13 { fill: #bfb5c8 } -.terminal-892557118-r14 { fill: #7f7f84 } -.terminal-892557118-r15 { fill: #210d17 } -.terminal-892557118-r16 { fill: #68686f } -.terminal-892557118-r17 { fill: #4f2442 } -.terminal-892557118-r18 { fill: #7b7b88;font-weight: bold } -.terminal-892557118-r19 { fill: #b5b5b9;font-weight: bold } -.terminal-892557118-r20 { fill: #dfdfe0;font-weight: bold } -.terminal-892557118-r21 { fill: #6f6f75 } -.terminal-892557118-r22 { fill: #1d1d28 } -.terminal-892557118-r23 { fill: #1d1c34 } -.terminal-892557118-r24 { fill: #6f6f75;font-weight: bold } -.terminal-892557118-r25 { fill: #00934c } -.terminal-892557118-r26 { fill: #b4b4b8 } -.terminal-892557118-r27 { fill: #74707d } -.terminal-892557118-r28 { fill: #808084 } -.terminal-892557118-r29 { fill: #141420 } -.terminal-892557118-r30 { fill: #0d0e2e;font-weight: bold } -.terminal-892557118-r31 { fill: #6c6c72 } -.terminal-892557118-r32 { fill: #828287 } -.terminal-892557118-r33 { fill: #5f5f66 } -.terminal-892557118-r34 { fill: #181824 } -.terminal-892557118-r35 { fill: #038f5d;font-weight: bold } -.terminal-892557118-r36 { fill: #cc64a0;font-weight: bold } -.terminal-892557118-r37 { fill: #afafb0 } + .terminal-3512500749-r1 { fill: #b2b2b4 } +.terminal-3512500749-r2 { fill: #c5c8c6 } +.terminal-3512500749-r3 { fill: #dfdfe0 } +.terminal-3512500749-r4 { fill: #cc75b0 } +.terminal-3512500749-r5 { fill: #100d18;text-decoration: underline; } +.terminal-3512500749-r6 { fill: #100d18 } +.terminal-3512500749-r7 { fill: #352b49 } +.terminal-3512500749-r8 { fill: #33314e } +.terminal-3512500749-r9 { fill: #1a0a12 } +.terminal-3512500749-r10 { fill: #646374 } +.terminal-3512500749-r11 { fill: #b5b5b9 } +.terminal-3512500749-r12 { fill: #ff69b4 } +.terminal-3512500749-r13 { fill: #bfb5c8 } +.terminal-3512500749-r14 { fill: #7f7f84 } +.terminal-3512500749-r15 { fill: #210d17 } +.terminal-3512500749-r16 { fill: #68686f } +.terminal-3512500749-r17 { fill: #4f2442 } +.terminal-3512500749-r18 { fill: #b5b5b9;font-weight: bold } +.terminal-3512500749-r19 { fill: #dfdfe0;font-weight: bold } +.terminal-3512500749-r20 { fill: #54545c } +.terminal-3512500749-r21 { fill: #0b84ba } +.terminal-3512500749-r22 { fill: #1d1d28 } +.terminal-3512500749-r23 { fill: #1b9d4b } +.terminal-3512500749-r24 { fill: #1d1c34 } +.terminal-3512500749-r25 { fill: #6f6f75 } +.terminal-3512500749-r26 { fill: #6f6f75;font-weight: bold } +.terminal-3512500749-r27 { fill: #00934c } +.terminal-3512500749-r28 { fill: #bf3636 } +.terminal-3512500749-r29 { fill: #b4b4b8 } +.terminal-3512500749-r30 { fill: #74707d } +.terminal-3512500749-r31 { fill: #0c0c18 } +.terminal-3512500749-r32 { fill: #c47e08 } +.terminal-3512500749-r33 { fill: #242430;font-weight: bold } +.terminal-3512500749-r34 { fill: #242430 } +.terminal-3512500749-r35 { fill: #808084 } +.terminal-3512500749-r36 { fill: #141420 } +.terminal-3512500749-r37 { fill: #923e6c } +.terminal-3512500749-r38 { fill: #0a0b24 } +.terminal-3512500749-r39 { fill: #6c6c72 } +.terminal-3512500749-r40 { fill: #828287 } +.terminal-3512500749-r41 { fill: #5f5f66 } +.terminal-3512500749-r42 { fill: #181824 } +.terminal-3512500749-r43 { fill: #038f5d;font-weight: bold } +.terminal-3512500749-r44 { fill: #cc64a0;font-weight: bold } +.terminal-3512500749-r45 { fill: #afafb0 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                                                            - -GETEnter a URL... Send  -Search for commands… -╭─ Collection ───────────────────────────────────────── Request ─╮ - GET echo  theme: galaxy                                  - GET get random user            Set the theme to galaxy━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - POS echo post                    theme: posting                                ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/Set the theme to posting╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/  theme: monokai                                ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ - GET get all                Set the theme to monokaiers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ - GET get one                  theme: solarized-light                        ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ - POS create                 Set the theme to solarized-light╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ - DEL delete a post            theme: nautilus                               ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ comments/Set the theme to nautilus╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ - GET get comments           theme: nebula                                  Add header  - GET get comments (via parSet the theme to nebula────────────────────────────────╯ - PUT edit a comment         theme: alpine                                 ───────────────────── Response ─╮ -▼ todos/Set the theme to alpine - GET get all                  theme: cobalt                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - GET get one                Set the theme to cobalt -▼ users/  theme: twilight                                - GET get a user             Set the theme to twilight - GET get all users            theme: hacker                                  - POS create a user          Set the theme to hacker - PUT update a user            app: quit                                      -│────────────────────────────────Quit Posting -This is an echo server we can u -to see exactly what request is ││ -being sent.││1:1read-onlyJSONWrap X -╰─────────────── sample-collections ─╯╰────────────────────────────────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  + + + + +Posting                                                                                                            + +GETEnter a URL... Send  +Search for commands… +╭─ Collection ───────────────────────────────────────── Request ─╮ + GET echo  app: quit                                      Options +GET get random user            Quit Posting━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +POS echo post                    layout: horizontal                             ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/Change layout to horizontal╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/  view: expand request                           ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all                Expand the request sectioners.╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get one                  view: expand response                          ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +POS create                 Expand the response section╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +DEL delete a post            view: toggle collection browser                ╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ comments/Toggle the collection browser╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get comments          Add header  +GET get comments (via param)│╰────────────────────────────────────────────────────────────────────────────╯ +PUT edit a comment          │╭───────────────────────────────────────────────────────────────── Response ─╮ +▼ todos/││BodyHeadersCookiesScriptsTrace +GET get all                   ││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get one                   ││ +▼ users/││ +GET get a user                ││ +GET get all users             ││ +POS create a user             ││ +PUT update a user             ││ +│────────────────────────────────────││ +This is an echo server we can use ││ +to see exactly what request is ││ +being sent.││1:1read-onlyJSONWrap X +╰─────────────── sample-collections ─╯╰────────────────────────────────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help  diff --git a/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[body].svg b/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[body].svg new file mode 100644 index 00000000..bdc9946e --- /dev/null +++ b/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[body].svg @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Posting + + + + + + + + + + +Posting                                                                    + +POSThttps://postman-echo.com/post                       Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOp +GET get random user━━━━━━━━━━╸━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +█ POS echo postRaw (json, text, etc.) +▼ jsonplaceholder/1  { +▼ posts/2  "term_program""$TERM_PROGRAM 🥺",       +GET get all1:1JSONWrap X +GET get one╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +▼ comments/││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get comment││ +GET get comment││ +│───────────────────────││ +Echo server for post ││ +requests.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + diff --git a/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[headers].svg b/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[headers].svg new file mode 100644 index 00000000..11ed448e --- /dev/null +++ b/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[headers].svg @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Posting + + + + + + + + + + +Posting                                                                    + +POSThttps://postman-echo.com/post                       Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOp +GET get random user━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +█ POS echo post│▐ Content-Type     application/json  +▼ jsonplaceholder/│▐ Accept           *                 +▼ posts/│▐ Cache-Control    no-cache          +GET get allNameValue Add header  +GET get one╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +▼ comments/││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get comment││ +GET get comment││ +│───────────────────────││ +Echo server for post ││ +requests.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ⌫ Remove header  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  + + + + diff --git a/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[info].svg b/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[info].svg new file mode 100644 index 00000000..af21b2f4 --- /dev/null +++ b/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[info].svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Posting + + + + + + + + + + +Posting                                                                    + +POSThttps://postman-echo.com/post                       Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoadersBodyQueryAuthInfoScriptsOptio +GET get random user━━━━━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━╺━━━━━━━━━━━━━━━ +█ POS echo postName optional +▼ jsonplaceholder/echo post +▼ posts/ +GET get allDescription optional +GET get one╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +▼ comments/││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get comment││ +GET get comment││ +│───────────────────────││ +Echo server for post ││ +requests.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + diff --git a/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[method].svg b/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[method].svg new file mode 100644 index 00000000..a4fed928 --- /dev/null +++ b/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[method].svg @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Posting + + + + + + + + + + +Posting                                                                    + +POSThttps://postman-echo.com/post                       Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echo││HeadersBodyQueryAuthInfoScriptsOp +GET get random user││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +█ POS echo post││ Content-Type     application/json  +▼ jsonplaceholder/││ Accept           *                 +▼ posts/││ Cache-Control    no-cache          +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +▼ comments/││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get comment││ +GET get comment││ +│───────────────────────││ +Echo server for post ││ +requests.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + diff --git a/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[query].svg b/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[query].svg new file mode 100644 index 00000000..2d10bc63 --- /dev/null +++ b/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[query].svg @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Posting + + + + + + + + + + +Posting                                                                    + +POSThttps://postman-echo.com/post                       Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echoHeadersBodyQueryAuthInfoScriptsOp +GET get random user━━━━━━━━━━━━━━━━━╸━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━ +█ POS echo post key1         value1         +▼ jsonplaceholder/ another-key  another-value  +▼ posts/ number       123            +GET get allKeyValue Add   +GET get one╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +▼ comments/││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get comment││ +GET get comment││ +│───────────────────────││ +Echo server for post ││ +requests.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + diff --git a/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[url].svg b/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[url].svg new file mode 100644 index 00000000..061c2ff3 --- /dev/null +++ b/tests/__snapshots__/test_snapshots/TestFocusAutoSwitchingConfig.test_focus_on_request_open__open_body[url].svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Posting + + + + + + + + + + +Posting                                                                    + +POSThttps://postman-echo.com/post Send  + +╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ +GET echo││HeadersBodyQueryAuthInfoScriptsOp +GET get random user││━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +█ POS echo post││ Content-Type     application/json  +▼ jsonplaceholder/││ Accept           *                 +▼ posts/││ Cache-Control    no-cache          +GET get all││NameValue Add header  +GET get one│╰─────────────────────────────────────────────────╯ +POS create│╭────────────────────────────────────── Response ─╮ +DEL delete a post││BodyHeadersCookiesScriptsTrace +▼ comments/││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +GET get comment││ +GET get comment││ +│───────────────────────││ +Echo server for post ││ +requests.││1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + diff --git a/tests/test_snapshots.py b/tests/test_snapshots.py index d7d6cd8e..2fc74836 100644 --- a/tests/test_snapshots.py +++ b/tests/test_snapshots.py @@ -1,5 +1,6 @@ import os from pathlib import Path +from typing import Literal from unittest import mock import pytest @@ -119,7 +120,7 @@ async def run_before(pilot: Pilot): assert snap_compare(POSTING_MAIN, run_before=run_before) -@pytest.mark.skip(reason="cursor blink is not working in textual 0.76") +# @pytest.mark.skip(reason="cursor blink is not working in textual 0.76") @use_config("general.yaml") class TestCommandPalette: def test_loads_and_shows_discovery_options(self, snap_compare): @@ -149,8 +150,8 @@ def test_can_run_command__hide_collection_browser(self, snap_compare): async def run_before(pilot: Pilot): await pilot.press("ctrl+p") await disable_blink_for_active_cursors(pilot) - await pilot.press(*"toggle collection") - await pilot.press("enter", "enter") + await pilot.press(*"tog coll") + await pilot.press("down", "enter") assert snap_compare(POSTING_MAIN, run_before=run_before) @@ -520,3 +521,26 @@ async def run_before(pilot: Pilot): await pilot.press("shift+down") assert snap_compare(app, run_before=run_before, terminal_size=(100, 32)) + + +@use_config("general.yaml") +@patch_env("POSTING_FOCUS__ON_STARTUP", "collection") +class TestFocusAutoSwitchingConfig: + @pytest.mark.parametrize( + "focus_target", + ["headers", "body", "query", "info", "url", "method"], + ) + def test_focus_on_request_open__open_body( + self, + focus_target, + monkeypatch, + snap_compare, + ): + """Check that the expected tab is focused when a request is opened from the collection browser.""" + + monkeypatch.setenv("POSTING_FOCUS__ON_REQUEST_OPEN", focus_target) + + async def run_before(pilot: Pilot): + await pilot.press("j", "j", "enter") + + assert snap_compare(POSTING_MAIN, run_before=run_before) From 3c9a9852273f857ffb145a7fdf51b0c112c67d22 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sat, 12 Oct 2024 23:10:42 +0100 Subject: [PATCH 52/70] Allow overriding the hostname --- docs/guide/configuration.md | 1 + src/posting/config.py | 7 +++++++ src/posting/user_host.py | 6 ++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md index da19145b..cf747cbe 100644 --- a/docs/guide/configuration.md +++ b/docs/guide/configuration.md @@ -117,6 +117,7 @@ The table below lists all available configuration options and their environment | `heading.visible` (`POSTING_HEADING__VISIBLE`) | `true`, `false` (Default: `true`) | Show/hide the app header. | | `heading.show_host` (`POSTING_HEADING__SHOW_HOST`) | `true`, `false` (Default: `true`) | Show/hide the hostname in the app header. | | `heading.show_version` (`POSTING_HEADING__SHOW_VERSION`) | `true`, `false` (Default: `true`) | Show/hide the version in the app header. | +| `heading.hostname` (`POSTING_HEADING__HOSTNAME`) | (Default: `unset`) | The hostname to display in the app header. You may use Rich markup here. If unset, the hostname provided via `socket.gethostname()` will be used. | | `url_bar.show_value_preview` (`POSTING_URL_BAR__SHOW_VALUE_PREVIEW`) | `true`, `false` (Default: `true`) | Show/hide the variable value preview below the URL bar. | | `collection_browser.position` (`POSTING_COLLECTION_BROWSER__POSITION`) | `"left"`, `"right"` (Default: `"left"`) | The position of the collection browser on screen. | | `collection_browser.show_on_startup` (`POSTING_COLLECTION_BROWSER__SHOW_ON_STARTUP`) | `true`, `false` (Default: `true`) | Show/hide the collection browser on startup. Can always be toggled using the command palette. | diff --git a/src/posting/config.py b/src/posting/config.py index f61fca33..211a10ec 100644 --- a/src/posting/config.py +++ b/src/posting/config.py @@ -23,6 +23,13 @@ class HeadingSettings(BaseModel): """Whether or not to show the hostname in the app header.""" show_version: bool = Field(default=True) """Whether or not to show the version in the app header.""" + hostname: str | None = Field(default=None) + """The hostname to display in the app header. + + You may use Rich markup here. + + If unset, the hostname provided via `socket.gethostname()` will be used. + """ class UrlBarSettings(BaseModel): diff --git a/src/posting/user_host.py b/src/posting/user_host.py index 4981b283..2cc09d08 100644 --- a/src/posting/user_host.py +++ b/src/posting/user_host.py @@ -3,11 +3,13 @@ from rich.text import Text +from posting.config import SETTINGS + def get_user_host_string() -> Text: try: username = getpass.getuser() - hostname = socket.gethostname() - return Text(f"{username}@{hostname}") + hostname = SETTINGS.get().heading.hostname or socket.gethostname() + return Text.from_markup(f"{username}@{hostname}") except Exception: return Text("unknown@unknown") From 9398bcfd3d14c30e104dbf150ba96d09affd82d3 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Sun, 13 Oct 2024 00:03:19 +0100 Subject: [PATCH 53/70] Add test for scripting --- .coverage | Bin 53248 -> 53248 bytes Makefile | 6 - docs/assets/scripts-tab.png | Bin 0 -> 241414 bytes docs/guide/index.md | 26 +- docs/guide/keymap.md | 2 +- docs/guide/scripting.md | 3 + .../TestScripts.test_script_runs.svg | 224 ++++++++++++++++++ tests/sample-collections/scripts/my_script.py | 2 + tests/test_snapshots.py | 17 ++ 9 files changed, 264 insertions(+), 16 deletions(-) create mode 100644 docs/assets/scripts-tab.png create mode 100644 tests/__snapshots__/test_snapshots/TestScripts.test_script_runs.svg diff --git a/.coverage b/.coverage index b3c13d425ab32ee9b32a446febde601f9f722725..a1e18e5a2c0bbeaca3accbd9258f57f5752b9bc1 100644 GIT binary patch delta 660 zcmZozz}&Eac>_~Jy#|9N=R*cA1)kG92Y8n82yi~+VdH+teS>=+_YCfC?ndqe?r?4! zZcT1UuAls8xZd;Ua2@B`#4paZjB7Gi3s*Hi1K)AJ%?outHUeLE5h@d0RlEl2<+itX%uSBnmnab#Y#rD z;r!D?28OusZT3?RKdk@%l>gN?elCWFcYP0c{@os4s=H$Qx^*C}EAI8a{nhvWRoLk- z^~SZc?@#{JX~M@P&cMoO)0)k~$XUhqZ}P!@k@|O0=W^%eZqAjyeQod0zX}X5?4vK_ zZ+vd~{QUa@kU0_wJMRCto07vQ@PM^lkcE?zkCEpA0~;eJN4q`H7$N;<>MZ>2HbAC= z&OJ#62CX~mckgEAX}1Q7NNNAG+;96km6^TW6v!1&J;%u1ZUkgWDE)iNSjT#gt)1Nv z$mLVqG}*b=eDe8TTP^l>RghBAFgw|HWgyE&_}AJQcg-{oFmV(z{NUhVXlS|P9dkH_ z$z$@VzAkBgiyLXu{2S`cX6OF9nP#>v_jZ(YL+T~3 zi|D?G589F+G@OWLV=!T3Zx;ty#GYq2c|xZK5h1$+7_vuLpdq^sC1mrsfg#1s$mwT! zkELPq=`Isqu6B2z>0;*R-fw@+Jej-Oh`Idr)yWRsNt4%hyGx0;TLEPawEq3|Kf}TB tLq4(m{=f3~@7_I1pRC^#GkI!{`sB+!1(U0KLnrg}B}^{sGg&mj0RRCz_x}I@ delta 638 zcmZozz}&Eac>_~JeFlRi=L80>1TJqb2QD?v3H%57xARZp@8r+t_vE+XH{uuM=iqzG zcZ=^7-zvT`z8pRt-Y2~0d8>Hyc%ylJc%6B5cs}!7<~hZ)hi4VfRGx003Z66`Hy(W+ zQ64t#FWgtS*K#l7F5yn(cI4LPR^%4t=H~j(^@Zy+0|acA5V*-9+bGl&&Dto`ECM82 z*g%9mkZ8>U5^XV)9Xll_3-oAMLA5Z%g>Pe=aQI>Ue^rJTW(*t*4e$CM?)q-0OY&Yu)=-VW+>;8`sWeo;<(PWb(2eD<0N%K^9IOE%o0Tng*#13Rle%)ij!`bf6!pI5HGg+tC zh&lZA(aDLuN!%Rm_CN_C{b%YdlMna0Pqyrmm1Fp=$}HY)1r#^X`uErW3Kb|WBHLh0XA#yZw}Z0&|X9-rc-$;f+hO%!C?m4RFv;a_WK+%;2RVB#obVBi4x zk--6onH(ldc6Uh^Z#Zivm+(Kw?Dn6{XLE9HZ`*3daC_U|A~Yl3ybK!hY#A4A2ghZW@9j6V{aD+*~Xs7H2Gnth_)WXx!ifVn{%aaU)#&@M}gsm iee{L=jn6HgpMPHfw2na{VaNUdc2jZ~1s*J#-~a$oy3m3E diff --git a/Makefile b/Makefile index 588e7cb5..e4761eac 100644 --- a/Makefile +++ b/Makefile @@ -8,9 +8,3 @@ test: test-snapshot-update: $(run) pytest --cov=posting tests/ -n 16 -m "not serial" --snapshot-update $(ARGS) $(run) pytest --cov-report term-missing --cov-append --cov=posting tests/ -m serial --snapshot-update $(ARGS) - -.PHONY: deploy -deploy: - rye sync - rye build --clean - rye publish -y diff --git a/docs/assets/scripts-tab.png b/docs/assets/scripts-tab.png new file mode 100644 index 0000000000000000000000000000000000000000..2375cdd3f12d229bf76583b54d09c452ac195eb8 GIT binary patch literal 241414 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Ⓢ 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 literal 0 HcmV?d00001 diff --git a/docs/guide/index.md b/docs/guide/index.md index 61b1336f..4829417f 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -1,20 +1,28 @@ -## Installation - Posting can be installed in a matter of seconds on MacOS, Linux, and Windows. -### Rye (recommended) +## Installation + +The recommended method is to use [uv](https://docs.astral.sh/uv/getting-started/installation/), which is a single Rust binary that you can use to install Python apps. +It's significantly faster than alternative tools, and will get you up and running with Posting in seconds. -Rye is recommended, as it is faster than Homebrew and `pipx` by several orders of magnitude: +You don't even need to worry about installing Python yourself - `uv` will manage everything for you. ```bash -# Install Rye (on MacOS/Linux only - Windows users see below) -curl -sSf https://rye.astral.sh/get | bash +# quick install on MacOS/Linux +curl -LsSf https://astral.sh/uv/install.sh | sh -# install Posting -rye install posting +# install Posting (will also quickly install Python 3.12 if needed) +uv tool install --python 3.12 posting ``` -Windows users should follow the guide [Rye](https://rye-up.com/guide/installation) to learn how to install Rye. +`uv` can also be installed via Homebrew, Cargo, Winget, pipx, and more. See the [installation guide](https://docs.astral.sh/uv/getting-started/installation/) for more information. + +`uv` also makes it easy to install additional Python packages into your Posting environment, which you can then use in your pre-request/post-response scripts. + +### Prefer `pipx`? + +If you'd prefer to use `pipx`, that works too: `pipx install posting`. + ### pipx diff --git a/docs/guide/keymap.md b/docs/guide/keymap.md index cde0cc75..b2a06c96 100644 --- a/docs/guide/keymap.md +++ b/docs/guide/keymap.md @@ -73,6 +73,6 @@ These are the IDs of the actions that you can change the keybinding for: - `toggle-collection` - Toggle the collection browser. Default: `ctrl+h`. - `new-request` - Create a new request. Default: `ctrl+n`. - `commands` - Open the command palette. Default: `ctrl+p`. -- `help` - Open the help dialog for the currently focused widget. Default: `f1,?`. +- `help` - Open the help dialog for the currently focused widget. Default: `f1,ctrl+question_mark`. - `quit` - Quit the application. Default: `ctrl+c`. - `jump` - Enter jump mode. Default: `ctrl+o`. diff --git a/docs/guide/scripting.md b/docs/guide/scripting.md index 13477396..169843c4 100644 --- a/docs/guide/scripting.md +++ b/docs/guide/scripting.md @@ -9,6 +9,8 @@ You can attach simple Python scripts to requests inside the `Scripts` tab, and h - Inspect request and response objects, and manipulate them - Pretty much anything else you can think of doing with Python! +Scripts tab + ## Script types Posting supports three types of scripts, which run at different points in the request/response lifecycle: @@ -49,6 +51,7 @@ Press ++ctrl+e++ while a script input field inside the `Scripts` tab is focused ## Script logs If your script writes to `stdout` or `stderr`, you'll see the output in the `Scripts` tab in the Response section. +This output is not persisted on disk. ### Example: Setup script diff --git a/tests/__snapshots__/test_snapshots/TestScripts.test_script_runs.svg b/tests/__snapshots__/test_snapshots/TestScripts.test_script_runs.svg new file mode 100644 index 00000000..26242941 --- /dev/null +++ b/tests/__snapshots__/test_snapshots/TestScripts.test_script_runs.svg @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Posting + + + + + + + + + + +Posting                                                                    + +GEThttps://postman-echo.com/get              ■■■■■■■ Send  + +╭─ Collection ──────────╮╭───────────────────────────── Response  200 OK ─╮ +█ GET echoBodyHeadersCookiesScriptsTrace +GET get random user━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━╺━━━━━━━━━━━━━━━━ +POS echo postSetup          Pre-request    Post-response   +▼ jsonplaceholder/SuccessSuccessSuccess +▼ posts/ +GET get allScript output                                 +GET get oneRunning my_script.py:setup +POS createout Hello from my_script.py:setup!         +DEL delete a posterr error from setup!                      +▼ comments/Running my_script.py:on_request +GET get commentout Set header to 'Foo-Bar-Baz!!!!!'!      +GET get commenterr Hello from my_script.py:on_request - i +PUT edit a commRunning my_script.py:on_response +▼ todos/out200 +GET get allout foo                                    +GET get oneout Hello from my_script.py!               +▼ users/err Hello from my_script.py:on_response -  +GET get a user +GET get all users +│───────────────────────│ +This is an echo  +server we can use to  +see exactly what  +request is being  +sent. +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py index 82aaa557..7b52f29e 100644 --- a/tests/sample-collections/scripts/my_script.py +++ b/tests/sample-collections/scripts/my_script.py @@ -5,6 +5,8 @@ def setup(posting: Posting) -> None: + print("Hello from my_script.py:setup!") + sys.stderr.write("error from setup!\n") posting.set_variable("setup_var", "ADDED IN SETUP") diff --git a/tests/test_snapshots.py b/tests/test_snapshots.py index 2fc74836..499e09be 100644 --- a/tests/test_snapshots.py +++ b/tests/test_snapshots.py @@ -542,5 +542,22 @@ def test_focus_on_request_open__open_body( async def run_before(pilot: Pilot): await pilot.press("j", "j", "enter") + await pilot.pause() # wait for focus to switch assert snap_compare(POSTING_MAIN, run_before=run_before) + + +@use_config("general.yaml") +@patch_env("POSTING_FOCUS__ON_STARTUP", "collection") +class TestScripts: + def test_script_runs(self, snap_compare): + """Check that a script runs correctly.""" + + async def run_before(pilot: Pilot): + await pilot.press("enter") + await pilot.press("ctrl+j") + await pilot.app.workers.wait_for_complete() + await pilot.press("ctrl+o", "f") # jump to "Scripts" + await pilot.press("ctrl+m") # expand response section + + assert snap_compare(POSTING_MAIN, run_before=run_before, terminal_size=(80, 34)) From 100adc4a642afc46030a46538fe26168f4d9ab44 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Tue, 15 Oct 2024 19:35:10 +0100 Subject: [PATCH 54/70] Waiting for animations in snapshot test --- .coverage | Bin 53248 -> 53248 bytes tests/test_snapshots.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.coverage b/.coverage index a1e18e5a2c0bbeaca3accbd9258f57f5752b9bc1..89f954b556b7516d715cfc4f7a5e8e7f4485c71e 100644 GIT binary patch delta 243 zcmZozz}&Eac>`lZJ+BCZCFf-ZE+L-(JYRTj@wjka=CR@t<>BG}#C?W)KlfJdDcs%M z1>CXRzTCR}XSkL5bGUwUJ>wVWy2W*zYX{eQt{Hsy`1W!2b2W11b476l@U7;X$ydpj z#OJ}~$feJx!NU|Iz^fghxuQ delta 264 zcmZozz}&Eac>`lZJ(mW9CFes1E(M;`JO_A|@d$7}rR|{7)KLg)!zU5p+Tq%50`5L&Q_;UH8`KCVRUfPsyXbFxa8+2qD9@y+YIGMG5H89Dtd z@3AyYHtr4QVsCc=Di<*M#J;(!*MxC$RG0eXeSMMQBJFxWaV@!jwQ>*Q>+E}&nHqk^ MCh%_-?|z>% diff --git a/tests/test_snapshots.py b/tests/test_snapshots.py index 499e09be..67d0c62f 100644 --- a/tests/test_snapshots.py +++ b/tests/test_snapshots.py @@ -1,6 +1,5 @@ import os from pathlib import Path -from typing import Literal from unittest import mock import pytest @@ -543,6 +542,7 @@ def test_focus_on_request_open__open_body( async def run_before(pilot: Pilot): await pilot.press("j", "j", "enter") await pilot.pause() # wait for focus to switch + await pilot.wait_for_scheduled_animations() assert snap_compare(POSTING_MAIN, run_before=run_before) From 6174f6c348ca373ceed2cae5a4879991c5ce14e4 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Tue, 15 Oct 2024 19:39:57 +0100 Subject: [PATCH 55/70] Add test-ci to Makefile which avoids xdist --- .github/workflows/test.yml | 2 +- Makefile | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 69450cd0..196110f7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -28,7 +28,7 @@ jobs: run: uv sync --all-extras --dev - name: Run Tests run: | - uv run make test + uv run make test-ci - name: Attach Code Coverage uses: py-cov-action/python-coverage-comment-action@v3.25 with: diff --git a/Makefile b/Makefile index e4761eac..0450f176 100644 --- a/Makefile +++ b/Makefile @@ -8,3 +8,8 @@ test: test-snapshot-update: $(run) pytest --cov=posting tests/ -n 16 -m "not serial" --snapshot-update $(ARGS) $(run) pytest --cov-report term-missing --cov-append --cov=posting tests/ -m serial --snapshot-update $(ARGS) + + +.PHONY: test-ci +test-ci: + $(run) pytest --cov=posting --cov-report term-missing tests/ $(ARGS) From 09d53629d475e1dc20037017b9d4ed6938e0a4f4 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Tue, 15 Oct 2024 19:51:59 +0100 Subject: [PATCH 56/70] Updating snapshots --- .coverage | Bin 53248 -> 53248 bytes Makefile | 2 +- ..._set_on_startup_and_in_command_palette.svg | 187 ----------------- ..._set_on_startup_and_in_command_palette.svg | 187 ++++++++--------- .../TestUrlBar.test_enter_url.svg | 190 ------------------ tests/test_snapshots.py | 23 +-- 6 files changed, 106 insertions(+), 483 deletions(-) delete mode 100644 tests/__snapshots__/test_snapshots/TestCustomTheme.test_theme_set_on_startup_and_in_command_palette.svg delete mode 100644 tests/__snapshots__/test_snapshots/TestUrlBar.test_enter_url.svg diff --git a/.coverage b/.coverage index 89f954b556b7516d715cfc4f7a5e8e7f4485c71e..7a02a9a5fe49f88efd24e1d1abe83c03ea9a3ecc 100644 GIT binary patch delta 425 zcmZozz}&Eac>`lZJp%)SCFdsw&cEDdoS(R5xZ1efxor7wbD8iTHDr9z7mq?yuaBxDRo!;ati@jYOq>Me!Zt~?$dzMC_cG1bUoi3AmdNL;e?-8AB+#3#5;{sA+ z@`-(NS8q8tN4q_cE2RHSonx&c@Y1aeFYsvkqm3t6h zXWzrj)bKMlfq(LjF1^X({h^beb=gkN>7O!Lw>xg~ly1ez`@4N7i}t84n&1Ecv;KM& delta 414 zcmZozz}&Eac>`lZJ+BCZCFf-ZE+L-(JYRTj@wjka=CR@t<>BG}#C?W)KlfJdDcs%M z1>CXRzTCR}XSkL5bGUwUJ>wVWy2W*zYX{eQt{Hsy`1W!2b2W11b476l@U7;X$ydpj z#OJ}~$feJx!N@-ecvyRa~F3YdIi=V-SF zvV`=Xsk2Nj?NOY}(`&EE)@}$C<5S!u(yj+&XvzJnm3t6hXWzrj)bKMlfuF5i7bGvs zIC*!k-ekKzTQ2r?RiKD~Xqeq({{A>lwsv`t0)EEHx&4YjNm-C2ub1fLzJ6bzq$Eg^ zlWX$repR5PI7pH`&u(&C*9H}ic3~h_h*@nelTf=5kg3LW%EXwFf#Lfpb;djVoIo$j pPxkMYp6uNnK6y=d`DDEw_sP?G$|igFMoxa&8#=kVZ_1(x4ghL)bcp}} diff --git a/Makefile b/Makefile index 0450f176..ece1593a 100644 --- a/Makefile +++ b/Makefile @@ -12,4 +12,4 @@ test-snapshot-update: .PHONY: test-ci test-ci: - $(run) pytest --cov=posting --cov-report term-missing tests/ $(ARGS) + $(run) pytest --cov=posting tests/ --cov-report term-missing $(ARGS) diff --git a/tests/__snapshots__/test_snapshots/TestCustomTheme.test_theme_set_on_startup_and_in_command_palette.svg b/tests/__snapshots__/test_snapshots/TestCustomTheme.test_theme_set_on_startup_and_in_command_palette.svg deleted file mode 100644 index 5f817c27..00000000 --- a/tests/__snapshots__/test_snapshots/TestCustomTheme.test_theme_set_on_startup_and_in_command_palette.svg +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Posting - - - - - - - - - - -Posting                                                                    - -GET Send  -anothertest -╭─ Collection── Request ─╮ - GET echo  theme: anothertesttions - GET get ranSet the theme to anothertest━━━━━━━━━━━━ - POS echo po╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ - GET get all      ││NameValue Add header  - GET get one      │╰─────────────────────────────────────────────────╯ - POS create       │╭────────────────────────────────────── Response ─╮ - DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  f1 Help  - - - - diff --git a/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_set_on_startup_and_in_command_palette.svg b/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_set_on_startup_and_in_command_palette.svg index 972dae2e..0f51e533 100644 --- a/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_set_on_startup_and_in_command_palette.svg +++ b/tests/__snapshots__/test_snapshots/TestCustomThemeSimple.test_theme_set_on_startup_and_in_command_palette.svg @@ -19,168 +19,171 @@ font-weight: 700; } - .terminal-3572088326-matrix { + .terminal-3638516739-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3572088326-title { + .terminal-3638516739-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3572088326-r1 { fill: #171819 } -.terminal-3572088326-r2 { fill: #c5c8c6 } -.terminal-3572088326-r3 { fill: #17191a } -.terminal-3572088326-r4 { fill: #cc4940 } -.terminal-3572088326-r5 { fill: #b0c2c4;text-decoration: underline; } -.terminal-3572088326-r6 { fill: #b0c2c4 } -.terminal-3572088326-r7 { fill: #7aafb5 } -.terminal-3572088326-r8 { fill: #d22f2f } -.terminal-3572088326-r9 { fill: #1a1a1a } -.terminal-3572088326-r10 { fill: #b4bfc8 } -.terminal-3572088326-r11 { fill: #484c50 } -.terminal-3572088326-r12 { fill: #a82525 } -.terminal-3572088326-r13 { fill: #171819;font-weight: bold } -.terminal-3572088326-r14 { fill: #b08a90 } -.terminal-3572088326-r15 { fill: #ba7b7b;font-weight: bold } -.terminal-3572088326-r16 { fill: #c7b5b5;font-weight: bold } -.terminal-3572088326-r17 { fill: #17191a;font-weight: bold } -.terminal-3572088326-r18 { fill: #1e88e5;font-weight: bold } -.terminal-3572088326-r19 { fill: #70787c } -.terminal-3572088326-r20 { fill: #565b5f } -.terminal-3572088326-r21 { fill: #a5afb5 } -.terminal-3572088326-r22 { fill: #c4c8cb } -.terminal-3572088326-r23 { fill: #565b5f;font-weight: bold } -.terminal-3572088326-r24 { fill: #bababa } -.terminal-3572088326-r25 { fill: #00500a } -.terminal-3572088326-r26 { fill: #7e7e7e } -.terminal-3572088326-r27 { fill: #b8c2c9 } -.terminal-3572088326-r28 { fill: #9ca7ae;font-weight: bold } -.terminal-3572088326-r29 { fill: #9ca7ae } -.terminal-3572088326-r30 { fill: #464b4e } -.terminal-3572088326-r31 { fill: #adb8c0 } -.terminal-3572088326-r32 { fill: #ac5456 } -.terminal-3572088326-r33 { fill: #5a6064 } -.terminal-3572088326-r34 { fill: #44484c } -.terminal-3572088326-r35 { fill: #656c71 } -.terminal-3572088326-r36 { fill: #a9b3bb } -.terminal-3572088326-r37 { fill: #5c9364;font-weight: bold } -.terminal-3572088326-r38 { fill: #bc3833;font-weight: bold } -.terminal-3572088326-r39 { fill: #1b1c1d } + .terminal-3638516739-r1 { fill: #171819 } +.terminal-3638516739-r2 { fill: #c5c8c6 } +.terminal-3638516739-r3 { fill: #17191a } +.terminal-3638516739-r4 { fill: #cc4940 } +.terminal-3638516739-r5 { fill: #b0c2c4;text-decoration: underline; } +.terminal-3638516739-r6 { fill: #b0c2c4 } +.terminal-3638516739-r7 { fill: #7aafb5 } +.terminal-3638516739-r8 { fill: #d22f2f } +.terminal-3638516739-r9 { fill: #1a1a1a } +.terminal-3638516739-r10 { fill: #b4bfc8 } +.terminal-3638516739-r11 { fill: #484c50 } +.terminal-3638516739-r12 { fill: #f9e3e3 } +.terminal-3638516739-r13 { fill: #a82525 } +.terminal-3638516739-r14 { fill: #171819;font-weight: bold } +.terminal-3638516739-r15 { fill: #b08a90 } +.terminal-3638516739-r16 { fill: #c7b5b5;font-weight: bold } +.terminal-3638516739-r17 { fill: #17191a;font-weight: bold } +.terminal-3638516739-r18 { fill: #1e88e5;font-weight: bold } +.terminal-3638516739-r19 { fill: #70787c } +.terminal-3638516739-r20 { fill: #0b84ba } +.terminal-3638516739-r21 { fill: #a5afb5 } +.terminal-3638516739-r22 { fill: #1b9d4b } +.terminal-3638516739-r23 { fill: #c4c8cb } +.terminal-3638516739-r24 { fill: #565b5f } +.terminal-3638516739-r25 { fill: #565b5f;font-weight: bold } +.terminal-3638516739-r26 { fill: #bababa } +.terminal-3638516739-r27 { fill: #00500a } +.terminal-3638516739-r28 { fill: #7e7e7e } +.terminal-3638516739-r29 { fill: #b8c2c9 } +.terminal-3638516739-r30 { fill: #bf3636 } +.terminal-3638516739-r31 { fill: #9ca7ae;font-weight: bold } +.terminal-3638516739-r32 { fill: #9ca7ae } +.terminal-3638516739-r33 { fill: #464b4e } +.terminal-3638516739-r34 { fill: #adb8c0 } +.terminal-3638516739-r35 { fill: #ac5456 } +.terminal-3638516739-r36 { fill: #5a6064 } +.terminal-3638516739-r37 { fill: #44484c } +.terminal-3638516739-r38 { fill: #656c71 } +.terminal-3638516739-r39 { fill: #a9b3bb } +.terminal-3638516739-r40 { fill: #5c9364;font-weight: bold } +.terminal-3638516739-r41 { fill: #bc3833;font-weight: bold } +.terminal-3638516739-r42 { fill: #1b1c1d } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GET Send  -anothertest                                   -╭─ Collection── Request ─╮ - GET echo  theme: anothertesttions - GET get ranSet the theme to anothertest━━━━━━━━━━━━ - POS echo po╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ - GET get all      NameValue Add header  - GET get one      ╰─────────────────────────────────────────────────╯ - POS create       ╭────────────────────────────────────── Response ─╮ - DEL delete a postBodyHeadersCookiesTrace -───────────────────────━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo  -server we can use to  -see exactly what  -request is being  -sent.1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - d Dupe  D Quick Dupe  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o  + + + + +Posting                                                                    + +GET Send  +anothertest +╭─ Collection── Request ─╮ + GET echo  theme: anothertestriptsOptio +GET get ranSet the theme to anothertest━━━━━━━━━━━━ +POS echo po╱╱╱╱╱╱╱╱╱╱╱╱ +▼ jsonplaceholder/╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +▼ posts/╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ +GET get all      NameValue Add header  +GET get one      ╰─────────────────────────────────────────────────╯ +POS create       ╭────────────────────────────────────── Response ─╮ +DEL delete a postBodyHeadersCookiesScriptsTrace +───────────────────────━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +This is an echo  +server we can use to  +see exactly what  +request is being  +sent.1:1read-onlyJSONWrap X +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + d Dupe  ⌫ Delete  ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump diff --git a/tests/__snapshots__/test_snapshots/TestUrlBar.test_enter_url.svg b/tests/__snapshots__/test_snapshots/TestUrlBar.test_enter_url.svg deleted file mode 100644 index 5c0961c9..00000000 --- a/tests/__snapshots__/test_snapshots/TestUrlBar.test_enter_url.svg +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Posting - - - - - - - - - - -Posting                                                                    - -GEThttps://example.com/ Send  - -╭─ Collection ──────────╮╭─────────────────────────────────────── Request ─╮ - GET echo││HeadersBodyQueryAuthInfoOptions - GET get random user││━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - POS echo post││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ jsonplaceholder/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱There are no headers.╱╱╱╱╱╱╱╱╱╱╱╱╱╱ -▼ posts/││╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱ - GET get all││NameValue Add header  - GET get one│╰─────────────────────────────────────────────────╯ - POS create│╭────────────────────────────────────── Response ─╮ - DEL delete a post││BodyHeadersCookiesTrace -│───────────────────────││━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -This is an echo ││ -server we can use to ││ -see exactly what ││ -request is being ││ -sent.││1:1read-onlyJSONWrap X -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  f1 Help  - - - - diff --git a/tests/test_snapshots.py b/tests/test_snapshots.py index 67d0c62f..26544b71 100644 --- a/tests/test_snapshots.py +++ b/tests/test_snapshots.py @@ -119,7 +119,6 @@ async def run_before(pilot: Pilot): assert snap_compare(POSTING_MAIN, run_before=run_before) -# @pytest.mark.skip(reason="cursor blink is not working in textual 0.76") @use_config("general.yaml") class TestCommandPalette: def test_loads_and_shows_discovery_options(self, snap_compare): @@ -283,18 +282,18 @@ async def run_before(pilot: Pilot): assert snap_compare(POSTING_MAIN, run_before=run_before, terminal_size=(80, 44)) - @pytest.mark.skip( - reason="info tab contains a path, specific to the host the test runs on" - ) - def test_request_loaded_into_view__info(self, snap_compare): - """Check that the request info is loaded into the view.""" + # @pytest.mark.skip( + # reason="info tab contains a path, specific to the host the test runs on" + # ) + # def test_request_loaded_into_view__info(self, snap_compare): + # """Check that the request info is loaded into the view.""" - async def run_before(pilot: Pilot): - await pilot.press("j") - await pilot.press("enter") - await pilot.press("ctrl+o", "t") # jump to 'Info' tab + # async def run_before(pilot: Pilot): + # await pilot.press("j") + # await pilot.press("enter") + # await pilot.press("ctrl+o", "t") # jump to 'Info' tab - assert snap_compare(POSTING_MAIN, run_before=run_before, terminal_size=(80, 44)) + # assert snap_compare(POSTING_MAIN, run_before=run_before, terminal_size=(80, 44)) def test_request_loaded_into_view__options(self, snap_compare): """Check that the request options are loaded into the view.""" @@ -420,11 +419,9 @@ async def run_before(pilot: Pilot): @patch_env("POSTING_FOCUS__ON_STARTUP", "collection") @patch_env("POSTING_THEME_DIRECTORY", str(THEME_DIR.resolve())) class TestCustomThemeSimple: - @pytest.mark.skip(reason="cursor blink is not working in textual 0.76") def test_theme_set_on_startup_and_in_command_palette(self, snap_compare): """Check that the theme is set on startup and available in the command palette.""" - @pytest.mark.skip(reason="cursor blink is not working in textual 0.76") async def run_before(pilot: Pilot): await pilot.press("ctrl+p") await disable_blink_for_active_cursors(pilot) From 426f4c78b586334fd1cafceb0d0a4a25e68d6acb Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Tue, 15 Oct 2024 20:05:43 +0100 Subject: [PATCH 57/70] Optimise jump overlay --- src/posting/jump_overlay.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/posting/jump_overlay.py b/src/posting/jump_overlay.py index e82d2bf6..29eb07ff 100644 --- a/src/posting/jump_overlay.py +++ b/src/posting/jump_overlay.py @@ -39,9 +39,6 @@ def __init__( self.keys_to_widgets: dict[str, Widget | str] = {} self._resize_counter = 0 - def on_mount(self) -> None: - self._sync() - def on_key(self, key_event: events.Key) -> None: # We need to stop the bubbling of these keys, because if they # arrive at the parent after the overlay is closed, then the parent @@ -63,19 +60,20 @@ def action_dismiss_overlay(self) -> None: self.dismiss(None) async def on_resize(self) -> None: - self._sync() self._resize_counter += 1 if self._resize_counter == 1: return + print("recomposing") await self.recompose() def _sync(self) -> None: + print("syncing") self.overlays = self.jumper.get_overlays() self.keys_to_widgets = {v.key: v.widget for v in self.overlays.values()} def compose(self) -> ComposeResult: - overlays = self.jumper.get_overlays() - for offset, jump_info in overlays.items(): + self._sync() + for offset, jump_info in self.overlays.items(): key, _widget = jump_info label = Label(key, classes="textual-jump-label") label.styles.offset = offset From 5cdbbac48e9e5a1ceb7573f16056dd07f1eaa377 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 16 Oct 2024 20:39:01 +0100 Subject: [PATCH 58/70] Interface for getting content type from the request body area --- src/posting/__main__.py | 4 ++++ src/posting/collection.py | 6 ++++++ src/posting/jump_overlay.py | 3 +++ src/posting/widgets/request/request_editor.py | 15 +++++++++++++-- src/posting/widgets/text_area.py | 10 ++++++++++ 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/posting/__main__.py b/src/posting/__main__.py index df5dcaef..3c161718 100644 --- a/src/posting/__main__.py +++ b/src/posting/__main__.py @@ -137,3 +137,7 @@ def make_posting( load_variables(env_paths, settings.use_host_environment) return Posting(settings, env_paths, collection_tree, not using_default_collection) + + +if __name__ == "__main__": + cli() diff --git a/src/posting/collection.py b/src/posting/collection.py index 32fa5593..c313e9f6 100644 --- a/src/posting/collection.py +++ b/src/posting/collection.py @@ -96,7 +96,13 @@ class Options(BaseModel): class RequestBody(BaseModel): content: str | None = Field(default=None) + """The content of the request.""" + form_data: list[FormItem] | None = Field(default=None) + """The form data of the request.""" + + content_type: str | None = Field(default=None) + """We may set an additional header if the content type is known.""" def to_httpx_args(self) -> dict[str, Any]: httpx_args: dict[str, Any] = {} diff --git a/src/posting/jump_overlay.py b/src/posting/jump_overlay.py index 29eb07ff..2d6996ff 100644 --- a/src/posting/jump_overlay.py +++ b/src/posting/jump_overlay.py @@ -3,10 +3,13 @@ from textual.app import ComposeResult from textual.binding import Binding from textual.containers import Center +from textual.geometry import Offset from textual.screen import ModalScreen from textual.widget import Widget from textual.widgets import Label +from posting.jumper import JumpInfo + if TYPE_CHECKING: from posting.jumper import Jumper diff --git a/src/posting/widgets/request/request_editor.py b/src/posting/widgets/request/request_editor.py index 70c448fd..a1aadc61 100644 --- a/src/posting/widgets/request/request_editor.py +++ b/src/posting/widgets/request/request_editor.py @@ -137,7 +137,18 @@ def to_request_model_args(self) -> dict[str, Any]: return {"body": None} elif current == "text-body-editor": # We need to check the chosen content type in the TextEditor - return {"body": RequestBody(content=text_editor.text)} + # We can look at the language to determine the content type. + return { + "body": RequestBody( + content=text_editor.text, + content_type=text_editor.content_type, + ) + } elif current == "form-body-editor": - return {"body": RequestBody(form_data=self.form_editor.to_model())} + return { + "body": RequestBody( + form_data=self.form_editor.to_model(), + content_type="application/x-www-form-urlencoded", + ) + } return {} diff --git a/src/posting/widgets/text_area.py b/src/posting/widgets/text_area.py index ef5499d1..19c939b1 100644 --- a/src/posting/widgets/text_area.py +++ b/src/posting/widgets/text_area.py @@ -572,6 +572,16 @@ def update_soft_wrap(self, event: TextAreaFooter.SoftWrapChanged) -> None: def text(self) -> str: return self.text_area.text + @property + def content_type(self) -> str | None: + """Return the content type associated with the current language.""" + if self.language == "json": + return "application/json" + elif self.language == "html": + return "text/html" + else: + return None + VSCODE = TextAreaTheme.get_builtin_theme("vscode_dark") POSTING_THEME = TextAreaTheme( From 0639adf41155c23b163c4679565e302e5e124aec Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 16 Oct 2024 21:20:54 +0100 Subject: [PATCH 59/70] Automatically adding Content-Type header depending on request body type --- src/posting/app.py | 17 ++++++++++++++++- src/posting/collection.py | 11 ++++------- tests/sample-collections/scripts/my_script.py | 1 - 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/posting/app.py b/src/posting/app.py index 25efdd4b..5d9a6aa5 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -31,6 +31,7 @@ from posting.collection import ( Collection, Cookie, + Header, HttpRequestMethod, Options, RequestModel, @@ -657,7 +658,21 @@ def build_request_model(self, request_options: Options) -> RequestModel: # We ensure elsewhere that the we can only "open" requests, not collection nodes. assert not isinstance(open_request, Collection) + request_editor_args = self.request_editor.to_request_model_args() headers = self.headers_table.to_model() + if request_body := request_editor_args.get("body"): + header_names_lower = {header.name.lower(): header for header in headers} + # Don't add the content type header if the user has explicitly set it. + if ( + request_body.content_type is not None + and "content-type" not in header_names_lower + ): + headers.append( + Header( + name="content-type", + value=request_body.content_type, + ) + ) return RequestModel( name=self.request_metadata.request_name, path=open_request.path if open_request else None, @@ -674,7 +689,7 @@ def build_request_model(self, request_options: Options) -> RequestModel: else [] ), scripts=self.request_scripts.to_model(), - **self.request_editor.to_request_model_args(), + **request_editor_args, ) def load_request_model(self, request_model: RequestModel) -> None: diff --git a/src/posting/collection.py b/src/posting/collection.py index c313e9f6..c1672a94 100644 --- a/src/posting/collection.py +++ b/src/posting/collection.py @@ -232,17 +232,14 @@ def apply_template(self, variables: dict[str, Any]) -> None: def to_httpx(self, client: httpx.AsyncClient) -> httpx.Request: """Convert the request model to an httpx request.""" + headers = httpx.Headers( + [(header.name, header.value) for header in self.headers if header.enabled] + ) return client.build_request( method=self.method, url=self.url, **(self.body.to_httpx_args() if self.body else {}), - headers=httpx.Headers( - [ - (header.name, header.value) - for header in self.headers - if header.enabled - ] - ), + headers=headers, params=httpx.QueryParams( [(param.name, param.value) for param in self.params if param.enabled] ), diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py index 7b52f29e..a06faf7f 100644 --- a/tests/sample-collections/scripts/my_script.py +++ b/tests/sample-collections/scripts/my_script.py @@ -12,7 +12,6 @@ def setup(posting: Posting) -> None: def on_request(request: httpx.Request, posting: Posting) -> None: new_header = "Foo-Bar-Baz!!!!!" - request.headers["X-Custom-Header"] = new_header print(f"Set header to {new_header!r}!") posting.notify( message="Hello from my_script.py!", From 14a90dff15e83fd4f8006ad59bdd542d83a45e63 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 16 Oct 2024 22:31:32 +0100 Subject: [PATCH 60/70] Mutable api started --- src/posting/app.py | 32 +++++++++---------- src/posting/collection.py | 5 +-- src/posting/scripts.py | 6 ++-- src/posting/widgets/request/request_editor.py | 4 +-- src/posting/widgets/response/script_output.py | 8 +++++ tests/sample-collections/scripts/my_script.py | 11 +++++-- 6 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/posting/app.py b/src/posting/app.py index 25efdd4b..465be72a 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -361,21 +361,7 @@ async def send_request(self) -> None: timeout=request_model.options.timeout, auth=request_model.auth.to_httpx_auth() if request_model.auth else None, ) as client: - request = self.build_httpx_request(request_model, client) - request.headers["User-Agent"] = ( - f"Posting/{VERSION} (Terminal-based API client)" - ) - print("-- sending request --") - print(request) - print(request.headers) - print("follow redirects =", request_options.follow_redirects) - print("verify =", request_options.verify_ssl) - print("attach cookies =", request_options.attach_cookies) - print("proxy =", request_model.options.proxy_url) - print("timeout =", request_model.options.timeout) - print("auth =", request_model.auth) - - script_context.request = request + script_context.request = request_model # If there's an associated pre-request script, run it. if on_request := request_model.scripts.on_request: @@ -383,7 +369,7 @@ async def send_request(self) -> None: self.get_and_run_script( on_request, "on_request", - request, + request_model, script_context, ) except Exception: @@ -393,6 +379,20 @@ async def send_request(self) -> None: self.response_script_output.set_request_status("success") else: self.response_script_output.set_request_status("no-script") + request = self.build_httpx_request(request_model, client) + + request.headers["User-Agent"] = ( + f"Posting/{VERSION} (Terminal-based API client)" + ) + print("-- sending request --") + print(request) + print(request.headers) + print("follow redirects =", request_options.follow_redirects) + print("verify =", request_options.verify_ssl) + print("attach cookies =", request_options.attach_cookies) + print("proxy =", request_model.options.proxy_url) + print("timeout =", request_model.options.timeout) + print("auth =", request_model.auth) response = await client.send( request=request, diff --git a/src/posting/collection.py b/src/posting/collection.py index c313e9f6..3e8e2c48 100644 --- a/src/posting/collection.py +++ b/src/posting/collection.py @@ -101,7 +101,7 @@ class RequestBody(BaseModel): form_data: list[FormItem] | None = Field(default=None) """The form data of the request.""" - content_type: str | None = Field(default=None) + _content_type: str | None = Field(default=None) """We may set an additional header if the content type is known.""" def to_httpx_args(self) -> dict[str, Any]: @@ -154,9 +154,6 @@ class RequestModel(BaseModel): body: RequestBody | None = Field(default=None) """The body of the request.""" - content: str | bytes | None = Field(default=None) - """The content of the request.""" - auth: Auth | None = Field(default=None) """The authentication information for the request.""" diff --git a/src/posting/scripts.py b/src/posting/scripts.py index 76fee649..5d75bc29 100644 --- a/src/posting/scripts.py +++ b/src/posting/scripts.py @@ -1,15 +1,15 @@ from __future__ import annotations -import asyncio import sys from pathlib import Path from types import ModuleType from typing import TYPE_CHECKING, Callable, Any import threading -from httpx import Request, Response +from httpx import Response from textual.notifications import SeverityLevel +from posting.collection import RequestModel from posting.variables import get_variables, update_variables if TYPE_CHECKING: @@ -27,7 +27,7 @@ def __init__(self, app: PostingApp): self._app: PostingApp = app """The Textual App instance for Posting.""" - self.request: Request | None = None + self.request: RequestModel | None = None """The request that is currently being processed.""" self.response: Response | None = None diff --git a/src/posting/widgets/request/request_editor.py b/src/posting/widgets/request/request_editor.py index a1aadc61..3d56519f 100644 --- a/src/posting/widgets/request/request_editor.py +++ b/src/posting/widgets/request/request_editor.py @@ -141,14 +141,14 @@ def to_request_model_args(self) -> dict[str, Any]: return { "body": RequestBody( content=text_editor.text, - content_type=text_editor.content_type, + _content_type=text_editor.content_type, ) } elif current == "form-body-editor": return { "body": RequestBody( form_data=self.form_editor.to_model(), - content_type="application/x-www-form-urlencoded", + _content_type="application/x-www-form-urlencoded", ) } return {} diff --git a/src/posting/widgets/response/script_output.py b/src/posting/widgets/response/script_output.py index bcafeedd..e62ea21e 100644 --- a/src/posting/widgets/response/script_output.py +++ b/src/posting/widgets/response/script_output.py @@ -10,10 +10,18 @@ from textual.reactive import Reactive, reactive from textual.widgets import Label, RichLog +from posting.help_screen import HelpData + ScriptStatus = Literal["success", "error", "no-script"] class ScriptOutput(VerticalScroll): + help = HelpData( + title="Script Output", + description="""\ +This log displays the output of scripts that executed during the last request. +""", + ) DEFAULT_CSS = """\ ScriptOutput { padding: 0 2; diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py index 7b52f29e..af6baed4 100644 --- a/tests/sample-collections/scripts/my_script.py +++ b/tests/sample-collections/scripts/my_script.py @@ -1,6 +1,7 @@ import sys import httpx +from posting.collection import Auth, BasicAuth, Header, RequestModel from posting.scripts import Posting @@ -10,10 +11,14 @@ def setup(posting: Posting) -> None: posting.set_variable("setup_var", "ADDED IN SETUP") -def on_request(request: httpx.Request, posting: Posting) -> None: +def on_request(request: RequestModel, posting: Posting) -> None: new_header = "Foo-Bar-Baz!!!!!" - request.headers["X-Custom-Header"] = new_header - print(f"Set header to {new_header!r}!") + header = Header(name="X-Custom-Header", value=new_header) + request.headers.append(header) + request.headers.append(header) + print(f"Set header:\n{header}!") + request.body.content = "asdf" + request.auth = Auth(type="basic", basic=BasicAuth(username="foo", password="bar")) posting.notify( message="Hello from my_script.py!", ) From 3785586cd2f1341178cef8fa0c41ddf096b310bf Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 16 Oct 2024 22:39:05 +0100 Subject: [PATCH 61/70] Fixing docs --- docs/guide/scripting.md | 10 ++++++---- src/posting/app.py | 4 ++-- src/posting/collection.py | 2 +- src/posting/widgets/request/request_editor.py | 4 ++-- .../jsonplaceholder/users/create.posting.yaml | 3 +++ tests/sample-collections/scripts/my_script.py | 2 +- 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/docs/guide/scripting.md b/docs/guide/scripting.md index 169843c4..fa614334 100644 --- a/docs/guide/scripting.md +++ b/docs/guide/scripting.md @@ -26,7 +26,7 @@ In the context of Posting, a "script" is a regular Python function. By default, if you specify a path to a Python file, Posting will look for and execute the following functions at the appropriate times: - `setup(posting: Posting) -> None` -- `on_request(request: httpx.Request, posting: Posting) -> None` +- `on_request(request: RequestModel, posting: Posting) -> None` - `on_response(response: httpx.Response, posting: Posting) -> None` However, you can have Posting call any function you wish using the syntax `path/to/script.py:function_to_run`. @@ -35,7 +35,7 @@ Note that relative paths are relative to the collection directory. This ensures that if you place scripts inside your collection directory, they're included when you share a collection with others. -Note that you do not need to specify all of the arguments when writing these functions. Posting will only pass the number of arguments that you've specified when it calls your function. For example, you could define a your `on_request` function as `def on_request(request: httpx.Request) -> None` and Posting would call it with `on_request(request: httpx.Request)` without passing the `posting` argument. +Note that you do not need to specify all of the arguments when writing these functions. Posting will only pass the number of arguments that you've specified when it calls your function. For example, you could define a your `on_request` function as `def on_request(request: RequestModel) -> None` and Posting would call it with `on_request(request: RequestModel)` without passing the `posting` argument. ## Editing scripts @@ -83,9 +83,11 @@ The **pre-request script** is run after the request has been constructed and var You can directly modify the `Request` object in this function, for example to set headers, query parameters, etc. ```python -def on_request(request: httpx.Request, posting: Posting) -> None: +def on_request(request: RequestModel, posting: Posting) -> None: # Set a custom header on the request. - request.headers["X-Custom-Header"] = "foo" + request.headers.append( + Header(name="X-Custom-Header", value="foo") + ) # This will be captured and written to the log. print("Request is being sent!") diff --git a/src/posting/app.py b/src/posting/app.py index a1b12c37..2216768b 100644 --- a/src/posting/app.py +++ b/src/posting/app.py @@ -664,13 +664,13 @@ def build_request_model(self, request_options: Options) -> RequestModel: header_names_lower = {header.name.lower(): header for header in headers} # Don't add the content type header if the user has explicitly set it. if ( - request_body._content_type is not None + request_body.content_type is not None and "content-type" not in header_names_lower ): headers.append( Header( name="content-type", - value=request_body._content_type, + value=request_body.content_type, ) ) return RequestModel( diff --git a/src/posting/collection.py b/src/posting/collection.py index 8c753f7e..dad0ff89 100644 --- a/src/posting/collection.py +++ b/src/posting/collection.py @@ -101,7 +101,7 @@ class RequestBody(BaseModel): form_data: list[FormItem] | None = Field(default=None) """The form data of the request.""" - _content_type: str | None = Field(default=None) + content_type: str | None = Field(default=None, init=False) """We may set an additional header if the content type is known.""" def to_httpx_args(self) -> dict[str, Any]: diff --git a/src/posting/widgets/request/request_editor.py b/src/posting/widgets/request/request_editor.py index 3d56519f..a1aadc61 100644 --- a/src/posting/widgets/request/request_editor.py +++ b/src/posting/widgets/request/request_editor.py @@ -141,14 +141,14 @@ def to_request_model_args(self) -> dict[str, Any]: return { "body": RequestBody( content=text_editor.text, - _content_type=text_editor.content_type, + content_type=text_editor.content_type, ) } elif current == "form-body-editor": return { "body": RequestBody( form_data=self.form_editor.to_model(), - _content_type="application/x-www-form-urlencoded", + content_type="application/x-www-form-urlencoded", ) } return {} diff --git a/tests/sample-collections/jsonplaceholder/users/create.posting.yaml b/tests/sample-collections/jsonplaceholder/users/create.posting.yaml index 3f0f90c3..9a11fbfc 100644 --- a/tests/sample-collections/jsonplaceholder/users/create.posting.yaml +++ b/tests/sample-collections/jsonplaceholder/users/create.posting.yaml @@ -9,6 +9,7 @@ body: "username": "john.doe", "email": "john.doe@example.com" } + content_type: application/json headers: - name: Content-Type value: application/json @@ -18,5 +19,7 @@ headers: value: gzip - name: Cache-Control value: no-cache +scripts: + on_request: scripts/my_script.py options: follow_redirects: false diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py index 33ed1a4a..9a2f2b31 100644 --- a/tests/sample-collections/scripts/my_script.py +++ b/tests/sample-collections/scripts/my_script.py @@ -16,7 +16,7 @@ def on_request(request: RequestModel, posting: Posting) -> None: header = Header(name="X-Custom-Header", value=new_header) request.headers.append(header) print(f"Set header:\n{header}!") - request.body.content = "asdf" + # request.body.content = "asdf" request.auth = Auth(type="basic", basic=BasicAuth(username="foo", password="bar")) posting.notify( message="Hello from my_script.py!", From 4a2f74cc5fb8561b4dcab7811761ec93d4c12edc Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 16 Oct 2024 22:54:22 +0100 Subject: [PATCH 62/70] API improvements --- docs/guide/scripting.md | 19 ++++++++++---- src/posting/__init__.py | 26 +++++++++++++++++++ src/posting/collection.py | 15 +++++++++++ tests/sample-collections/scripts/my_script.py | 5 ++-- 4 files changed, 57 insertions(+), 8 deletions(-) diff --git a/docs/guide/scripting.md b/docs/guide/scripting.md index fa614334..ddf82b17 100644 --- a/docs/guide/scripting.md +++ b/docs/guide/scripting.md @@ -80,14 +80,20 @@ def setup(posting: Posting) -> None: The **pre-request script** is run after the request has been constructed and variables have been substituted, right before the request is sent. -You can directly modify the `Request` object in this function, for example to set headers, query parameters, etc. +You can directly modify the `RequestModel` object in this function, for example to set headers, query parameters, etc. +The code snippet below shows some of the API. ```python +from posting import Auth, Header, RequestModel, Posting + + def on_request(request: RequestModel, posting: Posting) -> None: - # Set a custom header on the request. - request.headers.append( - Header(name="X-Custom-Header", value="foo") - ) + # Add a custom header to the request. + request.headers.append(Header(name="X-Custom-Header", value="foo")) + + # Set auth on the request. + request.auth = Auth.basic_auth("username", "password") + # request.auth = Auth.digest_auth("username", "password") # This will be captured and written to the log. print("Request is being sent!") @@ -103,6 +109,9 @@ You can use this to extract data from the response, for example a JWT token, and set it as a variable to be used in later requests. ```python +from posting import Posting + + def on_response(response: httpx.Response, posting: Posting) -> None: # Print the status code of the response to the log. print(response.status_code) diff --git a/src/posting/__init__.py b/src/posting/__init__.py index e69de29b..550a628a 100644 --- a/src/posting/__init__.py +++ b/src/posting/__init__.py @@ -0,0 +1,26 @@ +from .collection import ( + Auth, + Cookie, + Header, + QueryParam, + RequestBody, + RequestModel, + FormItem, + Options, + Scripts, +) +from .scripts import Posting + + +__all__ = [ + "Auth", + "Cookie", + "Header", + "QueryParam", + "RequestBody", + "RequestModel", + "FormItem", + "Options", + "Scripts", + "Posting", +] diff --git a/src/posting/collection.py b/src/posting/collection.py index dad0ff89..c276ec9a 100644 --- a/src/posting/collection.py +++ b/src/posting/collection.py @@ -47,6 +47,16 @@ def to_httpx_auth(self) -> httpx.Auth | None: return httpx.DigestAuth(self.digest.username, self.digest.password) return None + @classmethod + def basic_auth(cls, username: str, password: str) -> Auth: + return cls(type="basic", basic=BasicAuth(username=username, password=password)) + + @classmethod + def digest_auth(cls, username: str, password: str) -> Auth: + return cls( + type="digest", digest=DigestAuth(username=username, password=password) + ) + class BasicAuth(BaseModel): username: str = Field(default="") @@ -122,6 +132,11 @@ def request_sort_key(request: RequestModel) -> tuple[int, str]: class Scripts(BaseModel): + """The scripts associated with the request. + + Paths are relative to the collection directory root. + """ + setup: str | None = Field(default=None) """A relative path to a script that will be run before the template is applied.""" diff --git a/tests/sample-collections/scripts/my_script.py b/tests/sample-collections/scripts/my_script.py index 9a2f2b31..84d19649 100644 --- a/tests/sample-collections/scripts/my_script.py +++ b/tests/sample-collections/scripts/my_script.py @@ -1,8 +1,7 @@ import sys import httpx -from posting.collection import Auth, BasicAuth, Header, RequestModel -from posting.scripts import Posting +from posting import Auth, Header, RequestModel, Posting def setup(posting: Posting) -> None: @@ -17,7 +16,7 @@ def on_request(request: RequestModel, posting: Posting) -> None: request.headers.append(header) print(f"Set header:\n{header}!") # request.body.content = "asdf" - request.auth = Auth(type="basic", basic=BasicAuth(username="foo", password="bar")) + request.auth = Auth.basic_auth("username", "password") posting.notify( message="Hello from my_script.py!", ) From f0aa71755ed7efdf29f1e1c915c63319a48ad3ce Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Wed, 16 Oct 2024 22:56:16 +0100 Subject: [PATCH 63/70] Update snapshots --- .coverage | Bin 53248 -> 53248 bytes .../TestScripts.test_script_runs.svg | 219 +++++++++--------- 2 files changed, 110 insertions(+), 109 deletions(-) diff --git a/.coverage b/.coverage index 7a02a9a5fe49f88efd24e1d1abe83c03ea9a3ecc..0ac6f55669d8c0ba9e38178f1b768a8994de0744 100644 GIT binary patch delta 1500 zcmY+C3rrM87{_OCZ*OlOGkY8d+;JSoBf!;GKtW#Rr6$H;yd}}v200KBlmxh|P%WBr zAn2x15i?0+qel9QX{9K^t?11062!m8qf zB_)+4DG1SE!%AFT<0+{kzzXpdXNXgzLGnsm?5->=+fR6~K!dkelZuL>%6-1t0GkfpQIrPf z%OUuQ9G#99(Ie?cbQ^smZ9wm`?+9-85S)g;pff^*$Vvf{lTC)-NuQxZ@S@Zxm7xUT z7Ied8@iIc~TXLHqo^e?ie>=UI!q90YHqPdo;Y#=Xu(KdC%n(X%q*l(i+C2%MEif}E zgwCMwHK*AMEp+m#^#AM<@xubESqP-pt>UkZ;c;`JmEo4BX_Kvt-b`B{QeNx%xI%%nZl`ZI78d$ED9IOmi8xwwlFWh1Eg{jfX|V7gr9}0 z!k0p$;1>1?IZ})eFHu4ypDk$kMShI$=R45=|1CFxzTz(+C*RC}#8>hqC>g47jL(OI zup532FTqpr2+V_c_e7o12WJ3iX9Cze%0wG?MSIRQGwPs?!zO*3i4Q5*`t zu2a?#wk+2AgpIw_PmVCF9@AkGArTaXuY4BFyWmZ?Np-{x-%)D1qHpdP6;Cj8K_Xj zPDG}p_GiQh@AZnWzYm;Ky<_9Fr*^6H2(Q>kMj*VqBQ0DTq*zH1FBFVi{0`JlH4fV$Rgdc{nLQ6GI#V^o5OjArj9CQty(-;JS0 zB+jM;lEZY}%Z_uSNseBP{(Z2Z*KY!KjU(Ig`|>qgbxHt9Knx$Dn26Y-eQ|0y8k73H znkSEIQc`v|J)AgEJW+RNw+Xi_$la81Io)^rWNd2-xpR?^79 z`Zek+`JNsu*ozL2tA}T%rysEk?QN$7O21Qi!*_=cJbQX8d!Fj*`fyf*cQiTha8sf; zQVAi|TgBSkMJZ*d)GD=klg?MD4@#3dDu(l{brr+v<2j|?qy&>5#~ggYQr0uDbjH23 zp8{R|nx$82ZBI{D?em_RVs9&(k_ImI_W{s#t=#KS`m(%(FUF_rCICileN}(ETmQ`S zxLvM~IRJ9Mw+=sdjeCE+`pMG=b3LDS54h*2|6TWeU7!ATy}s0HElvVp54l8jsTH?M zQI3Rk8pPlB(t}eOLttocreY-H*J{+l(mS)7k%~hlIr|^H)ADHm delta 1478 zcmZ8fYiyHM7(U;=-oD#8T}SV?-5Kas<_6=kwHOjaCM|&ghG9#AL56gz+ZaqD?J(hs zFv`p!{2?QV8oY2BHVO!`dEt@`#2BML#%PO@DbWs47);uF3Zfn7{CO|WdEV!Ja)Jlw z-~qaao1Hg+K1RFIX0#ktA}xFfqwqZZ5O%@W-~w0z6+%4x?Ce8AmOcl&TzZpEMT4rA z=G8WTQ%h?@<2u{=jXr;UbD6*0l8r|eSSck&&O!;IK`o}{Pr$WKo`U#gr^O)9U~1;W z)^>k=3wdYcahKCXarlT+Z)RyQD-*Q3$>;Mnu1Vwc3|{XtSQIp<$wahyn;X2VHawy# zl;eZ0B1(oYx=ebtlm_LQNUz^dXbciO<}^|?*0`+dtfw@sZ6HKA=9*NEx==f+gE4pk zU4qT>C0vud4Kl(A{D{lv<>;{RgS<-k98HC93*ATu6VS<>5}Jf6{t%oLp1Uw4V5i4m z%+b?TRHlai+*0BAD^@BS-(I0puJN{#OLidglm&DxjxAFY<2Wg@(9cu2&S@|}9X)j% z(G&LsyxVP(^65Fa$EjYz8R=Q$fEf<5271Q0UR!;0OG8s58OxaHn(?g+TNU^nPmxq^ zrX3U>Ab&unq07gCA3G~ekH!h7Rw}X5b11BL88!6Nx*s_lj(Ku(0|0;-%pJfaxM|EC z&ctqKUtnv{AX|yPMEg*Pos4{J9$JJP$c7LcWVLV$Tnz2PZ^Dq!FPvtf@SgChP|He% z8sQm1Bk=qKewe?&_wajpk>AKK;mh~}?k;zo`-(fv9pv_Mom_xx80=ITPqm z*`*Y-tx)PtIc^107fw`nluIb)by?C=+;=-``f&UHOu}r)vx=7qw}aywP4QYDkn;vG(E<74hZ&t9X!jq~g1#;`;97l0YHOf360!D->dlH_O1v&XnxH;Fcb$=bToYK(?A9X|$?>V9Hq!SYZZzy#NG{ zaVk+oTE$uYl@$~Kqx}=9tBAo@cY3)TaSrK}RBW@+_{GkMK`YKolT1z~T$dE!zSX-a zlH4>Bk6&LGp0kUiaN~|L#UgPMS-+zYFAdEz7;QH98I@R)=GP@Jed-vxG7ukrGcqd0 z?}tio^sSZna;TCuivhjwb_3SvGR_snQj0 z`)EKX=91EL%49_}5Fa|7EV_TzP5}vU_t6&7LRxl+*`3B56A3kZ|Kgc>k^<34l6f3v zc3T`;(LjPTm<;$G)qF(!7b%KGK!_UY5>Lb2%f Q)zRR^IvJ>x9qgL@4`|iyQUCw| diff --git a/tests/__snapshots__/test_snapshots/TestScripts.test_script_runs.svg b/tests/__snapshots__/test_snapshots/TestScripts.test_script_runs.svg index 26242941..5bb54f21 100644 --- a/tests/__snapshots__/test_snapshots/TestScripts.test_script_runs.svg +++ b/tests/__snapshots__/test_snapshots/TestScripts.test_script_runs.svg @@ -19,205 +19,206 @@ font-weight: 700; } - .terminal-1216613084-matrix { + .terminal-3563060270-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1216613084-title { + .terminal-3563060270-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1216613084-r1 { fill: #dfdfe1 } -.terminal-1216613084-r2 { fill: #c5c8c6 } -.terminal-1216613084-r3 { fill: #ff93dd } -.terminal-1216613084-r4 { fill: #15111e;text-decoration: underline; } -.terminal-1216613084-r5 { fill: #15111e } -.terminal-1216613084-r6 { fill: #43365c } -.terminal-1216613084-r7 { fill: #ff69b4 } -.terminal-1216613084-r8 { fill: #9393a3 } -.terminal-1216613084-r9 { fill: #a684e8 } -.terminal-1216613084-r10 { fill: #e1e1e6 } -.terminal-1216613084-r11 { fill: #00fa9a } -.terminal-1216613084-r12 { fill: #efe3fb } -.terminal-1216613084-r13 { fill: #9f9fa5 } -.terminal-1216613084-r14 { fill: #632e53 } -.terminal-1216613084-r15 { fill: #dfdfe1;font-weight: bold } -.terminal-1216613084-r16 { fill: #002014;font-weight: bold } -.terminal-1216613084-r17 { fill: #e3e3e8;font-weight: bold } -.terminal-1216613084-r18 { fill: #0f0f1f } -.terminal-1216613084-r19 { fill: #6a6a74 } -.terminal-1216613084-r20 { fill: #0ea5e9 } -.terminal-1216613084-r21 { fill: #873c69 } -.terminal-1216613084-r22 { fill: #22c55e } -.terminal-1216613084-r23 { fill: #8b8b93 } -.terminal-1216613084-r24 { fill: #8b8b93;font-weight: bold } -.terminal-1216613084-r25 { fill: #00b85f } -.terminal-1216613084-r26 { fill: #9393a3;font-weight: bold } -.terminal-1216613084-r27 { fill: #98e024 } -.terminal-1216613084-r28 { fill: #ef4444 } -.terminal-1216613084-r29 { fill: #f4005f } -.terminal-1216613084-r30 { fill: #f59e0b } -.terminal-1216613084-r31 { fill: #58d1eb;font-weight: bold } -.terminal-1216613084-r32 { fill: #0d0e2e } -.terminal-1216613084-r33 { fill: #1e1e3f } -.terminal-1216613084-r34 { fill: #552956 } -.terminal-1216613084-r35 { fill: #ff7ec8;font-weight: bold } -.terminal-1216613084-r36 { fill: #dbdbdd } + .terminal-3563060270-r1 { fill: #dfdfe1 } +.terminal-3563060270-r2 { fill: #c5c8c6 } +.terminal-3563060270-r3 { fill: #ff93dd } +.terminal-3563060270-r4 { fill: #15111e;text-decoration: underline; } +.terminal-3563060270-r5 { fill: #15111e } +.terminal-3563060270-r6 { fill: #43365c } +.terminal-3563060270-r7 { fill: #ff69b4 } +.terminal-3563060270-r8 { fill: #9393a3 } +.terminal-3563060270-r9 { fill: #a684e8 } +.terminal-3563060270-r10 { fill: #e1e1e6 } +.terminal-3563060270-r11 { fill: #00fa9a } +.terminal-3563060270-r12 { fill: #efe3fb } +.terminal-3563060270-r13 { fill: #9f9fa5 } +.terminal-3563060270-r14 { fill: #632e53 } +.terminal-3563060270-r15 { fill: #dfdfe1;font-weight: bold } +.terminal-3563060270-r16 { fill: #002014;font-weight: bold } +.terminal-3563060270-r17 { fill: #e3e3e8;font-weight: bold } +.terminal-3563060270-r18 { fill: #0f0f1f } +.terminal-3563060270-r19 { fill: #6a6a74 } +.terminal-3563060270-r20 { fill: #0ea5e9 } +.terminal-3563060270-r21 { fill: #873c69 } +.terminal-3563060270-r22 { fill: #22c55e } +.terminal-3563060270-r23 { fill: #8b8b93 } +.terminal-3563060270-r24 { fill: #8b8b93;font-weight: bold } +.terminal-3563060270-r25 { fill: #00b85f } +.terminal-3563060270-r26 { fill: #9393a3;font-weight: bold } +.terminal-3563060270-r27 { fill: #98e024 } +.terminal-3563060270-r28 { fill: #ef4444 } +.terminal-3563060270-r29 { fill: #f4005f } +.terminal-3563060270-r30 { fill: #fd971f } +.terminal-3563060270-r31 { fill: #f59e0b } +.terminal-3563060270-r32 { fill: #58d1eb;font-weight: bold } +.terminal-3563060270-r33 { fill: #0d0e2e } +.terminal-3563060270-r34 { fill: #1e1e3f } +.terminal-3563060270-r35 { fill: #552956 } +.terminal-3563060270-r36 { fill: #ff7ec8;font-weight: bold } +.terminal-3563060270-r37 { fill: #dbdbdd } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - Posting + Posting - - - - -Posting                                                                    - -GEThttps://postman-echo.com/get              ■■■■■■■ Send  - -╭─ Collection ──────────╮╭───────────────────────────── Response  200 OK ─╮ -█ GET echoBodyHeadersCookiesScriptsTrace -GET get random user━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━╺━━━━━━━━━━━━━━━━ -POS echo postSetup          Pre-request    Post-response   -▼ jsonplaceholder/SuccessSuccessSuccess -▼ posts/ -GET get allScript output                                 -GET get oneRunning my_script.py:setup -POS createout Hello from my_script.py:setup!         -DEL delete a posterr error from setup!                      -▼ comments/Running my_script.py:on_request -GET get commentout Set header to 'Foo-Bar-Baz!!!!!'!      -GET get commenterr Hello from my_script.py:on_request - i -PUT edit a commRunning my_script.py:on_response -▼ todos/out200 -GET get allout foo                                    -GET get oneout Hello from my_script.py!               -▼ users/err Hello from my_script.py:on_response -  -GET get a user -GET get all users -│───────────────────────│ -This is an echo  -server we can use to  -see exactly what  -request is being  -sent. -╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ - ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help + + + + +Posting                                                                    + +GEThttps://postman-echo.com/get              ■■■■■■■ Send  + +╭─ Collection ──────────╮╭───────────────────────────── Response  200 OK ─╮ +█ GET echoBodyHeadersCookiesScriptsTrace +GET get random user━━━━━━━━━━━━━━━━━━━━━━━━╸━━━━━━━╺━━━━━━━━━━━━━━━━ +POS echo postSetup          Pre-request    Post-response   +▼ jsonplaceholder/SuccessSuccessSuccess +▼ posts/ +GET get allScript output                                 +GET get oneRunning my_script.py:setup +POS createout Hello from my_script.py:setup!         +DEL delete a posterr error from setup!                      +▼ comments/Running my_script.py:on_request +GET get commentout Set header:                            +GET get commentoutname='X-Custom-Header'value='Foo-Bar- +PUT edit a commerr Hello from my_script.py:on_request - i +▼ todos/Running my_script.py:on_response +GET get allout200 +GET get oneout foo                                    +▼ users/out Hello from my_script.py!               +GET get a usererr Hello from my_script.py:on_response -  +GET get all users +│───────────────────────│ +This is an echo  +server we can use to  +see exactly what  +request is being  +sent. +╰── sample-collections ─╯╰─────────────────────────────────────────────────╯ + ^j Send  ^t Method  ^s Save  ^n New  ^p Commands  ^o Jump  ^c Quit  f1 Help From b76656d56003d48aa10dbd59de0b988bc7c828ec Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Fri, 18 Oct 2024 15:26:02 +0100 Subject: [PATCH 64/70] External pager and editor guide --- docs/guide/external_tools.md | 63 ++++++++++++++++++++++++++++++++++++ mkdocs.yml | 3 +- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 docs/guide/external_tools.md diff --git a/docs/guide/external_tools.md b/docs/guide/external_tools.md new file mode 100644 index 00000000..08b0b2af --- /dev/null +++ b/docs/guide/external_tools.md @@ -0,0 +1,63 @@ +## Overview + +You can quickly switch between Posting and external editors and pagers. +This can let you use the tools you love for editing requests and browsing responses. +You can even configure a custom pager specifically for browsing JSON. + +## External Editors + +With a multi-line text area focused, press ++f4++ to open the file in your +configured external editor. + +The configured external editor can be set as `editor` in your `config.yaml` +file. +For example: + +```yaml title="config.yaml" +editor: vim +``` + +Alternatively, you can set the `POSTING_EDITOR` environment variable. + +```bash +POSTING_EDITOR=vim +``` + +If neither is set, Posting will try to use the `EDITOR` environment variable. + +## External Pagers + +With a multi-line text area focused, press ++f3++ to open the file in your +configured external pager. + +The configured external pager can be set as `pager` in your `config.yaml` +file. +For example: + +```yaml title="config.yaml" +pager: less +``` + +Alternatively, you can set the `POSTING_PAGER` environment variable. + +```bash +POSTING_PAGER=less +``` + +### JSON Pager + +You can use a custom pager for viewing JSON using the `pager_json` setting in +your `config.yaml` file. +For example: + +```yaml title="config.yaml" +pager_json: jq +``` + +Alternatively, you can set the `POSTING_PAGER_JSON` environment variable. + +```bash +POSTING_PAGER_JSON=jq +``` + +If neither is set, Posting will try to use the default pager lookup rules discussed earlier. diff --git a/mkdocs.yml b/mkdocs.yml index 3de9832e..b70da961 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -32,11 +32,12 @@ nav: - "Configuration": "guide/configuration.md" - "Environments": "guide/environments.md" - "Command Palette": "guide/command_palette.md" - - "Help System": "guide/help_system.md" - "Themes": "guide/themes.md" + - "External Tools": "guide/external_tools.md" - "Keymaps": "guide/keymap.md" - "Importing": "guide/importing.md" - "Scripting": "guide/scripting.md" + - "Help System": "guide/help_system.md" - Roadmap: "roadmap.md" - Changelog: "CHANGELOG.md" - FAQ: "faq.md" From 77637e67ecb26a37c89e379f3a5246ae2dcc213a Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Fri, 18 Oct 2024 17:05:24 +0100 Subject: [PATCH 65/70] Docs improvements, site fixes --- docs/assets/collection-tree.png | Bin 0 -> 61041 bytes docs/assets/default-collection.png | Bin 0 -> 33451 bytes docs/assets/request-method-dropdown.png | Bin 0 -> 16523 bytes docs/assets/url-autocomplete.gif | Bin 0 -> 109681 bytes docs/assets/url-bar.png | Bin 0 -> 25284 bytes docs/guide/collections.md | 42 +++++++++++++-- docs/guide/index.md | 63 +++++++++++++++++----- docs/guide/keymap.md | 3 +- docs/guide/navigation.md | 10 ++++ docs/overrides/home.html | 20 +++++-- docs/stylesheets/extra.css | 7 +++ mkdocs.yml | 2 +- tests/sample-collections/foo.posting.yaml | 1 + 13 files changed, 123 insertions(+), 25 deletions(-) create mode 100644 docs/assets/collection-tree.png create mode 100644 docs/assets/default-collection.png create mode 100644 docs/assets/request-method-dropdown.png create mode 100644 docs/assets/url-autocomplete.gif create mode 100644 docs/assets/url-bar.png create mode 100644 tests/sample-collections/foo.posting.yaml diff --git a/docs/assets/collection-tree.png b/docs/assets/collection-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..8f5b1e4e75ee1b1a8bf44c13e38f6a82255d1cda GIT binary patch literal 61041 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%0A{S}}0U;_`k}pD*x{n2(xv&8Sl@c(7 z+}$h8Dc1UbGzH+R%9;8doM7OwyMNt91~u5dI6~+Up+uH{D$Bz1O zHNEfJWL3lTTigOw0OF{M8zs|9Wpe9Fw`Fmzm~lwY_8Z&LD&O`AY7@;ZGpY%=G*C>mmre)Sr-Md82kUq91Ko3_w{NlDZ4ArKJRB<} zH&d(3s8D(esz|SL+fUvVi#;)2J^GWpwhLmvCPZr-)=SEn&MQm~e{5VOq5bZT9VnwihmmxBAPe~YyKwFYs5f&#SMY{ZscCG+FJZ5DVLYtD?d zrC7#@Aw=9;mgcx3w^9Jwru6W>gz7`9nF{$E1Da!uYmP8hnmG6~2QT-~$EkeY9yL=1 zzoyDCFOGs7xOYaf$ep%l^2}wUEG;KIaEH<)vSj1jlK4%H#$c=0r^1pjzlk5o-7Vyn z1akSf(~;OCF92m^2K``6q2La1JHFXJRV&nRH1`$rw3x7BqPi-$jCqcpdN)VNvk6iC zkB^HLBw%uN0Z78$kZ>Ni;~J6s;Gze{U>+8t7a8H8Sf)!G0QX3uV|;+$?_>D^u3i}f zw}N~4v6xn#(Dc%(0Xh6!t;T0#4%xW2R{wZ67u90rNLE=uMGxxe37{7AAd-x@5uJ|S zlxdz~aC;iG0VbLLpjt@YDr%(ud)-2?!IVW}GPF2^4VV;7=lXoX)?E^eL$1Ck`D`xIDFWvyp!i z3Z4wJwNK5Bpgqvz6cyzxs#-gce2XNpu3%BVeig%yQtgbmzM3w++(cdK05}G7EN-d; z%8yup1?uYW&}4>edhQTcEmj}NQYcMb@{DmH!7LziA?^bvp-U?Y075XfV?nFk z-I=ZKF`_;@+EmM!7b<;2v589-@Q!|F9Ifr-5UG&;3iFl3yEj0+V%CZflK_l!y<=hrVMU zj)t^nYU~nYt^EAtJNgq3nUgBa4=J0j4mcIg!Pz&5*zEd(dGx-#nmLu>(D^K3aL7DD z>1pHD!qC_VUVd{Z(xm|SXXjFB_+rd>0B0Q5KE4c(WZ&uxvs1->MLE7g1vR?=#d1t!lNSNM83Qm$eyNX#eqC4E3hbUfEc_um#+cvew5vy#gFG>Y!_{45w}>hup*vUS z_{wh>OMa|I#ypk~%JFU^0d$9h;7Ro=Q=uM(L|&66j;#`czBN~GlQ4=)^F7j3vK0ZG z4*P^c_@yOu&Po4q8sBr}lDR(oW1|EPvtiVSr9_7TGS9saZ&H+m5$AAW(^RN{0vtZ9 z%P|Xk5_Kh%rbWS$LqeaKR}jMpbk~tL$CD=Kl)q+AEjPC_7f2eL4`hj!qV~TsRplln za+)Sx3E%$FP_!-@33S|H+hGVX(m_4=EKPrXeX3EL);<+8tTmXTe~ukBVqB;(;XR*R zx|n#F9FeNrq@GVefaA3%ilRJ+=?HcHef%qdLN31l1AGnwTlI9TR0ACmoOI3p2;p!7 ziws`s5sKCf#X=3{NHXoCQ%)9dQr0yPJG<>&PQWNz;WwzR4vFL)Z-vXqfu;|o^1vQKAz@zT?e3| zE$}!xn=ir=#-q03d?PgDRIcwJZ?a;Cw?|G=noZbKWOxx5$t#u0K@t`L=NgD7qC#JX zz0X6jk?Q)C`*z;b2)}A35w?0d3*C#U(P5>*mFS=zLb9)=&J=!Z)bFy5Z8!?CdIkL8z!wu!?Gh8KrArNZs5_J@m~KQ2c>?-m*9-7ra7+ zm=3s%QFd!rNntclaq{!$?h|sShQW4Xf^89IIL z2ZBHr{b@zr(kgQE>GH3Hw?%c@hc-j!mJfc&*8xMfbRFMT?DS_b7#XVJsBL?W)6H^g zz1VVQJ$j-m`QH?Cs@`N*spbAgw9cQIhF;nWo_xj&~Vg z3d6OiS5pnsFj~>yC2WwVj}*G5x3Bh8#^?w#sA!$;HYHOFKft5C{5n*Zq~n~wKn%%< zcmw+XkY5?GSKSKfLa&gdXX)Vs)(rM^Q67^eq>3x4U&w6n7Ao=L?}1M30i&`eWIKUSOnelgFNXf ziSmcwBGDmRTjRf0uSMR4uub2Idc~cJnNMHm`1Oci=C@$gOnwmRJTsU3i5TU#GjUnT zt&sOdc-wJbve>qb^4_GuvvJO;Gu;5Pf3r~nqJ4dRJyP^ioX9ueLW_z|U6I|Qo5yc- zq0u|&yiK&A^8I@z4pqjEZyDG(@6xEtD8-BzryXvpI+yML>sVaU496N(Yey@KBSW`m zTW!URtZ3DKN-y1){xd|Yu$=y@iJ@3n6Js<9vx7;QnXR74w^8ksG2*_YY8i_(A)F(2 zsw{PykuHt%z36Ix99OX8X9#7_B=WMVdz}@9i5jm2^YyBWt`oj%Dz5jbl*y zfLHg{cJAjZpha#}9?oYs49IZW-pZxy$$f9&#iU!OD*X)qp+TnjeBJI#cxT+BcO%5t z969d7V?jIoe=Q_*C(8l{?E?O9a#5zxRh1EYpZ&ZW1luQSd$g6Upb1tQNqDklG zqY10McK6FE9byqlFN2IcH15lv+R}5KKedx$2*bZr@+#im}icf zs%x5X)OotYKGv_WqtOVE$*w!Othadz($Kj9~2KX z3s^{HC#rLidkl}Y`i7vg$*6(+4|xS#`I9v75BDAJS0e&DUy;(;(lS$uoI1s_=&A-F zUq^>H<$+4 zEao)9VEyCfTYT1yv+m%9Sg}7vT!ecn-7Z3it3!C#0lM7!YAJ{FUJzmuk(sd^@JF6P z%?i%N(FFQr&#e)iFYC02r3g{VC?(>!yp(Ym{|)AMi~6S#CQXG{+^JB$^+~HB4wUqB zf<$06#&)j?LV=Y9p?V-w8hiJCQ`vl^CE;CO#E&N-rL{#wJLr(ywRdLLZz|gR%ui4n zQf#>!tvQ7H|Dipkg%8ywSne_A$b)r^&MbtgyZ~{vFP4vY zyV?uUzs6)-zP$5!9~g*2%v}=U;p(t*wCS)cD>+JSNdv@%i@Q5u4)~0d{9sKnEu{Ca~NECu1^Ad@^Mk7tI_AOW*fea$GJZARe zc9w=ucRaVqgkG~9EtTB=LneJs)S?oc zA86Y!WJt=DGp@|$YJBp)2VlOkJNfOZmZlHB+ZJxbH6*Ra|1NY2Kzz8zOTLF6w2P`m z*7_4ypL{j(fB3jN%P5sK<6AP9D++)u#SD-My1-oz<0*J}crt8s5Kbm@!~xa(>bcyNVa<&_}pI+M@qjr41&R3WCa z;s~{Qb3Z2)ZRdM|DCd~fsze$&lk-9$etzQ9o#!Iz>go+O$Vf&I>&*St9$cfxRj8o3 z0D6x2p^{l3QS5oWP8TpvEE5^B$7fv+p!7$6Be=PFDRKfnJ+HI}<+4b4F2ys~(_5Q`@8Ch_nxPw4>+o0?K~9)xfFyx5(qEyOcVLs)^q1ph(mx2sKP$QqztMkd4##)$a^Vx&V$3gWZMZw})%i3a%cB7zWQl-T~Y8Qg;+Cj_=vUTT;aH z`v~#;t{15q=bT7Oq)=kI9*^5cOHa*Ih^dQBx#GwzNlkORkD?KT4UT?JYaFgzP^n*@&+UW1nn+x}T0?5d2v* zpvpxQykJZU_@uud6?K|z;pbJ!*poDgEK_K9IbCMcVT*DpD*w3O9;wf|A0vaa&Q zdiwXNI>$T@&6_M*oa|OUcbo_ONoritpL;U{_Qo*oVR zO%y7@)Pdcj#+36e_{SLU@Igay41?EpzO&rel4(pGM36=wZ`}^_rwe&L&E_ML?@+HY z8$sVpD#X($)k6lY&==)sLg{e!^}&}Is_qOysHhMK4J15!Ci9R&6;?nco2>^nVbfMc zbK4v0O4WKNW`*d_-nWeuGNG;lf4CCAz%tnGIKdfyKBRF2F@ZE5tTB{vIPHLMqFERiRU7d|Ea0CKi8AUOO;K3_$#~plVL9x4W8> z*)ox}fQlIzg2L&U>p^G*Gv(##Y{{`2$%$>zK`}sz49+TRxS#c6 zlbkfAp0tobSXqtNHZ8^j>yM7yH`!I^D-jC0`v_#&ob9hR;2(~D*2eA&&X8@*N{qz6;ZjzXha=)Z2+hBdaYm#B0lQex{KH!xI4=44+&;E=$=mnRXTl ziWZF2mSU!yUU$48mLJ_=d`czdU;Hh+F*jojW-yd?|C!4kTpcSa2|n8D-}iQ1k$MKb zT0_FxAOt@3eewJE`=tC8(d6Fcrj+9`u4W#U6>#Ypa!a112_;qws6m(+eVORz?fn(H zGS5pJx5}j7>>8e@^KKvL@uOE#`91NId9U+{E`eqjox88_8I_gejnG>yfO%-U+h3H? zY8?9B9ihx^9ORsKiXqI0L)qUNLCCAj0#cSW`Eo$ABDMDjos%HWbu~^DFGG}U0PJ=x zXzZ!cFnF9PVH&ZqGcZ4ODP|!n+5~ac_~T#I^m3ffWw?(|W-E=-#$G(cH@gqi%Ba(} zA7@n~?^=Kkw$bgw58XxVR2;cM?IF)$tCf?z8QPV-xo^5_PUdP+&0kyD$Qf7|t@z*n zIDIDo>{7hIhyqV0HM6&-qs)hMW>Z!;MWY(^6PoskbjBK~Cr-gKZ-I}9J~?Lf12y4V z5X+I}LPHr-6Qh;T+QT*}nj9VogH8>hEREz8V7ZEzUkSy-Ag*7Ev?~WQ z!&HITg)%u@#7^Q){!~9M(NLPOx2VhZlLXjE!-61S@byEM1gUczscPc)O#uKxmKF(r&-ArV3sekDOuPx z^SzX@hAywK2Z9KSUYeMr_ZSLyQ`w%p*cLOQCn2?t+U3S>%3Nd+pSnp=CO9I9%dH{g-9XZk6ON9Tu%LQ}^Urt>}y@vuyc$P}gPyz5E! zE2&Yku&0HbD^C@!;yE$K(m$I4Ei7D}NAnYMJ{!Q2Cq_j{6^BVw7OfeELv0<%h9~qC zBVYg*g^g3n?+`q=2q$La(Bx)4XF~8ZHDa-l7xk9Wmkd!)lEhOvLPYfODt?1E3V$cd zh)T=}JN8i!YG%FjHm@U1rWg+HmXdi}r}Z=UHGMTtZ3?JDa%0H7^TS^5C`)G7rjK;| z_h)W{aPt&w24qQ0aiZ!R{R36VQ*xO5z*h&7Q3jG4 z4Wo%8O|g*msnF0|`|%hx+TYy=t3aOL5+;L}@N;U!J6n#u<6g!Y zZMK*yT_v8smFNw`XfwX%v~zOu)z!f2UDs`T^MNGHX!)nEZuWOLxru>HA^V^HuhSOG zAwhSDiNa!BG`dvQXYE%XBO)U9yj(SrSo=(hXVi1sx7Z#Fdb2xIa+lKC;&K>qJ6kI} z1mAQ)JbGfOZcogXIj+n*KR21w6d4%(=a--M*m_eL^W4w}F3~BEYwXYcqc~)e;h#s1 zo%d;??TdA42chK!=L>xAUwY8nlT!U4L%ekn4)XiD!(9QP45>>DhSvLd^D)#U*&o=H zVAN(d=-m=qB$oLm1H39#Ryr_s$LI4?bxzwRg}*esk>d9D5%a&}E!%D^+G(puJQ0=j zVJ%Km7A~0=Pqs_-=yXq{PMGxc^tKGn6_@6#gZ7RlSi&v8uibZjlU6Gg$$<(%R!zt5 z`GUWuXPzgR?-@q?LM2;TG)MZd!bCuf7n}DnY@C=V;}ANV4gy<(;nnfg>)ud_QJ!)A-wnuxmychvg(yum+-_PrKKMsfQ4f%wjqQU ztm*~=Ig=;5Vzht6Y3jviuY5#JRkWZ4vP;)n^bVQ~EP9$cqH6iX=vJ4*;DBKO!|}K_ z`Yu*Lc=07hj;VNQqF6dVw_Kuy-b)J2PIwTsJpDWaj+Hm?=3_&Zd#Gg4lx&5nU4;O+ znS%#4RiHRzr-YJ()Zvmehdh6<+c01)WBAC3Q_Pz+o0c;Izwk(_MEH7lL@@ zj@bU655+lmpw>LO_pXhFs6Z7O^k}}^(o4L&&pMa@5&egTD3wIvHFpu`C8T?J&Z}X( zPkTd7yDLwdZz~p58Ok1{`GP7>6``hJh~OLQ1|Ryz`!EC+npSW0fBp;nE7Af{L~?Jq z8vIK-0pzscuiXFt`CnOHm2CM)MIK6{hhqQuo&iQnCF%y2H8RG~a{5dkNoPaHvMnwt z^1Syt^X%Dq+sEgn#jsYXzUwxIEPrd!YZixEsmTV+8nS(5i&7&T#)5=v|qDt?GWUa+;lUj}Y zIOyDjJ@i92HSK1ERbbbcSCIKuv~__-vES{rEtl7|BMa!+)vc1bjGR!ltlJ7ZZ5Gqv zMjbgVZ@zBsM0b3>!LPWZZVG=;qJO7+Er8u{t)@IMYL9T9tgibPz8Rqdek80tvsKoo zt3Y`}Q^{KeHxf7C%@W(iMI(L4y29<`1JU3IUEf#RP0H*rqqmsosWJLiZf)%i_37!?4X>A#T&B(S1m+fk3vFdn!(vNC#8 zv&90-wwX@?!xyyPM%4#o%Tyl!JA9tLbf6XWh45`l3oXL2g~zO|G*5yvu0_$mel|BVC>^C0u{r?TrD$#$OaO{ zdY&sUx*p;if}KYrVQXc@w#7>m#v~J^i=pg>VnE<|r{UVk+Gm~< z9N6^6l<>U+THzP2_7z}E`+S>Ec0bdcDpi*(TEmArY6PSyT5k_k+k3LC`|fY^sj3JL2q65R`kWFD1lJ6yjRCS5Sm zAW5Jp#WxqQ-;I}O6u|y79iQfujz&3tu({&BIrYwib+5sw*Y620?I-C{gDEk3?P0cJUo^-X5H*7@!T6X?eaV5%36CR~p82Ak|T- z(6@N%P|<8ov2QSRu5!D-5}4(6&HoGpaNS%vRJUy4%2<_iUz$T<@re2wtF4HE&uA3sZ98LuC)yIvp9$Z8z^UTFM!#yz7F zPs(Ti1QFNS9AG(76fje{GA0*87iiEK%9rGIl!5t&qmUH&m!rT!gN#-hQQE>)}IPb3cGUO(;1g;-VeXxLxB$HADv*+0MqYr6jcE`(scv&Q~LsZ;NS z8Lvv?XzDMmJgx6diWi+{ECxOFY2gch&-AK_7+|;n`=_KEVZXPT4+5ic4$LJpZ(|Dg zp@<8mk8EPH60v0)GTy@fP#Q!nvtg>~2u6eX)5qzYgXz>N2pxv$Pr4z12)lk}zlvnP z)*nvHT_Ag9?)A#(rab-<4I`tGws7%zG_N>P|M&a` z>fCg|Z`hdJ9!RckN8v+t-Vx*-^Av&>f13_k)2p%ym)SZzp3DM*GZKaG!*zO)t%40R z-xtSX05?Y+l<`RTY7Z!;w9U5U$h(GzvCl)7-g5X99oV4?WI5g~QW? z^YOgT-ef=xBq|Z0vKB0+hpIY!cDvJbUb>Gxgvoc6%%tDi8qtA3gd-*=ZU2xmD3$ zLmyj**%qf*p_}x>L$=FZ_R&M1n48lX6{o9Cii)q{=rr8e}h!eQhfv36?Bq2+t^1w%Au%#O(<4!PryAeHpmM#YC=2;72 zU8cs(#T4?MuCtD-xDN$IQ>qn>`%tq&GS>djgmm)&noS&{t`hxbiK*XDM#k(q|LH)yVQRmHARYNyo2YkFJwS;aDu|FD*&)XzhleR3@obn`qen<|X zybRKaMR0<;}~`7?Fc5EJw4=Ik+0* zXh%Ord({plRf&r)FnHYE|48It<|{rj44 zF<_+g1Zum4{NJgP1OYa=_|Sg$qtj#~9?J31LI^}PAu@xO#y*7RRO=8%ZhoOP%b}6_ zAF7T1KjaJc|0G}hB(U=^@H#x^OTq$%`cU(gQ0bm$M_@81Lu@}@fDFijJjRtHzg^YGWVxOJ__>Fza`88)30xJj>$1x z=&m)9c@L32E?04j-QGXQBxLGK=!%K}3+L;VPV3zL@An{fM^~VT{>|qt+#LF;@1Xmn zGiAeMFh$1gUEI^h>tb_%#MEuQ+z)ecmk2Zwi1@-3yi!gTR6;q;fTct79Ny4%zY_fF z->Ph!ZQVcZnVe(b!@2aI@IA46ilcQ*7@#@P|Hf+2|0h<%VE474+mRLwf7{xAUcK{E zUV3^uyh>ZTF1?^{V3A=B6^u0*D6vQmn@-jk9wECP53{ZV&Wo&X-{;TtAxrcu-ShRV z(8i~jvDaz~No9owzG65Te?S|cR{(q2+_=6j4+WyYJQ`3JMi=-)*MukV9T_%p6deT2Sk$j%vlN<$V5#M;e2J z4D>}0f)8Hi$}@Oen9~iH%F0&3QC-FT{1u|M8M050HoulRZA-qfwSQH>1blMhNQYbR zi(cLzZgkgINWtOzvL$RZTx9MF(Pg3=1YbJaMYw&_21f= zBV=wz`}@nq&>!nqZM;itCcPJ#Npr#*a@5h(^qkH9H=lB*7C@PbLB;ffnDv3%e(qxJ z6EX+MM*1%Y@uM(5p*_5#APmhFIdChEDI2dETr+aJv(+WHA0LRg9&~50&7#de&bmRC zyQUv0bv$SQbe?$B@Z&O!CVb76hFhG?Oz$cjqOYT@7M5ue*{V9hYHqQg zvw~HVD@0&sq~R&)oI$9?H2LecWL#mLU*ZF>$mw<-20Of{))+D_L8Nv~^0Vq$Lm_PV zPs2V|`HCp1;TZWrGu^IEFyHaABn1!X8@L5fROvV#8Yt+|QB%6v<&#B4okf?OS+X5r z`tMvIchA0GvHYFQ&&tY*0T~fU=5dvp2^s!!Gy)EYF&>=+!}2f1dZJl-KrA$ChGO;_ z>VNVqH`~M>l;h2|T`dsQ4f$o`^iV#|s1Z;cV84V zuvjZ}3rNcNEdkZD-`3WvFj>j`JpHX-6U_0K`I@_)<}06&?qo&oii+BG#(`r9V9q9m zppb5t7Wt-~q@^4DCP^>bnXAnJVAG0cYQM@X#(sTSzY5xmhW+xzO44?D3$dd%S68+6 z9%% z83AQRlvaiTNogbm0pXIuAf3|PAYDT+F5vo^!wF?9Xmv(kv=(4w+;QP0i7*a8z~MosO1x7#@V~#Ucft5prRD?amVV=;3o% zrj#{kg*o48QtKdzc4vdl~y{ z60;wF@E*G>Pjds#+c#CSa!tqXV!7RjMABn7iqTkGU!p4?cx}?oi&?9_yJ78OVIViz zWF7`3G8lnlsByR;+hh50@2f<=lF1@&Xqx>k2LC2yO0(S9&ce{JsSl39@!Ogx#?KF+ z8dUwf;A;O5M+BaCgCfdHhUAA}6|{dJvyi%ZM=GR8+vML5u%|I-L9SC_g6#l)Jf-WU zxFJXX={YG0XGL=2mL~e0di{_8qhiX^>i3-U(C`?n7`;38iebloS&{vV+%khf0ewO`j1^VfltP-e9_YH zIY}l~kC2C$4g{=X#FR^@MZz4L55W8W^nYTl>T$qa?xza|hst=8bH5@HqF?E+$M(;{dzWgbJL_D-nvLG#Gsf~+0#rs0Gk7!NlCgYCbJ(ND{!KQ)jAIIBm_ zk8um`_RZw{EgmqQ4E=!-m=sAU{hZwtnT4UL{FEI;>&o_h;-`$9w9-0{P~feFQYau4 z5i0rhw)caYFk>3T^>6%FcZlqkpsC~m(1Cwy{p8g*YtgIgGS^3QYLB$tnD7zOt~yFD z*qLT#7*7EJAapB%4>C!k{ZbkC0j0Dm>@^<)Liq3197T0I_tu^#Rc+b_XnIW-8<`$Y zUMCf=raZUGlc%&oLFa>eFFca*d$vjE%Z2B{eYG#9M^8rRJ+>PB|2pMLKNf*Kw&hnT z$DOnNGqsO1JCtxq?t8XOSU;p$2+TzRg)~?biG${K&$5 z2`9#YW=*`xmOdMAGc8YLD+qD4YXW+!+98;k-9Zwl9stS~Nc?#Ah=-yj#n;=nyHp$- z^t*a)2cfO=hC&?ak>VAozw&XY^Ohp6%5RczdRpHP&Skw5yDy};;7qOFsJ4i);2|=x zHBhMLRI3YUM7__Q6DmfH_PE}7{-mvR=sd($jpM|X$ae3YHnoSlUmfv9Dgmr;3T0YH zU2Jr9HtjZj*QJ#=)q{FbxE1xR&oE&$8ytjwmh&efETdiQDG6cfkFtD?5sA1VNHafJ zp9Cd>VrBl!EEq&5hdjA*6V33ckreqlE%p&<{Y~TPtt&fMuPLT zfaGFxnYDqiR7;GD7~>^RPy$`KT%_~}m5y|{`e54@d?@AdE(zl57^$YfwTc#}p? zK&UE=L4AJn?CGbAH%aLd>RKX@NloJ71+ zdO4)P{+0UYJ*k0)IE+Afxuuzwy$}1P*$lW#3)@6;CT+C*$|G9B!DCxU4K+#9VMsF_ zc$Xu&Gr(QwzAE2GajH%&&r^-cqus9)77n?B#2^0L-jw8z3Mukx_eXD4I`CE#Qi+d^ zY%m!fy?SU&#)@xU;SwXtrLtaV6bz@@D69?IP>ib{S?{Gjspw_Oj%CaD(6Tnt{JlJR zwUQaB5iTg5vD(S0`#sYhtrS$Hi zEWL-Z&`?c30q^zc8WbyW40`S&xM0z+py~aSVi?49AI=7+w11-AO%l6eRrg?ZDa9vf zgMbA+jYp%|OVmAk=Q{Th{F#YPz?NoICHAE_}&QRw~Xi_=TCZDe$Li)tN?fG^1by^d@q&2M?pNfX6KsA> z)F9$lyzvFc8?>&DJ-nIDX&ZNWwRKIIUo&ZNiHg9*(-PcktT(7qqwLp-Tzh`@-Onc+ z0|BPCpCeWHH6h6hCO`Y#FPpFtFa_Z$g^#O_W)^lxM27KNF;Poyn5%_zb)P-^%B%Cb z*WBd_s9I!ZI0||=B36o=uR7oJd&=Xs!E@c?$XXSG>(_xe&S!{MoRf6jz# zXcuX+h%a)wV&g~H)M|)=(SW&`RE^I9pQ`D=n?fNI)!*0&@Ir>W|4a)TA1OCqaf$oo zXC8BQmjyVL7&HjJn=FdZcYbqQCU#EnR(QMaaT!M^>OdtOCx{Z=#BphKSM;;Rh5fIF zSU)@==uh4>S+!8WQ3Bz- zwB42!?WJYIr*EL1EI_l(H8y3tPutGDjtdpPoe)9`yMldXt#`|44=t~g0X!%}A5ltc zYR7#qZ~bMV9*w~La=W&5Aw~dPo||1&b2%D>65s@)jQ(0>`7{UU%y z{CgY##SQS6uQ ze9XneQG&yuaz3UxFn;H_uaM~89slsUnSFtKt8+xurz@Xy`Bj8cyzqgdgSQEMfdSbf z)*p-s$muz)^81+D#&iWJ3M8s9d+d|%-LnRd}YD}-5FsKId)9^eSE=(l&N1)^iR^4ybLfAyggd}6lTnb z_O{K~qUa@|XRdsGg;c6bF8NF-dvPY1QF>kW< zF2hu{D2#|OqtR1W9|5{IPVHH7Qjl;&u1!HDc}veh(|GKNcQrYm259q5-OM|$Sf)H( z7Odm=@GSC1P@!5FHS73yos-h+Z)_Q`T?(9hG~`fhob7@|Qj zr(^j-vOBh?yNL1JCV_VtZAPZS7t$BP92Jg!&oU6B3 z_((Mk9l(5yJ@oOa%XTisde)yiCp52aR}iN5ja{?sjv6 zGw~1{IlAaC({gDeI9Ig0w0G%TcDb$EklyUOuHh*jM2fGl%={Em08Ga3?vpt_F>~yX z)>mC5@)=n6?)?%eWU$H~zG3UK|JBR!qegZ~4sjIJDF0j{K}lzIuZ4H72Sf1jqP?Mijb|QCJ>2OK(CY@itXyi=48L&M zQ{FV3`fuavJ%|?VqOx>HO}WIHVm(&}fIs2Mt0B3>iNeoeq4G6ZJIjSMzJaoj1VUk> zR}r`-3*~zf00e^99B)8ol|8k2{Ag7xKZVTTmclq?kAW<6sTrRI`^sk19$?D)+$E34JMm|4i!V88snt6N0K zUCDn;TOxkbe%gqImDBHrq}rueA6Q>z?JO1|;ARfe<74O_x*XqfQh!}jh)-~|>)G-K zn_Vh|YIqVJDmfMx&%|WEg&0fX?`y!de>}vFzRAEST(8F}uZkGyBE;AT-Rg7P<%S&{ zwR;PqZxg!#^jyu?>OODXXUudP99K=fbzkV zT+rxhl+KXMb;VPJ?N{o4fznWVL}8xP(WMXx_`@QomIfNQ;_c)1nN04ZW6V!OCa!Qa zX<9++Ga?c^!nN$&Ilxq+f~xUdM#?08qnG$cvj=uG68@|}VnZ1|ZaU{iqZPuRLvSq$ zFfXWw)2Q$GI|Il&X-sxy*nw8Le%z0USWnjZ9GEYW|G0R~Qy0riqTg42W@a{4aPI20 z;rE_3Yg7Ul^)rrmQ66ZTJVDcG(1H6}Z02C>q21n{LY#&@t=-h;gb*ljbhMy?(b&B6 zs(JDf@3s|juGaIo2$Bi2k<9?Qyxf6+P$kRg#k8qo3q-=BJ8Q8MvSCz=jMVK3sy2OW zK9+B-r}B1gU)k;|A4z4N|MkEH+WCFhY41NB_LVQVsz`zTLH7|fxOB@=$} zwxTJP=}_d!rwAoZ8@96wCA>w0LR4HHSbB>m)ts0UPFY;+ArHuXo(r%ql87WSii8#K z!xcO!2??W|{KP4f5Hwf&PWo@Xo)fKb6*F~a9~DHos*WsYk}g(B+V>KycT^C0IR3>& z`3IV!nYld8NMiNW)OO~LYLuol-TY?D3XiQ`M;0J=mGhU=YDqCw4GJTAzu}#W1*6Ro z2ZVyapPvg!n|IRQ%2M}IOn=r>)K}eoDLJaFI(>N4;g3(h|BAO z-Tu(uI(*hL2t$Z+*wftAfX@cRag(NVwj>gpnkjwoBGeR~uMZ=i?GD?4Sou~?d|u)??C11OG0q3{GVIS@@0Pu}{hGpvh&5v%H*o+Z!MfVQ z8`I@HM;e+?eQz)^k50OONujgQXg_1CFQ6K#q;H_*Xdv=?hM#HhDY+(I3Uc?I z_AJ50%pAi}Tm5v>JH^BKX*RfYwy)@1jY+mDSb(K=uAPA#^edLnwh2Z~j*h4>e$#7l zEn_w#+S{2EZ`{+_wKiu zhMjuO7sIj$!~wc~I09-M-vO)95An_P`2M&WpDJr8-yyZ^l8;@ZGnXm`F0d?}r1hbw zsZM8QGekn8S1Et-$VEpNBo2~9eq7cV_=D8wB66^<>^-T#I5Y__B*?KiAKWe!fI#99ZG zJsCJN$Cmw%!E<-Tuof_679ZtV{`VQYl4cjR7%*(c(!`L7&G~vuMgj@^64Uqp7e4zk A4FCWD literal 0 HcmV?d00001 diff --git a/docs/assets/default-collection.png b/docs/assets/default-collection.png new file mode 100644 index 0000000000000000000000000000000000000000..56c9ae35fd36651902807a6ab0f002a56d0c1fe1 GIT binary patch literal 33451 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

6O(;YcGa%el= z!r)E$?|r>{er;V~Vk!s-`#uZlPn>k83gXWGJ{yxyd7SJDWi|VL2mep`#e)^9yZifH zPJb#W!`vd-+7Gy2`BbRUo*Cl3F7GXxmRgm)3=LTv@NUp|X&79lIdnb`{&r09DJJ3| zQ{8EwXk&4knX3N$1IHkf&spd&6uifxP}KMHm8qtcqm`F0HXTg8I$u&r=`|j1x?Ets zF3I`beT^+%>>Fk|HKe zXBx%bfFzMDKW2=iH;i4ysF3z(KYEcPU06OIs0Q!}_;5^DMTteVgIt3<(Da3nCWaJE zZ-*LI(GVt)7UIXGVXB*ol`X7~_8r6m1L(D)sjTuz1XdM%F&k*EY*JXIk{uSy(7-4|iC!)$rm6T-y zOl%Yq!$sv!ey!_GhFj(WpzS>`0+N0&T)PYqmIT!o50!-O?3mIaaKZT(@8QMytmhFD zh09e75j#43d)Y=!5Xl+@=FIEY0{D>!sDtkhgvh)ZxH8!s7xX?N))Bub-_?q+O;WMO^#9t2*&`TIgh)3h0+JXGE-K|_$ zEdb9{v4WkahjkYp*0ULQ!yhOA?1zRll#-oNcWE);Wqqj{4hzXThZlEVC9}y;{RpJO zQXg2ofi_-(H=3^$^oiIUTPfn<)rG@bds5+PAN5})4^9ljZX83Wk&}_xG?-!;7eu0h z@J*~?Akv2R$pLTR0T}|)V=lwk>#V>l1dR`Nx2;97>@L4y1&;=cVyzi-p{|M3(@_c% z>_F^w7HEGuS1tSoAd*hS+`uOz@NOKsg0l3je+GUp+Bj}|yQVcx^-x`M4jrg|M3_@a zH)yyT6dC?lPQ<^4(nZ4`)3oZ8wXuf(8xbGpBxBRHIS2(MIczl9a`EsXmfhpQ z@wvW+9MJ`@;@H&_v7CnKXA?UK<1(b-@@ zcyEz{+pivc#N7Id>XJR~-bw?G;595mK$?AAMei;4wO%6rF$YTg62x(LTxzErOw)JD z6+2sCwp`->^Dc<+nZ-OqAiJiQh8(%-2Vp*zz6R9p;vp@#yiNa+4v9U$!DPw5iZ50B zb}j0B-!BVM$~Que+Op%K_@-m@oze+XxGfgu)NbLu-$NB*G6NNUNgzj747?e z%83<+%JYFy@Fc`Jp4(|mtijj;UC%U#5EE9;gSs%`ejHdN7j%yc`vM0Pd!uj(QSb%q z+uPzF)$qT*vCrMc>LOXkh%D?D6hb==i;Z8Z_rKGN_nbr+$Do?akPHAG#f4XMkf~HQ zP=_h(5fQ08dTsR-u{}=RE!j6R8Am+lSQJ0I9}y>t!Nsyf$v_Mlx}y%*!B5-4g~$*h z)TSb=z0X7J@M`Jj(IUqZ)A1cA+3!vs@}#FD)>7N_&dEa#cNwNa1nH0n0>pz1L*T(I z6$pXhmtJL;nQkUs1Qv}Ex)uZ3&G(0tfu26dNKZ*d(n2mDKaGsVoaMm^@sJD~5S5cv zJcSaf%w%^tAs3PnEcKo+@24CHY6L>7%YHru@g~5|uV$qb?gP_uBt!NA%p6?azL_8R zsUJDtZ{=V|bEbWBR(x~UBKIw{=1!;Qq{m=RB7iLlzL$%rq@oS$;D&Ta1ruyYMrCnh z?CV7A=^Th32O7%(m>jqs2h8H&`Z>6t93j6vv4eR#PvH@$Jose}Rw_?iDqmhbA5xzO zKb0?cIZve@PnyoxS^%tPG3Q!`27V8Ci zeuXxE1wwgwzi#4xTjJxmnS>Cq_o<7%QWqc75Ps7a+x0L7pYdo<>#z**{SR#q9JG?cBJ{0Jrtu|CWH;?hl8R-IjpcDREl@ZUa3L zyfPlMJ^2*Y)pFmKfV$dr9A;YxZo@#Lg1p(bw%blwFxbv*7>I()YzL2R9=J{auvo%2 z4BQSU+Y)eF3&N0+$$m*Fq{KE4yqo-vAZv;ik`Y2HY>&)wLJHd$P><}nO$F7}9L3Oz zHK`xBZJ?&QD;`G-w=Kfp2#uLv#Bju9c8R#C@-_*?;pCHil4{eo(!9^yO?kH+o;B4S zBi&-ogq#kKj7JN}2_fY&d=j@YpfF6%%p}m(IwBzO^mf1wVVtec`e;c#uoJA{q)Xq% zfMjiVG-#(FtV0ATkH#qI>AJDbUiL7JEQ%YAK9YGX_CkI7XCJRP9bGR;gpx8y#@#K} z-}j^j$mGzu`K_+cX5z!8`y#d-HhP##M6p~FwAbb31eX^eab`p!$3>K7aq*6}_u6)?GgmNOJr89lT zAocXLGAk9EocIS=ysU|&*%iC=t7iufx#z`ON8e1D+@^vn*~107rQ0?z>o8YW&cTGZ zR}!ywpEGZcH96ydpQ3H`2$MIJ+`V9l^x61F|y*vZzSM6Q{>?KTNKz9V4saKkma+Kcgm;8}{D@u!;;};xS4Ng}yP19hnkhp=K1N|E~cA zs{{6ZU~0xy3UsA{kav41Sq7;Shp!c9O6?N)G+3Q~fXK=ajo)1NAP7ln?Lp?)-Oym( z^#g??AzXVymWRq7R{#GofI5~6@Ks>M6vdppiUaY#T&c72X%CY7^n-6u)BXV5X&#i& zT4yKw0j}|Rmx%5di`@~sC*gD1YVr+R2wgGVzGFZtbgJ}!89@2;SEKq=CKUeBN&*N@ zR?%Oadf41gB?>)fWfUide7&&hZhWi|%~etpNs<*Pv_APg&F@t}X$kYRIQ`v)(w@RR zv73e|C*RG#c=k*nh;lwaH~vB>Wa$B2oOY;;;;NM-%_|(ko(7nma2Y2C-MVb)6C9r_ zCBB&EkyDJ12(` zjMkS5=r;ZP;8--0tGX2l0^;!fp%|+QY}Yh`(Zhpr0Map4f5^f8c?v!E4vrv#yQV9x zM&y(U;$Xu*ybOg3XKF)&F3}Sq=CmrR6!Kw&t;a=fp?crimx99Lh&$_*CG5g|c@{X& za5B7`EDzXV4Q%d=73<;26<`4#lawQCkVCb?i&%)&4jkfekonT@Y{M_YnS|?0L=n6q zq52-xQQ26e@rt-&MANKO!&~a*cp?WM!do5_n@D`Q{&21Gu1@8BWQ7VqMs{V>YGo@b zs2WyE91Soic|?naG!OzBnP6trW&XSSv{PW}PzOXRTM77z`{K$~9O4#siRA6TX7z@K z+V4A8Ou{Dsf%?4!Q#6>{2WCzC=mKk|TU5f!mJh>b-#2#!-UgS!biiL>RQZ>oXib@CuR!|UWQ#au!}`s#1l!A=!)|GOOx4n zrD6=YlIp)p5Lzn^*-`QNMas_T9}A@*g7ssdEo4M>-U0GJLVDomhqk^%a&j6jW~iBZ zltJ?4LE6DoVk@Oix*GF&-`cqb`Ty(*r8C^o4d>JQwg=s?!(SnOm{A49lw13Io$t9em`}d z(5P+CNGWjGcU@08E7(5-EDHy>rE^Kr3Z%5dX>qrgL5lHUbskkdMCY9!pDkIKUnYJ7 z$s!NM>WK9@F`4?G4P6M&r?P0^WIVz%B5s@ea=QK}5v&KYi!L&Hsc#Zs{)T;wyHt1i2YPxZ2c?`t z9f5w@P&L>2Pt**zKPEa_dpMnZ!FxaiKLZ8)=}ZUsD9nPpUCqOP%JD*Bw6wOM@_3Mv z(Y+wt>gxGak(auA2h;VVl{;92yd3b)?ZnJOh8Csny3#sN-P4LtxC5kv4Q{ywZD4J<{Pw;^-jaY-nozQ;H@yC1qmrnCtO9GvN{=4*H!fT zYps7^kKtTA{#t@NfkoPYv*$fvAXh+wgnEOY`I&CvBCe~?Y+a2 zivPd=Gnj&UFb8hjGsTT7!I5S|%!ZW}jub14w35u~FjO2FmL;hbWrH@AnWYtKDK?C@ zZEVt}ZId70&-ZuV*YA5@_us$&xZnc4^qlkNyxz~p<9T8lv{e+cO>+0C-Q6JcMCID%vp_0H%pvg=a>?9Yne3ioTqCd8|Q#yFo8p-#>b>P zJ2?1Qi|Fw*HSmUYKN{Km*ar9+J1ZagT=_fJRXi|RDcp~5XgZV5EZ=sM`MiCPh{146 z+dq_%QcW{~<#Sj3B~rSrh32y1z}eL{$(RK3^HDM6f=-g;-pILd;T;jJopuEw0qSY^ z7#EbVweGam)!uflT{FRaBcwL9bl+gtV>^Cf1n6t;K8O#(VR@|3qabUA@6^`RCr`bY zl;#8S_-D-7AHGh~#oL!<-1Qk? zMkyX9ME|-jeR*vvkM20T{FCY0n)baBR|`+EwITh(Dr)rPH&a{Ac!Z2Qd0^(%H#53^ z-B#A0JXA3G?d%7??sN{FJW_h~?Y!T=?yAf>lvR`8<=FooR!`|T-gNa{e)R8qn);6R zeUslWob&ts@K8s`sjKgotp5E#Yj&!0VDg9JmfsI`Q%;?^d-cQ0uHTRJ^{2XDP5xN+ z;P>NGX0v6-Yd)?$dS+e4apL)mjjcla?j>ZO&dFxm^TpoXp~wz(pKZXW9n)StwKBZi zW9Q_#J~zwt?oY-*!x;Vgf``uuhEr1pxi@v#dZ+zI2 zu=U5Qa%ct41TV{tE8BOReLrtQ*WUBA(shec%o_Ru+_)PRXKvbG4$zcXr%r{>8`jVS z=Syq>I)9_(WBq4bw{}8t%|L?F*<+leN~WjEdUVvW~La-0VeSi%yb4uS!VxE{BE!`xb0IDzO;p|18zO}oT?me ze**yindg1P1!3=cO}V#^of%QyEob0Iu-z*2#{&>Dk_{bO`?m)Va0E}PFm?>e(PX}D zI#DJxCuOgpfWk^Tx^)@~3j}}$4=Bx`V`drv;38|GWh90~gj+@m>@$TvJNS%ysGAm6G8)0D6`e}XR;A@Y%M2GY$V z^8tXbsl*+tgajt%RFwt+?ja2sM5_jsRjas^2?Sudl)}-8p==ONUju0TG|56@kOXH4 zS_3VED@rRU0?GH}>M<$nCr0dk`I4x1KPjI#r ziBB;p<_lVL%%C12;ktkbR$HVK?7js&_c{-N_-&BIOirUcWZ@G=~WL)l={AR8vAyb&p5-S?E57oACp6ylmr z^Aye6-cxJ0OY8fj8z1gN4!etiUVMQJ`OMhhly3fwhfFu{H&FK@e>#yly7DCeP=wY^ z<~LAWP~0*sWh=$98nK?`H_IEL@sS@X^^S!sXIqMKA9Xj4QmotfFIx}?0N135mPR=z zK?Dp6>9shTj-}YvQDJ~!Qw|a6;?$O?eHJh%>pHhkSmfz4oVz!A#F(N{ZMc*y z1>~DX6&AA2MyK?Kn-RG7*Xwqv8`f8|a#IB83G?@OQFJkR#Ae2s0;CH7PK~oi#d82q*kX$0n2uM?v8#|-hD;Lq7`#(qvBHNUu11a&%kV)pgrNE!pH|5}#8M~Z z@sR=gR%iqYiA1j1Ze#b>J2z}`O|RIqwR z;^<46Ll6!bW-4$EyE1^vp$ObGm4w>dl)QC+{uz7jB_!Ac7}Sc2q9}3t)~&AM1%=xj z)O?fdX37YzO?M!3R6>&}1_{7)bdQ``Q&wP+(Y(E>2FdoNc-YnZlwns#teG*p`pWF> zEzS1Zq9`2I%*=@9*RuLXR1hv}OUuFhEZi4*Zv&;r3`!@ZF9dHfkP+{lce%UBlm>}b zIwspRAHlTy5HrpomuC9;mMK<6;zn%ipGP9kt6SjJNC8b)?~Ayqkx?y<^!w0q%31IQ;luuv{@-HEI3>V&}4?mKZ|`pyQw(-wsmX$w!i7M>ymm1iRR zmie9(zHRdmoNlcxD*dtgP-$5TuWC$C?cwOIBYw3VtGn83%P0+9Cs%i!``y(!v5S2D zVAVmS-p?a!QEb_%?kip0xy{HmdyBc6?pw9s_2`Z@v(H{xeHPbqb~w8GzTs^*dF1RP zd&-F4xnI7N=YGhm2M0Zlof{iu{#!cX9|wuE+r2+}iD~d!;&tNV<46Jx`O{?)OJ9p6 z1Nd^4MbCM%zv^TU$n&B&(0iaB(5k!#;Pi}H++)(yLv8JGcIYMb^f=X7c#wN>tX}G& zULXHn&mN;F1%h1q0A^oks|7u#FDk1qx~|W4abI+KpXZ-G*26w`R*!diFUjRXV0UkE zPjBiUD>5sU%(^K1YPlK?`~<F9JV%Vrt36!Q%O(TF#xcm4&gMNzh(X3)3g5sHEaQQpa3fVPf#N^I>#u{8W)or6P4}Z zmKYv3J2pBuK8_m`lM@k^70)a%j-g_r<}=4FAQ0@sLyfQIjf>8Sjmi!;z8Y7+VsafF zSh3OBQH*(>Ziz+>*SMHGW^7L2*o^SdED!g@xY)dCMm8gS?zq^T@X+ZO*#>{#DRI#` zAwkobaSOhF`4=}XCoU#Oum2Ggm=WM-e0vUSTz*VUZe;j;M#QYC?2@3snbFaln3(xL ze*BAyoE;iGJ0vJGDq_aC*!-wi<1atm7zc@o&e7>UJ$v?nM09xf?(4^oe;l0?jvwoJ z`}QYm+`QP>`EgMTK7IQ8;luaGk6*8^-4+u)=i9em`}TH3gw1{bezdW1_qT8V`qKX0 zxubpa`g>St=I75pU%b%&&h4T(#&~&7jEl)iP04-x_De|Mbb0`LTE+?%Gk4y+vY$Wy zojiHr;lo#_Fug1yTn~d3-{)Fxvnl(cT&Grub~J7}`0CZ@$`#eel$Q;;eY~ZWo<8x4z5R1$ zt)4q)Z9Hq5m6>~B0BgyTwKs2m+$dEJs$W2m<(%0I4_NTTWbV<@yUSew! zp=g!Qz8Mi~lrbM(&p1p6)A(j*WDCzW(RmAl8c*asMy+~lqT1WS1VK&_|0Ag3`Nw+l ze;Kr}<0SuO&=QXi_`evmx*5y<4}+E^pS!Q8c-;RsXf>ox^wm56FN4+_)gIchS+`O* z9=!eE2CeVAJH?f_55My1%@O|4sW40R;=4PI&#uXFK5ZPqyT%gLN)PH&U z{aN+(R=$v&ka_RF3|do~mz|h&X#0N*TFW&<6#%=?c)%V(E0;j2sJ=CQf|F=#E7 zoMaiCj0UY`PkQk$?{xm@G#a$pYOmmLY+EiJJi6$~&^FFW(UYzXhSss?x_^Fw&c?gX zZ;V9;97e|EWgUzB^?P*9gTT4bd;f?HFTAv9)BEIfzGnY;t&kk!=RI6bpf zV3}=X-R!37Myk?W2u~&MTewfFz4t1f*7$emp4QU)y`R;E-r+u5&v>bLRv+_S_iO_b z=kr{eXkGYUL5=;-H%|KR>6y=q#%VJOUu@3I-~VDu*2>o}nmCm{FJ*aK3SVyJ?%n^g zd2z?h{{%G(Uv1;R-2ZBO`S;hacAz+4om_0aP`6X!c|bA!hW~9{TkZG*+bE4Q z7Vf8*bJ~p4vxN(H?v__pnz7m}#OnQuy=4nsp0~ewbMX0BgCK>v^G<5>nC+OSgS0}V zvG=G7_j?htru+DnV`|smsj(NA3)m)Rtb@{aV*2mJ?ZZ=AicUJsI@oZ^MzE-%^FqVK zhSQXtq=qx*$LtSx{oKz0PjGD>n(HN_Usx=dNS*JG3BtL(Tb6GU@=kfdJ!A2*ew$~;LpqCte99lj-?((G1xEu*<`Ni>WXG;nL{Y|+y;n*Tv;KEj= zU~v4iLnn?-W5pETwIDT~WG-Cv_hHP#Wu~PU0ww7KW7N+L%boXN%+V@j^-}@Mmo7^G5dS> z3CGg+>&MJ5|K657trK6hddI)d%fb!4#7^$hi2>(iCsa?8@aKZR%VE{|?*nsoBw!dS z4OUs+KE`o$c%ZxDVqH-LqsOfgsYyQs5%W~ex9hCC3|FtLdz;_{jd{v?Uwy4`Su}05 zeP0aj$o^Fjp_ix;Nb=taNTnM2)!>z}*1dm&|ouFUi1wh?k* zC(C4>7WVLWsk%M!-lar*Od%1F$hue`CS^8Q1yHyI%WU0{Ix(b2pPfIamc~pppfD^1x^LYIk2v;}O;Z zme^-oa{bi$BkgYQhPE)buF`Dr@y`yR6fi3uPR%J`Y`3k)1LpjUO|Sr@CnQ|aQNPrx zyLWkfYYJVm^8LCKEsqEjtNR1POPUtWdDeG)&~UY5kEZa>q~~f?2@nPGFAk_Xi)Y8e9xX zOWVbQ`=}(ncCFNP{$Gdm=`yv)jF4RgNpI?%R*9YvIrzn@ktoOeLsJ%-t=3&W2;Gcg zUa8Jd#KyjPWRX0hVRooX=d?u|j7Csvg`B1n38+&55tJB@6pi)|@2v@nnU|=%2p>)$ z9B61ApVw03k$)Z7}gn>FU} zXp)~)TjenIC>OGq4M_$v1kx@3ENZiD$K|;pU$39avBkuf(;U6Xu84qo0a}7bon#;+ z*7iA#O3BWx0=&;KdVboLLwP}$VLCu3L+`GFeH<7!g)TThs9oxtsUj^=id_zAF=?GW zRzrGRbI*v`YFQt?ze)Tf>8U9{W4>EJP)*>U$yP@h7hLm|wO=mg*k0@GAA2sSK9-(4 z=40nT^vh%Q%gE22ZBF;ceh=EX;Yv<9E6>hqurdc1{Nfb~0CoTiG_f!aFcKWrTO>Di zWtpu&1>iScRotB``Rh6p430QC+8QTEqwd}V_(LI>cUNAG`w@AqcrUQ+?<8*YtDhQ4 zK#v-A};6)a2RM5IG8ACW8ds>FYT8iG41Bz?}CB-tjMVe?lxb^6o0l z_WqJXrpz~)ep-00bcG`9?CWVa%Wm=iq5GH4Etp)}d`CUw+x7@Y9dl{ft&{V<9g4iV zIJf1O=EU}IN2^otb{lltr-;@vDzoE3EGaS>+6Ws&0rG~wkI$qTur=nq! z#jpd-JdzP0#aRF@AZ$qaNrn)#(VPa-OMhM(qx#(ZAO;96Jw2Fyq`39kpO^mEPG7DX z_jLz6SC{DZiws?_pUU|An%&eF(+r5gcG~OAYf;4GL*I_9-u9MB=(&A<%J<_ff8TM_ zy6)c{`rgs?_x-$6Mj=&R8{YD%mE-)xuipc3c!UOy0m`lt=@^LcPak34^P~zL?T`NV zNm`KP+s^!XY35_h!%>VG*KE~=kaJ(;=CMOTv|l$`{(V)XoqaR&+OIoZ|6W=FJ^Ofh zrQOl-A8piUKajMjD&p~vqvmVhcq|n@wKt3&8%;Dbqy2dqvHj=JhI3!{rTu*~XUB_U zJN~X;xZ{VrZtah?r7;Hm(RFK{Ivf5B&L8))#r*HLF2i5_hIL;~IJ5;{@xF#5R)I6iY->D@Iy_pSS51NeFI|235XRKP@y z!kOi>IglF{GRD{U{t!e&0H8v+(-@M%i`EYagC#;m#PVCGiUSB`h+@r(2*Hn;0-6@E zWs58C@{_&GY^cD5lr@KL^V6t8Pa1w&X1N!29fl4i$v{)KIQ*`->XZniK^sn0DE3t( z4OiH5N=#||{82u~yKEU_&F+rMtI3uAKPr3gt}P*yeZ{+fuUh>R54oyHOXf#&d6KrEej zo@44NNAK8@&vQtw!1`bV1GqJ-q*W(yU;=oy=#?$tK*zlG;rr7X)HLE$pe8(GM>l)N zK0WxJQ(g>g9m9FT~2Qy9;oiA-Y)fSB$WXcbX*N>L6rtKkA@9XNiH%r zEj(R!ovQUQu|mqy(Zv2SaF2_}xlkCOvjW*nE-5R%d+Y$}eGl9M!~7A-DY zCU@An$>q#es!rmh$NA9+QVw8T1T!vy&a3K}1$&THXwaY};O?q{pKb!lI-fzfjE6}# z$Z>8cY>R?)24JQHVpK*78ka$@hE@E{_hDHXsU@nqA{ipl+gxanD{VjP6`*K75K5~y zQ}JyWfIAat{8e0Ws#sA57at(ipjF;YfC~@qP(lhhVG6ruOR3pgmDziaoFOeX(;B61 zkTDT8F$Hj!^FwJ+9R1)6#lA=PD;TPEL1^*qD8NNiL8Z6NECs?iKp-2Ru7n(-01M{M zN0+K+XC8jv1eh_6hZU5iUS|}rV3=j@OtG5=aFGK3nq5h3+&&fTE(OyV{6}R#sIt<9 zu5@A?UBbi(<#4$c9$U2umP1S?9H$3QDxrzZV5hgTwY6ZnXi9Mzw)T@#N+b68mrvijy*-XnJ*vS_rk^vW5@4 zFn8bnC3CiKe;Emz(cw@naIP7<`~dJm2bk)Q29K78+^?k2;O!Ik!w)LP4hR$UFjapd zvKF2iee(8TF#{oBwW6?Mg_V(jwZlqzP&EgR)W9PXfLH)_W0MxKvB!CEEP|QDKa+9> zw_0;10>QX4AvXjQ3xF|F0;+;zG{xcwSp)}*8t;r$n~E5G9GzfGgKT9R{Mj%Hko?$K z?!ppxHoS^Wyl03e3)nTqz=|oSYH%{}Yzv+%#YND&UofB;Es-lF#AvXsP2iDeC{~K& z(h0H3N}~LHtm^!BfZ)c1JMCa^6}VCZXn02*E`b*89#<92(w|(V!S23X2QtA34R)1r zU7|tW8r9xtXt3+QAlpK;sf3N2O2hf1IAazrl)gVy1Dl~Z6aeLlgD?#q!-1R7JJuIqSv1@UEmR^Wc=5XW zCW76Iw!T>nyD@ z=SOVM$1=~aVgvpY_H{0tPM>8>{1N^O|`%Ka$w&~}GrrijD7>p~>dg4pzm1e-Cnh7}YddF&pEVAHcBWbbN z^c?esuAIDG3gQtMgTgX7`Q<~CW-U3~`2VCs*A888=8!}H#*#@&(qqdwB>G>{OBKmP zb;M0i9^#oE(3qU26AS6!*jk8HbRmT-vYCEno-9Z+6bB?aBs z_|rVoW+~|fr9)(m6s##QJfz@@rl;-+)<{k&u_n61cRGRKT%FPqlM;aNrh7UDJ52@-&H~*IIShF zq7xR&M;tzk2zf*<4;qle3mma)QIj++bYF#;qyf5_#>Yy2)BSHcds40WR(UW zBCrE6$KoA47KK)_p&pLzjQ(kg6q~BTxN4vb6+Tf3&8Lkdq2xvl)|8D`>M?6R;IpLI z`$`~|Nj%8LEJHCuE&iYqI-nx0nMg{PVgu?;@@!2sm!U{HAYOIB=K*9vKemgFQO_ft zb;2&7o8-xXa4kNKhh6&*8^t4ujEX50ZnK6kQ;AuNzB!}8-KS$`PXJ62a+8Koq%=85 zBdkYFifC9blo*9#WKziGGTibH(+CifP)vEf$yz#o8iH@sE4tXkHVq+>M!c_qSE?jt z9AFpIWF8N*o^DcvV)jX)XbwDVn21?RH#zy3a7_w^F^NS=D3SikA`LT#y>GkRbfzAo zU>i?bcs+_cR%85*v790W+&O?4!9EKhv}xWhWka@7{HMpS+Vt32N^G|l?9gKt=&^Qo zeI=X^dr?!@&mxl}t)~Z0FPe`Tq?4a8@n?BhF$c&6$Tf0Ol-9(kB)txhGc=>(IFl$j zruzKoBt5iGkDX6{d{b|l$-^Y0L>wDl%EJ^%O>fdouX9YMwE}e!K$sq{VB$-Sm)-$B z9=W$0#XM%i-@IR*KL0y}SzfF(A4SdA=z$wNvqQt!J1T4v$K)!Vtdjqd{w3$lBh}DN zOWD}71{BlJ)Xi7Et>XQvQktYGiF796pA+^L-Ly|>dQgikW5e_TFn;~fE!&l2q=XY3 zlRi2bpqNgi*jzcoL@vI#ba;xYaz*fpg5>5Ueox))!{2FIy#`{~zQ-35ojEtd%fJO5 z=7+4-(!PJ#2)>CwGlGKyFB{4(86G7*XoNTlWv~ zH?hPm`87`uoe{pd9+8x{_lg8zzP}F;Ehd4uca61?_s}HxWp2&BIex>#zts!s@ZI4X+oU~=*J@$grn?0c_4AVksint`2hSo{xQOgTtyKY90M`x!$ zXOGWcmNm^Tq*_AqsjB~af8%@WeR1Z%!+{<14Qv1X{cFI}nIPU>$%OIca_LMlFR#Hp z0HwzVl_?j*#y(7WCMwuMgKF)f)U*w$cZQ$sBd}GRIy1YJ-4>2nTX$7hv(Y~Cx9xOK zY#NvPd}D<%h-2yflzw5oPo`Xeg2TNWe9~T|M_@f11wf0ANP4Aq+voU+13YKB)+}B~ zLpM*Gq;a(#+fMarx(Y~d0mQ;=d{3wCXEqW|oz zy%MFBizdoBZKU`bxzLQ9OWnD}!>)R_0AQ$rX73r&-U|dz8Cqq}SF6aL9h#mNi@myu z(x|Ci*Y$R(oL!h~=}5duP_XhTW~P*BzT0hlLkiY}!`ijQk-kbOnHxjc4LZjQgcSQ= znxF!=^37{6{1O$G=sG3R%_73P`e{wN7Oiab2rtaX*jE0^TG+%~rk%TX?<4s;q} zVXgMkF+lWlB%>q#>EG+A)>O!EmLKLbDJ<=7_fLQ4K#2Q5;MG1$LH&&rRmS zpBhXf&LAw&+#}p)6oSzZ9jV*>wpXUFTa~@b=Zu=^HT4K@kJ#B^SlhTq_UUC!AUQ~E z>HeLWyfti8`jUA$a3H4SYQ*^%7M;4B9#34Q(2(*UW}>*z`;s#lBq^)U$~lVLL-exa zW(%!XuyaiA7nb+vgJly~l|(3gmj~HSez$gFKDfJzkY^O9dEB<6i9B&NdkSbN@Sobfz`nDmDY8RE+Yv4NRJkED_q?XwG{sH^w0_xO4xY5^{a3*-gW zhVwzv5<14$NhG4mk7n_xJ?_g9>{1P6ll-vH<~~B4$2nk9kRpP|^GNRU9Hc`Ixfufq z790+yOqXQq6eI*gv+=smM3Zl(0K2@!xwcFJ29l1k4|OGV(3wQxG3be`haSL5AZk&_ zjw7^8qhZYBnL@i^Rl!zb4?vJsJ|{wmshVYGfk4rjEK9aG9JWvcm}P=vO4Pmn@@3*+ z2ZJlj;PjX^GO;XbPIIDMG3R7p%T&>M$Qz4y__?qDNGE&EtU*`D&>yfQEC@jSvp<6U}dM zDsCrT1!xP?->nrwmW*uZ^cc#=m2@}l-w{FyGTuf;bJH&#X$q5zowJN*;-p^O40aFF zdCS@&kp|Y0nWH!roG*Ra8moIc+krWKs>2B4lLDK)JmvX&Mqb*ry}@{VB-?|?Cfs#EH3Oa9#=wJ zgo#=aUSmDJGI3L6EP%QdkQ`nBY`UOw_uC(oqPBu3odq4UGz8{z)N~f1!dz@ojc>4%uzt(hW{`?4C#;p}Y_=Nd?$gB)XX!Np=pAqOUK&{>Civ3ohQ$BbuJ zO=N?lsi=^qMm51HEbHmKCkcLM^21Nvy9%Uegm#VT*O#?VDPkuKaXIjv>pj3qH8XWV za)xE0^~zM4&%{NTy@3P~eiA#~Y6eZh&Q_T;$j5uvD~0pfu11rcYMt>W##+kEVHc4w z%wv_QQUTyHkA$0c7B^CZ!c^*_zaMPs|6F`MCUTTzD&v@Ve08lAdkef8cZyQ!EKCBu z%}J^>2?kbL`{;m`egd)SN+tP0C(G^%wRJi*{`fsn|MaOB1rHnK_OrYp>!_fQ4E{Z` zrZds{fJTJv^Z-mP1!E1zc@3*<99$;>6Sgizgh-}~Wk9Cf>9~r(lmJE*drv?o50mXJ zuPb<7owmFhoC9c(4CC6ym)2U{au$M;HvW-A5NemoY{Z4@L4nGctI=p^rxMJ8Ih2nmS*0Z%L2*z`^~ zHc^OiCzP4xsCuS52$1sN+)H=#Rh&-1DtC%3Xo|Kj^!&YVN2|^X0-_4mFKKU^DNEQs zoo;}}%@>%>l?n*J$S&3?xqw*+*pBb%qR!Qf&tk?0udElOh@TSI^63t~Jk(+owG(Fc zjExDJ^xDA)yYZ<+abfJvtf#~l225(ET>&!7yaTj-^i1SRR@3IYzkXvJqyj7twHpRA zxR^k+B4!wk(2BLV+KWbRwqzkDvw3N|Mq6(!FKrgC@ z%?Zrqf#Yc+KneAs!r6#}ZOV~A9X2&Z;H(9(N^lx)higlm6%QLY425!yR*dsLVjz_# zxbRs3N(D|x#rSMo7!x{p8FkJ??RXVWgE666p@(s5sqY*2wa+o77Uss-jiQ9ijRd(D zSPO;8LA}5)OkwzmukDOoe>~*j z&9fA3h__s1VN_gF#i??kVYWm}mZ3NqV7JvTPNA-C1ttZH;%GuIzM7~5?IprsxrnSn zEp=dj3owfVdv{`(Diq;%o3>$@GOz4kr_DPDN)CYzguQQOwawxSAD*a|zdb+q?a9A| zsJUeD1tRjLTBIOwy7t&yp2#sp5JfjX(IX~5WJaq3=4w0oiosrWiYFK2O~86mg#;C9 zN4KJephTsJhExbH;|QoIL|=(K6xeAmgv&7@TscK&^s7N-r=cRb;DrRBXhDkPifgAZ zgAdy3EyC%sVmINuPHCSzoXIc`PO%_ss-<59M6NJERpF+EHgGCv@}`1pC{zL)j6c=1 z1%y?FkkXSK~#`33@+%b zk5Y?V8PH6f&{^Bl`4CFrf|;EV)Fyb?bA^{@_R~U8pvB&6tH6lwcdM-QO zS|V0{5~VQM(-WYnIx$Bt98VR$(P3{t5Z$p?yLjBFsR^k&5L+LG3s8kPDS&Mfk#Q3@ zf-5jFevT_Por^M4#4JJ>Lnq{3xq(APtQ2uWR*k_GsUWIFOERGVwkLxRv-!9*8Jf%y z`?H10h21b$xP(@br4~{2k#llIeuN626u@ZzrZCWi!`P%XW?9i=jtf(PL*ODFE{uSI zjBh_+oL33w$b}4**h~S>N6a!9;3RKh;HYo=J2YK~&A5OGP@Ks{;WPl7#~033Zz6C6 zy2bGKVbGQXh0w%%v~ZdplTO3p|B8H4K=N|Ie43ag!DR78QNscst;kCY6);84N?9iwGDBS3u@hPUI>BP&hrk_We5{hgLB|;*m}QI@>BZ zd7?z6h)Kmn>xY>M6>i?bd8%Mr>O}@k=%=fUp&3Oa;LKqGCspLAfHPHf778@oHqnM% z!2vLyYeAjF9B?6Rt^*Ze47>M{*RuGhX~K-m0yS5@1)Y*tjcV>jS1}Dh&R5A-Noyv$cVu zo%`gkaN{3%)+p@F6*(Ll@2IQDMMF7U%mlvh**C~Mq{5CMz);cWZrCZA;Ey~3MvGG9 zVt=hTfsW3K--%(&pT~Yuq=&VbsKLU=t~%D!xS=@q99$eudc#PEgUO@ zC(wq2h6NcCp}!n*^%i}0-A>hGqB1Ln{|X(?J+ee9Ki`1Or6B(sJV638>435J!&@U* zm?er-3GYqX>c@ZrX(LuV@C;#pawqxvCCCtf7+Zxz6pnDR44%RR-@U+i=m6WdITm|` zemudPOaRh5ndzV+qb@}w3SonkskL+O8)xotoF+kQuadhbH<$mF@=uiAsCxX(GMhe^eyWAp(2cVEKCc{Ou;;zCO)SY z1~P?SjKhJ<0Y^P<_Mniw9Grq;nQ{S00G(vwdpV*I9_qj_t`2uQTVKpWja@a^gc)FL zCe{&!TnWM9fH*{noxl|Z{T7DNLp-FIaK_x*FJ7(1A$N?!+d&{(CCp%B?C4D_DHO}8 zwBzhI(}RX2DHKJ(dJJPyhQTch1xL5)YF>(xrC1+^kioz#;h12zwMZ?Bvv?xJ> zgAc=d?!f*k=p=5jKY&TNSK-SM#g4)WDV3Au;(LXlGas{b7!$74&83MPM?s2yod2+B z4zFVJFzy!9xRU{;$^nZ}0a=BK9j-`W3UEMW!Z2ngdvV5S<=$fggK@9pyxHQ%{ldv~ z@wo8!%Iy!A-5YhuwE!boS8^SK3A;6X(28`wG4>n|)dm95`B1<}8E`^fU zVuDanXbR}0gw14VkTrh0&)6s?Z| zLKuROPH>H@FaaR)_gWa1*Y=v6RQLhwgaKpj?naA2nrHpkgK!SR3{AO zf+12TGAG8GCo&xd)3~TjCrDu*q(=bzTtPG1N~)A4j*ejnOzA%>u8k&LbRy6JSSh4B z2km(I)k%*ArHCwaf<$M4kpiYOvcvSCr+n$uLy&u&*p6>J(uB5DXqL2M;SY3w6===? z3Dh8KuGW$Rj$0>KzZivSV1#;S`15Cv0xBqez=yss+ z=xKnyX{t9i(i=NQQpL*@Pt%`#I#ck{S%@eAGup9Vumr|WW60<#mIT1N@)T?r3?9PA zi`mEIco)~ijuq)Hlx!j3a6{oe>$p&~(Zo^d&Z8%$;z7Ct70E$sh+`d62!kU`bR%px zNt#|fUbxX8%^@IT5^e%kq$z~!p)6r&VW!Mo5j-Affju>o_Ct$MOxCduwxDO<-6OuR zl)!1KxDT%UvDb9sF0itZZ*M?GH9cw89v-vh5>{WowfFRe{u(0wAjXV$L#>kc?yNJJ zQ}UeKE6m&EkY$^&zQ^6PW*3iIumuqvd=qM=RZEpkV%U1jfdicNP*RnNcjg5ha-$Tb z@-m;(C~dpQmiYQoSu88*hc)#b;{q*wq>hzS2XH_Bi~TeD`PI#%OAX`x{rUCd%Qb^s z;}_33o?>C+zKkQlGH8_fD@~;ULdgkpnURvtA0dZ0(E3a_HBzu1F=|U|v4xEL6o3<{ z*`o42o!PZ!WS;AK?;&muV72@Bl(@Ht+&09HC^pp)kCji|hQaexEDS_pyVZF4y0cSO zf+ub8)HSRN2A2p1O)47u8EdsQ{pz&*t*c*qc(#~M9nQ~OR1@jax?%`{GgoxX@@VzB zzZt+4KF=17O-8a)O~>xu4CWIe3$;HS!MnyK1*AnxhTtxwmp;|KTd044Y1 zNuIlC`DE@@jE9NOE?{m8)t{|`|Gqxscl7M9UvG~X1U)JgJCFD781@eh0bJhrB6re<{+lyeKMg#q%zCeO z5IsC*XixNEN_-E{u3z?ff`qfO!`mB@tbE9ukF|$p*pHod6Nd(0OR`@RdgEGeIZ8X^*gOdeBKC7bbIrODEs^Z6qG@t6G;0-3L@KZsEgt3rdrO{&53$y7T*w~hmp`Xwc z{nHwY4Tzqhv+_40iU*HAj(T_W^3bn$jjLl|Mn{e>}XmX-(;)2Lq1Zf6N!fog00zZbR&^HTypP`1StawNh8R z=TTvXzuz9LTetef^AqbB+EK%KW224`A{c!@{s1&a!Gr>o0vH2ET}n4wPGzH}SsZML zH`A0%7tk~)F2K7tUzgy#h6bCw+G)N@$#%L(rx8rOik8y+ z{onQL+Go$+8A*y)uRd+sv@0rNR*?TRAD^_#GYuCnTzmccvzJGz5%ge=n`abm8Zn9& z&p*X8IYyu(DWTxYXT!<%3scieu3Wj-*tqZEL*4D$Pltz}8le)s{!jbNH`+)W>e4ZmJhx_Kd25*wAZXLozkmSc0XR-~sb?C!oC8l0ik>IeFtpH2JyGw)1Q zW$P41?zWcp-@gs(>$ZRU{?pkxk+-BiDq@=X=x^9yZP8k=QzNUQrqemZ;$LC2m91RLeP!HS>3Y;-*8dsyaC)=`b z(uC~%d>%b;^8U03y{g-V+%?sb-Lo^xcJAot>wQvGw5DirMTKblK)T^<_i%LdJYU~L z<&n$AzQ`My218Eo$@c3H9z1{YShsIaw=WVmZ{FfD5RDNsS18!r*?Em0#f^4L8@~Jb z;e&5fo50diNn%1~sB`qp8Kt?oMaSaaUzqu?re>>P-L`YnzfFr?FfC-=%^M%uLQ#c6 z?cvF^w2UnD+px;~Oi_}owfRgcW<@B5o$Qj6KDIbLth_Vp&DQbi80&N|D0Z{c?Y{ZH z3=8^KvFoNquHC)tblr?YS%k)SGmq|!xwFJ?^O4H8Tj)#I`}DL=c-zr%-LP~ZYurjB zA+jK}GS9w#SL*F;3$OideA2w)x>3S$Gt=;8r?zX;zyHCE{IAw^mxYo{p6ma$bvvcjA5->vH>2T#cN3Cx-7 zu1kr||MqhDgx`(;dK4?YZRKo_@8$a%WH(c3dOA}qYmuf zV~266P_7txb5L1quzq`JE|>H6aOeH|ua2~(hiEKRz8E9CVZEA6S9>1xr(YvP$xMGG=H&A^ z6C?k;oHG>F6RLWv+OP&~fC*lQ=)J+f(*Yuq><|Q|ViNQh51Gn8^*bzjsPDsw{fpJM zyR(h0raSI@x&)V(_p05R%8M_B*7g?Gez&?O*P;6uedLV?s^c{ zUolUp{Tq6Xi#PlY-w~e%sZ3^^sQWfdOL+e!X>r@F&iJgjf2H{)qzmgGj-5s0u^bmI z5x|*q{vX!<^Q)=tkK0D)>Z!1(1_WFb0Rb@}DotH};qeNj~Gv11SDR_t-x(7m^u^*i@C<2*0!m(M@I7y)MH{LXoOu8)4$wG~Is z=HK5iX2iy~(xW4S(l^hITpa%ACie*ErWd~CjiPqB$|Sdy1+x*I* z*|{s^Xrb-2V?bk3Rti775_9UykiAQUVa8u8-Oj4MhEvi#r4qAL71YK-Cylh-7J6O( zq!!uTg6OVml>z&6BUR!63H$zzP?St!tBthlMOJMg0hk%J^Wo?c?WG!>>-7ldd%X#n z+j2q&Ekru$&R}O`Fr8vP&!jR%YX`%YM>J7kDKAT#s-v0O6&^=vi725NDm^SoSA+!w z_zC;IRBEs`mwTF~;MLjXYxb5=;a`)s`)6IlXOdA)o+OdjL2DAN?aY^TZw_(SF44BV zP{{nMkEo93z)-|92RU0%Ly0_@3uYRy2KvbN_SB?>KlvV^@fq)Wq~ayhHJKcJ#mr}U zy2HHy+d{u~z&BNdIseVUqrUFSUcG7euXLg7)MB^Fs`#l`JOzzCQ)6YTn<>jQVUF$- zDi6(l8J-+VPV&Fg-`hGinCQYE$9^d;DMc(>NFq+l3HVA-|4{|KmvHZU?qtKcGTRI?iw?%Wty%v4Qhle^ct+Zv- zZc}OJ0L#tpWwXXyth#lV4H$w)v=6#OkuCsWE5B}kWp6s^wIg9`_(S`5jTu8kH~bbQ zjbSFvO|ICs#eJW^0&;4v8#e#%P4%($+b2yx6soq)m7o;nb<~N3Y;3C4fuuQ4YW>vh z)&~`r(QvaA?W!J|VM`SP2{8FCwQGdT3W{&|>yBLfJvYND_M~(?mWpV4-$zj=Y}ze-xyR3beTUmh zRs95dvpKRKO_$C-Nwwylyb7*7IhWPs9SwW>Ci%pvjtdv_COs~Hy>v2^^@sMb#N~jm zzt?#)gvAt%* zLwcGAC*c8rn^|qDga(A@i^WDnAj=%-{kdYVXi}Z8gDYX075Q;NCHu(V9mv-oU7I3N zyYV<#;Ei0uMfbw#M@L`&<@tI>+)KcpaJP@TwWRXe%l;>RoE@#mg=<4+4Z4=^7qugI z-SiaJciGRYjM+lM{o2#D=~FJojPqYzeJukDwd*~1stIg9uzXhQ_MnSH#)Vb=xc1tw z^5M0`L;W{Sy8FugM4t=szHQsBn7=Nf!C-wXT=_F@&Y;Dhebu@4-FJ8;OUT2s0}{V( z@B3dD{rcxs3priyJ#UWx?1>zEZt%X%@85hmH$|8`BX4(qZf+e{;EabX#72<3v-_lF zd&Z&zAucb3C<9|c=tzIS&M0)dDBPMKUj5%(b=(a+fQ@S*%%9*T0zdc zlYXbLcF`eo$E@iaQsC0|V)s1ygC>-9rWEbxF*8;a(Do$aeH+r?b81{<^355Ect}OO za6}Aq4{r*HX^_lQ#f4kV=0UOqi_%}s_O63_quH?gCSGXe@)URWhbN989k;u@bRB=e zAvN2i%BCr2veoX964bFqvJa#n(De3 z5B9oC7Q6q;BI;7~uEorkYKIiF6dmmr-1%K)z2w!zN>(`fR?j7|OCL+R=O(1oBnZ@2 z!QJiL!xdWG0s8C4%Ap?)-Iv%1T5OZrOCNa1zp0l~_-qn&KTIv&nr`=1o%p4!ZA8B3 z>!o*R_X`&)J2kE>V?^Hs^@8`THfDRc^rc7BR$<)Y!ip41N;SY=e`vfMI{R)q9NDj> zSsbn1)s>Q;d*Ib<6k2KS4EtYPInjfxF$hj8Bqt2WByzb7S{a$YAcnz{704tifNyyR zTDD&k3k>XOy=W>en8;usJji|>;JgV*Cq@6&T9|{SXg=v|!uOg)^A&|8l!j-JQWjsP zKqi{7iW884Prs3f%7l0;iR-V`zU8yb0sIcnzvGerH8HIuyQ%! z^KznczQGrRJ#njk;|pOPPy%-nwK9OXp1C~nJc6uDV+b#$R=yZ@ z)gkR1a$yQN*j7yk!L~-^^+Vx;K4~!&)M5uJg=x+P;k6*4p65Ol&_^LKI6Q!4&WD2GxqaGq3DE z^Bo^`g%}=4R2vW6l1t6C%OWq%O*M(?NvW?94%dnPsmA=YSiPdw-xh7;2p;Bb)QRRP z@mspx4NC0pMYLLnkF(!X&0^r^OiNa9$0WLZg=mx$#_zlD50-=k3rp(2WJ-K1SlXyW zqLhTZ_kqOapS=yNNKsjEFCUw&{WHrXPF0qUAcfsmh?6G#_I*4gOMHtX7BIx~!BR6* zioMH5kHq=?mmntqaNzK48Xm3?g_6snD873Z+o^|l^71DmLi5zN4x9V9ao#_8JkQ+e zkq|u*z~Qj~FdTxuLaPjjg2vM+)C~}Hm2jC3b~2)$8c0389L?wN#nII)8qOjZIcGCx z_JlO+)bSZp>1V?%3wGaQBYujMG;^zd7$vWD!~y^`k@!v%5~~yRGYA)$kPsSmi^4-# zG*?N)uSSP(a0rbAC=kA-c#|A5{j4p#yt;%5E=oda}7qm?o=3UK)q?4&*@e%IMCMR($F#*&o&k;F(Ot9s4rXY z&K`Q+7vK-@5E^RI5>pLmlL8K4;@oMxa13(g0K7zpoMm8|!@~`zgF-Y?aqa}b`%-^I zUPSlw5K$)K34kf|*iH(K)MEY=ZVkW!9U;$H8EZlo>X2nD+C<{v45wkxg(OVS!fYA| zH^Sp7u`7UQOol`TK2C!;n1lgJajXJU*`V72@TJdwIt^QkK?X?#y+7@yCwv)nVsAGx zkb`vFh)5&k%}Vatf&>=wk6A0?F%lLXOJ9m+(fxARia&K_xBPtoj%IK(h8U@UeQ9*K zVa@G#&;jCd#afF$34lUun&57^LkaF`UL%rbrg?JAhJzK$wqG2=u}W zN^Wj{+(+M-sk~7Mu;FsFd2zF);p`;SS(jcG5ISTYBYK@J8N|WES)6-_uZzKVF~V(n zajjOE$RUj;Bw8VvN!^B12tQVke-)a@2#+cxO*C{;SFzoMgc}4$8Q~y+jU)w03ecB@ zthCL?E(06Gc5fQqsU)^B5}Jel>AUQt32CB*@n=N`3UEt3KPZW76sUrO!WDQ4CA=~X z%!o(`WsLNC6vT##o(rqR$e7NdTNftCnl;Hga8AmxqITJO}<%=ByQsG~IfAMifoM+ZCWA4lYzk z`YVuVy?B}l9RxP^-*r{#K076o;FU=;70_8$lA=I#OchXwoB&8OwUx%&J z-#5RM7INP#hxbv8HCtoEyMWnMZEpL0;;91rd0n)@D6r&^Z~(T;;Zy*I8{nBh0qNmk z944apl_*%GBSQ6%NJ}{A;ewyQlDhLeWZ}@>73d%O8YxXg8KFYvJWcbfK(tg3g(?Li z7WveGq{s!wZQyv*$p989<@g_mUt}=74y2656Dd6CU)awmAe4fWN+g#=omu|)ao_$L zXbmC8Dv(0OyO~CGL=+Orik6YMk`$lGKqeZ{wS2E?p(IMb;(%NP^h@KC9v<_+`pThw zN+g8;PG-U0Uy#%&PR_=YSZuNabu+>7Bsx`z)SQM!@Oc&v3Sn@m3F=1^J2+m-@%q(& zz*Q$S^C5QY@8;TUvvHo3bI=K-dXPv7!#QZGK_HgDn5H8>r6Lu* z^o>shTp7B^whWl-z;))#Dh3+!^ljW6xQc@q{*Utt6e^6F29bl2KRgi24CrcF+F*nx z>b?5xI$nD5>LmBwI_7Mqju7kdFd7}EAmmgRFm>h`wgDEn`NFmDARIRJaY`p3mQcaz)fA(vNY}QRs5!;*s z3fgP9t_uzk#jg|(Tf4>$ikbV&+PN7gz!oeihq0tHz!o2*;@X0=OO7&$)4vt+QKhSC zk@c}%%**wd)znz!&x9IU;J0jLdl0OKBv#u)kM*?t%@I)}S62ZO(^@Q|!jD0Uw0r25 zvoAAiz_5>dg%ZYVm;QoPz2%U%%CAX(C6=Yy($<`U`*alu%?Guo*t_OPTh_CSe@y+6^X%-3UfgL~kFu)?bBNjTZ&PvFN`KFk ziJr}0-^|E%C~Jd8Z^iq$q0TKe<8D?vfut1fwtpcA9=!ypcc@B52%gI{XQ5`eB;h}K zswH4N3ni8llfpJp;dMIqts>)~vybgj#{7wwb{7lQGqX1I^*u_v$80RswOM=3xwLLd zY;OM|%SxWWoY8hG!(!H!H!mD0K}{za+%40KfUW>JX1{!Y8DtN15bifEFu~kOp5!Y2 zaHYzqg58_c0#SYUC=KCma3)h$l98AwzZ%S8M)Ydg!ZH>|?Pq8v|Sj`yLcH3p$dy)I#`v z6=Eg&t+(_hSFW@ zAFVD7%Gf%)_T;Ol6|GaitL+oQE5&sOKAwur;VzW9o*CR}`&nNAfFqEb4+p)GRZBZCkHgC3`9H5ItBz11Wh3PM&`sQyBim@;c>`Ym=Kc#e!(9_LN(|_hyrVJWa zoq1d9IJ#%Im6MWl5#Q=N>HrWbK3iTRWPuzp1$02x@f#n`5{r0pd7MphV5$lhX}f+5 zd9O2WNzD%$VHbbyQnSQ%be+p&U=7r$bGV&a9cW4_93iU~zQ7Z$J1VHcgW4=O#Ql4l zJ*-f zQOV+XL}pqz>j?yrmTlU^#`|(1}wm2Zy@@w(xj1n^4@5 ze-F(Bq zA_W-Zess^>>#xVz=puOXxgTJ4u<$5t+rpwjfzfCv)n~v+Zli@ms*Sgf^IooVLamKJ zq%#K&7dKL+60p0jGdb4kkj>X#%4T;5z=z6rwT9iW_i~AP;bLeSk!S3CBeulXD`s^L z8cuqf(B2!n1;FSs*H@_;WDmf^1?o|9rK6BM&YBxkqOl#}?rysNK6!7($O~B4XnBd_ z%Z1h@J>i}e#A=JYB6x{0Y}GHTTNYH2fGE7QtmPz5^)0~uu9%`atwMDg;+Ud% zkclOhvJtW@g8)-1;a|JqrAoOfV`7~o&ol??pdouBkd9;^`&~M4cSRVKGU{>P?YGq{ zx-#6I1u9}L?DNNyF#dUtdy)ZbrVc4Ya|Ka=>9+P?3(y^NTHnQ`s0fbr&hBv@dAzRF zN!BUt&D-BecMQpo0tcwf#MNoF>v`Lp{e3?xls!7W>;{5+9s;Fe}|{ z)1QBi9!+H4Z(g4hG61sTYR%#y)?rEuBGgBsUoBMT?X5dn?GL6ee@@>QQY&*IAjG9SjLEr;m3M$#tU~x9TE;C>1u2YdP6CC-Bmwu5D|* znGp&3HLQ7{&L-Plo$_Y1CMd}mGgsD(N3(*vo~cp+0PuY!8sM60 z?og*r^OD09par2cT46L{!5n494~2cLmjZW2MLC)7LP{MQRG~xjWvr`HJnr&@bGdyg z%*jg*rQJB$xM)8k_R($wa+Ppg6WllV&YDDWgN>AIhO{yu)OF&?o>As?bP4#{f<}3& z(w3=!^-EY7m5JJZJOFBzN0}>ePJow}`y|mbtYpn6fr2M~Ai_DRHM5*73F+p-2QTL= zG^zei4&_YgNxN*3HIE0L~WtiMJV*GBh2M0R|Xruf7b z*C(2ubpM9RZ~iIGj~cOHV{i27_RgG}E5AQ|m+8Vsb{-uu>9JOJ5&HF*V(fBoX7~w~ zT$XuZ;36F&mh3_m9bpp|QER*p!#EJM*&Q|_7J)SaYXF;9F`K0Aspj=nkpktN*XA(g zekvM})imzV=2rH^=W|)>n_Z*VzOcX2O^YgOq{B3Y)~{Ktk04hZ1c2RY|#5l2W#MIiZF*ZmZj=;;R-6k^Q!{0RC2bw%AFv~#bbN8g~c-=vrLtRw(ph# zc4G^lszl(5vLQO_!A+_KcT}Pz;HX5mYJnqDcw~TTedqDCh0s6SG)QLgaQ@(_S0i;m zs8>@)R0P(T0~H~F#(S!rIL(AA)S(Fu@%%%|6gy?A2OFS%`obw9R7R@kx^okNYVV!( z1Cv&#)~VbTML~Ram@du^M68k!iOxEa#N!N_gRw3`E$U3EdWV;yRy|;1DH_DV!A%RPHs$Vi*`7c0!nC0ASUD8Et#mj!fN?1l~<|Ss|n(bAtHT%xhJGZ5{@C&9yGjs z7rVf(sH57+y&a7sQBf0e^f9nMv##TcUL=4bDcMY>`br&W>g$1MPhT9Rn%_hW``@Gy zGlRlomH2!G8!abol>FyZP3=K~^{meqwj)>b{HMkv2@)m^AJ_qdCY8PHLZloYE=S@z z&N)$NI8V{i>Zt`ta4gy@qBLXTRRaxbkJx(14xOfNw`a~KK`d;7ycj6VP-fo^g~{l_ z6col5LOtFXRp`-#g(|=(t<1a*GBW{N!-ZlmwYw1%=fzrfSPjku9t={F2Th#@h4rAL zw7>yi14%SxKvWn|i?oH7fme#%H14!IR90K9U~MyP0%b+!TH(<;5Xe?rGLXoKIvV(l zqDHknaHY!GwN5qAQ`OHiN~BX!3Lt$6%m7>b9#S2If&>soBm1}u_7t>UQ@cq6+Zb7U zE=q2I7H!qc?12&@;aN4Hk5c_56LU3z#S&>4siu+&;XuyEWaX=8d+m1#F;B#~2{La| zB`k-_Qnb#-O)mn*`3ltWr5X=PJ<6nUB+(?a(8H*X%4_?C-i%U5{xN6$$5U?aICYRr z&6|O6;f@Ia3#hWUh&3OTIlLbNPE>C=Bq$2g!M*_YQmW(mYZFR6riUMa6ajioQ$6r7 zji>mDT!xPCfhBt3tt=#p!JP_(^(ke20LV-)GfPGyOEt~{Y-|dgM1y&2ffcgvQdzt* zvn0oe=XB%CVoR2HBl8(pD92~Ah&)!~+*DZCjZG|2IV<6Tyu=4Bs)g4%$~0pXC{BIzeyGEhuNaD|An$L0L&f9Lj{BIq(UA_et47>ma0bTulnnuo%SkM z?KTTq<(MqAHVz~%*Ww(EX)BM_iGk-M^HjJ>tDZqa1gB0_7rp7MH8W1Ni#mF7%F$V| zYB!2VRu-A{#3v~=h@PF+td8g4&~iYOs)n%MmN2_>g~nq)G+Ku{7*&Hf_q=j89sq(? z?OF%z9r)<0eyT(1BR(ZRqa%1r=^+afwB(JZS{u+i96UPq9=%zE+%19vkyc!*I8VT$)dp>d=W|aoXgGNM^xhB$1JeFYB{dX|BSWy*8F$yg zZ=X(oBG}s}+(q<8R}cZ!*{g8gFmbzZXr_9qQawljB&>5qtj3e&LH|=ls}IB%JioIJ zB6N(Mp#K(aCEh*~PzS3yc97s1qJ0EsR#z)o$6!=!K;EtM-a=0IF+mOmsF*x$SyV)3 z2L9XJSRJStmo(&WM{x9?4gflbtx=7O-JKetg4iOUWIYQG#1v?<4D7b!UEbfBp}Wuviixs}5E7u-CB$iyk&) zt9@Rl$I3_j$K78yA%{#j{9?ilspJs*Xy7anly?&x1%t`#~b9X_qa%MO@lzJAK%1#&nJ7N+K!rGM?EP(Y0V3M!dZ*I;qN%y7@~k7c=~&uvM{Ho z*qTX?&Uc9Z2>mu4LKs>C;FW=5nt$MUV~HRsmx0|BKkG)yZJ<8013 zJ|Wnzvu^gz#;sa2@N4-Ij0MGweCzu7f!`5Waq`Q-?ya|mgv7sl($VdtIMa|Cd3?*e zlOsTa;L<$BoEd_WyjZyHL*aS+Jr_MKvu@54-MgT}W!L`#mO2dt-d(EQ+8Uh=xGeYkVcci@ha1xY2{o|*?MKcIS5b@R(dGuS7A zATjAqZ*)iJ#y>wiKRmA=#dFp1IRK5VD{1*aBr_jh<>$QGp;~B?8gEF^CO8Td`d4M& zeUBb?yVDd&(G=^mnGw+D9S8-NtCWcp;a!`7f0z$;!7sUOf;uwUARp7tou`c z{U?h{QuBUF^rp1eHuq@~oSKwtdBPX3%oWt(vJ<&o^!lgWu+;c@K%f~Q0qBMyQ`R%j z1<$+HZs*szme{#hZuNSW+kgB5DU<1R;&1OufBRfo@SI)XFO39GW3vCpvCadsZHiu=lx>ag<$+h8njJc1 zDqldzyU}@1I$xM~ZE~-_eB$uX6nc1upKqeSJZbEh`Mmd>XKH(=o}ovkhXl=V=ojAK zHR6(@_x$*OMg*t4fB)_Kx8JvtdV>RJ@`!4{;K>v;G~avA5dY+^u6KdMrhfX=!@Ja9 zzBKVv?&i&VgM+5>^@JBE_I~;D`{T!N^P{RmL#DrZ^Lgly$)ErJX)^s6G;DJFrMvNp z1-u)5_;7~jI8&GBp}|R)C-kPJ7EYVGOg?D5J?vFh zx_#vE=@Td9U%b$no<83S>8D~h&dDsPs;s}9)a&dtbi#x=zCNQ@t=!hw*xEYbw}sR> zc4$g(TI)ZPkB5g%{P^Mb4 z-_h~;_N@4l{(g6W z>OlRazB2E|<99=?5>Jo*9*xdlx8}fz;S+}0$7a}-&kHVF=YRTe?906TgiRd80#Xl>Id^37S+{p#g8f^Vu?@4|@)o=B1o$569)Uh|a{u{UHu4dSU9q%fyer$Gap!|4?;m<-IlimKB*T1=}`q;GH+tg*)J*MQJBdK4C+pR)g z4*T^hsVaN=`2S(Dq3_?nI_fe0=DD-WPIe!^`tA3*bN~I5_hRs#Rht$^_KJfrY9(r$ zsT=d&XYcdGOvi3xA-N?$mvu1ef0(TA#6QNK8$P6r3LKcJEk!?9c9wbK!%|AEKSXww z4)~v1z2R)2c3r^#O|5<-J@x-(wR-oiwL{-_@76|pz1hR7)!*#>KgEQ+$7i3e_}75M zU0Y72t-<5>ycO21w7&1A@9NEbdvNN#TJ0fWlYnJy}tQ&miywMjIadP zYeU~1{8O9~f9=@a#Hn#57c;#3h=6k2E!0@-ozvufP^*B>bx*i_>V4zfwS%8!dCyO@ z(Y)l&@@n<@;Q@-&wf+C6R);1P_OV#i#2hI8F@>jeTgYBA^mM$nhxD~P**%awI!XWOirTPSP ztL>{m;UFKq#Zj_Q;^{Z?uHD!rzYg5}65fTpwP=Imte8Fy008v?@nnPA?ml(O_gISH zv`IzWSpEj^xq@l!Xk8UF1L&lhtFWxwBq&nl z!YSR&18#H_PFoJA}+uu)oRfdytC$ik=D77NK7$of5GwJ316E%mvb z&TJ8F3~=c`GHGM~<3M5{JgGVPrrdv zHlAPjG-2Y&0D;)qgR~9YwLoVK^9|LX7)Pd{6HH+qr%KkEPh-~Em(Ft7pLlt0gK)}+ z%e7(CZuPd@l&48xn>Fn*bhRY$h!~3%(5O5*}4%k}XBDRn93BA~01k(*|P=Lk7y8IOJ6O{G{RfewKG0#;wVeZsHlZF*rPojJr1h?JS zzP&`DI9eN_vpl`+V+aq{@U*ssew*AV@6 z&I?R4BYo*-e^>uF)7}5b$>q%r(qjjvZ!xue^y&g$PHmgS`;UZw6%Vn+51nhhQ0Z~= zf0%3!Cm5$!_nBtA*YI%$UF{uqpV8vNbgAryzIfO*Uaejr{s8-fIoL)DBT?{P6n&S9fME>G$)pZ*D`IpJ*019#+=^FFGr?4SNUuBoNZjhv+=)r$|6PvT>$Z0(3!O8msx3DOW62uG(Bi1{W zmkw%sO$42~S-C^IxA4F2v|&(0%X;fSWA-3J%wU~O>W@;xA8sq2TN*raK2NclZggZK zJg2Etd%X9+FUGac8^R~yzgENJNElNTK#}J5x3)eHmAcal7i~fuU$Q6QoScRC4lMg7 zC_Vc=t@q<$*EUpUEcOX^CW6|#%x~nhANE#5ftoJ!rQ^B9nEJcgIv5A-YTx|l%cex8 zIEQh(&Ei&4<=wfTh+B(#qXH;VthI|kG>YwUwbYDkSNDz5o{sg}xwn~^{eNlfvr_`1;DiKDVHkHbpm1tR(%Q^E8}l6295Dve?$b z!3d6+(8VTVda=dVlK$T-=Z8Ob{*={{K zBA&W9p+0tLY5&Y+f-u1%rD&f*#B)3TY#|1%+(Hx!Rcm?6P_`Tm)|c7PWy?LlmD#{W zfg6;fHh|@m_zG%CA00Z>ge+p#0>f;)rjYy$(e+1#m!F-XMgk2B&;eC|Yc#_aCq{B&K zya|WH*r&ttUtC=KEfo%<0BHgnd%*b&P*|(o*&7J;#t`dy4kaejnuGcPVkp4YGce_m zEoMQiPVzy{*MsJ?3jWv_+ihsKa8dT9{?a+~7R$H;xGpCHUMu0Dx-H|DX=I>;J`pqs!Xat z9oeeW-@#x7I-fz7=!FhUra1!(vXIGop*>iDaC6Gtg`eD^m6X|Copjoig)2FMGiCOO zoYOEFad=Bua*}>t&=7k5KtM|wXbM2r6DvF}gR#afO5sXJJ#5PXTDjB8m|bkUlfO@! zC*Qq{?@?3;YTOsAf?$80&>WysSa@llOyt%!nU;k~q;x0?vrs*~bp_xxBB-YVEz)As zjr0y7c#$6@<97BjRRU@;6FFm$68cz$_2Iz1{o2p_g#}7P-V3AwO6YGP`2285Q8e`H z4bOP)zeb?{1#OsC9G?=2cynuUvTmqohple$^#>3Q&}rR8gIG9CA&?oc!&>O-*7aVA z=vXagW!!(cBkyu1s0_xpSJ$ukzVJcWyq=Phk`t?}_G9T<(S3#ZI3u`4)=n{rni;{b zK(v@Vyh9-X+@WXnh|%ltSOwU{9y(7-?%PX_=pf`4G?tN`+AP%b_twHp)>hQWN@Wb} z|3()=VpUpnyB^sQn@JkLYOQ{|5wS6vt)zK&?5O<#seQ6~BQ5=;mweNjebbtE^Q(0V z^3r7XQ)~7{FX<+i^*Js1q;GKTooarSHd`x~WRnv9rlx~A)Ug@@y4@=t?VkSz+0hP8 zdW3Fe#D^!KZvrzNDSp)-d5|R?ORaibeWaKaB`hoR(IGmcs8J!-?-ooKfw81?2LKP= zil#8|H~(5kwl?c+8E$|ZUkJy0i{~4V9hU*%peNwSuj)fEgaYz#vq@OMNl(oZ-{+v> z(VC(RxBzTu)FGpEqGD3gXcU?0#Ko-ib4+H_;*gUHbh233plsa1O0$id969L@MgRF+mCAt}e#<0m)E((y33m=6e~C`rYii({;9D>Y#4D%r(rR%sheeuTn1QwQnen}1 zaW;vbE!%V^nqQV^12_jv!d(oU`LO@hq(t&rEGIEO})#E1@w<_Zr2Bh%=F z^XbT9ogn51u`-XyH6eiEAL&*(=vy2Oc%H7-&r}*>!hC4hha~0z5W%549s-#h^X1N; zuYl&0wK63(QZG(sg(`9T^9VsucBMp)oRr6=YxxH>oF{0f(c%D>7-~THwQSg08qhAB zq9pt;pm`(_!4MH7Hjo4Drv$TPx=wP-q{bx=xR>zlq3oRx1-zd}!M0oEo!Y!ePQ!tY#1yzITR;_s02 z*B;H6?ORnaq#{m>%C!QX*j=hat{meP^wL=*VMhv|DutB>@e299(bw-z0Qcg@3aqrE zC)dQ0jA$EQ&Y(oJRK^iG9HA7{GNMWbU+YKW29Tu}FH_)y<*hJRFF1scJ}~#_TEjx! zF&nU8BPD&SGdsr$>hz+~%gwsE3x6p){!y5{lba!W(HkxNP;X|^o42xp0i?O5TsnXi z?Ez*b)6F*Vr7rr5K3YCvip}NM8$+y-S9@o}OWq^LxAXfe+D=Qhard(*a;6dup+pJb z`g?KB7&wLz%>uY_EYW5V zFH#UeG?bZHX-z|;o{Enukx@#)StW0UM}j!$rHmNN|75Y)jzJSy$a)95RQ_b2ab2z) zcQGO=?tU~wOg7yVDj=x=J#IkGC`2zl2-+0H3IlveY1|9$@1^ljrZ~tT8P35CPsMBK zu16tIq3P06gS6Ht7)itPwb+i==+4QRLI4fcKj-o3G6i0%Ali(AAi8Nl$(_YjB|qM+ zitZgqYy;3oPb?0I1_Q{E)uoccJBLgm!WaFj@a?6(ul;l7~7N*j^{9V$gvG zP@_HHqBl5b^V&W6?U1N6K&1S&ybM0Yp+1yE!Y6@@@2uV4*S;~MbQL1G`QGat!xo!; zR<>PHnk8P|>SlUtKH zal)ERdH3$91Iy2yh5P8?!7MxiV0LmM#z0JF5G)7^;-wdQM59Mm0VGaNRI_>2N(s*+ zCjxt2>IEB^7sCLSs70n2!3t08e+?lDD9C_EYoW$^$ez=ufg44rWS;(=vK-v&1Bv-UBZUxi8I6B%-2HKikm)DG`ev=7@>le2@gRic_G+G3Eryt0@8LjAT z7A_bw>H<)CWA%JjIHf%%s@gWS^VrYNf6~qDe09U22svmzxlE0gZQBBupPcQC-;FJ9 zf4th$C+C{5&AC~e9JevhzuXwM#(i3By9oj`yh|cF`V*n82lZXL{@Bkjmm5fpwUd%H zP&TZy(z>&Gx2HsGD+5Q3HR&xfGw+HfHi2002=-~kywh=TW5xNfEkM9Gs{LXDJ$BqWbBlGZHB zI8b6H%P-d+Pb1v=rkBQX;KBv#ek3@-=oFVOEJ>?p_j@H#Tm z8VuZV4^#JC-ev>G4j7iBX!{b-ae!umzq&E8{i(aMEOEtA$8TMLnuXu}$@ zQ5II>>2BmuNmEmb`IF%Gu5}WZHwY_3V`%_TPnY$Q+U{0x4|pqsrp9=#|cYTJ|3cy!pcMbj`({B-HR=9wiO4GyI?m`Vbs~9F6~t8&G?Jr z$k>POPFYzr%Nutu*Z#5Ax(?cD?LMXdo^sg~28`Tj(YD6M6ss-^b1wkuJ_#w|#NcGZ zp~4+2MWgG?Ru>cv0Q|c+4z_2d>b>2`)zCeP;cUc%3tXOf_#49{E;km0ZGiPz#(}|a z3ozh+rK;06evhnEoLbbqTRKTF_#lGMIGIv9A(+%18sP4YZ0wsvg+0k#R?sCj%pm6l z8R%(aOZ{f*}!JIkWn z>nIiBx_m4oXyg#7g{Gck(;WiptM~Yr{tJe5mTh=T}b+J>SQ%%&C9K=bt zItOw}a;}i%?{7r~$#)hOO>QfAfciPpFn<|Ia~qc6$+H0F9)9nS1wCPC`MlcwVG|R^ z+RRifi4EKHhZcp1`yb~_A0U!ND+)2EGa@vdik3BfM z?4U^a11UjMhj@p5H6N&BX1}IuF#o%qm`#Te*@UqppM(*G0*(356wFf#tV1}?{A&>I z{oni1eJC?<%~a~>kOH^-fB1UOpr*d?ZFgrUq*7Ms-B6^Xp?6H^AZiemA}XOHD8)jv zq|u83k={k53#dp_KoMywSiuU|zzR0Nma~8VciuDSopa`V%!f>7_U!Dv*0t{Ex|auu z8Hs2)M1Xmqn?o8vg0?{{11m5_4q|Pj`F}=DuX!<*@3Z$!vki>uX+n4=#_G=i(WA>< zyX*bVIYkwmU@L|;oX>)lQd~^vc)PJnK@R&C12CO~*(e7JhkB1H&X*koB`ciQO9S{v zL*p|4Zl%NVsUe$auT!qyKpR5WG3ZYZ)leu%qxL!u5%>{Zs)0h-pma^! z;v1q4z|BMQ9nhVnQ79<1@&XfU)ddrlsVL&>Dj}^AIvS#5^|c1Wk*zg}F_2<;9a#g= z=)TnqEKMB+#hPCi_VpK1`|dAuAfDa1U@@EHA(i9cIpCOK1)iHDPu;7BfY2+ zqCzV8o9F?exIgO=t%q=u9}MeM`6;W@MYVu8lBMP1_^sD8ofF3P9o`r4b|vP|Uk@X% zDy+8fTr7G6EP1#McRJkvzg3&?b`@AevKo&?R?|0TAJcia7bIkPqInddJ+f8!wgHEv zoZlH?Z7N8=9Y)rLD%7a@98ziAP{hWBQs$)>@F@Uh%?@(1+#idFzh5Ng12)<7WQq>$(2pigNZp=V-wmcZk5$pJWE9;*dU9F^ygj-;D*H~s{*2g7G|d`TbHHFn-Yg0NtY3x@2ZgGEX#V7 zXex`+D1wF4*fkNFNMKrz${`o&n@n}i{N|ZbQO_=-bQ>Vf9&TV+seJ<$W~7SdR?Y z;e~vVcQ&O0%isxoM=)LkW%&tg)m8R*ybz_0qY<6FZ$a(MD@15+Ul3uTNU!_rTNl#7 zas+7QG!AJJTF*vJ=3bPYMukyf@mZ9%xsCax0h)?(Q%5QAIqGd}$9Rm99LKngEjqy> zLqfVEsCBDsO~_GnbBR_M`yE+Aw_XU*zNm(=*m)wRRYl%m5Pn+X5nqHBR!Z->`K?h) zRe_b2A&KFqM7gjfDajF%yodpI44y4NB5Bq&ED10>sJJ+PjJ7@R&rDxrG}^xla%8df zKce*c@a74wAq`bN#Zj1Lhqj}j0R>?K8nL7PSv{o^&$(U&t&_zVwjsWBG3ELq0byFi z!XL#Jz8c%j+0=tF;B(NElMJB|!Kf+CR!)}Vz(Xl%$#nDcC%XAEHk?~2+zT$ z!HA+=HC%z0$TFBjZ|g-t0Iksl3sX^%`>_fmEOo>J5239PGdCVy=fX3lm3wmBwX}FY z?Xq^n!v<+w+5OqXFi6$h+<-Bz5YN$`cH8v&_KUKO0-B#Jc%2LtEmwqgjz`2Z zRdjF6ifoJQ65CQ1W08hg&qu2kv7LIF4D0WF$mh0XBtLNDd3SMK_}uLaDQ;sZWGeK- z4rE#!?L3WXoII_xnrzKL>r%y<;!z01m#gRQ<|zx1Go%B<`3X+0xx>r3nBaj_W;8Zb z7JJAW7f($W;`5Nva6$_sfrSgHN9`XF^5f&2M(_ZS+f^jAz(Q%W&_NK(1lkb&NLGb>UIdc-Ag=woh`k7SMM5txQ>r4TH0qm23$zFiWU_BCbslM|YCz z5REZmqoFhoc0uX~pS@$XN1%w%OmED3>h^$Xo~XaRc@bJ}vQ_yE3gOIQVJL~JJ5&aT zswHGpg$UN+>S>-miyK%3YbRsZt)dx4T-S3C9A$Y1E^>rOmZv$^0`URQjpZ|;b+bIj z5w7+$+NEB{wNG7npuu1P2t(-7IiB2ev`IZ$Nr6irxo_oo&SH|woMS0P^Bnl>Zn7GM%GYlD&Cw6)IhVtw?DR z#q$Jelv>&}3O`etr^`b4vu+Vf4hf;Q5dtPLqHVAwbhg)=lfJ%IEt(}=RF7}ZkP1U} z<;|qTLbwGe{)k8uo>O*!ogN`_HA(W+y-BQ6r97W?C>j?hn<}1$&u)`MK%Ba4YG@ih z^D8%03$bs?B19-qQos{FHn>@i^zG752PIpZ-nh*frGw|ulPSqsWAVZ%#oLNrTi zRf9aslGcJGs~QPKEF3x)4r3dPunBFfZ5g|9(`>y22#t&nRiWd?iR|41d2_!eKtzYJuwm?g ziPOOnETT6X9zp3&vq`gc7cF6rNx0MsZk{xi89}#>apbh1ZyEMf z4s^PgL>eLBx>y=LBr={y|H@8308#gc~f1*W5itAoq?nG zAQ8M;&hjgA`W$&NP<%#3njNSVD=LbZkqTzLQi93V{_^Cl!M++IwoE{OZG4a{6#`2m zserLLrbdXf9h`{AB{EXtM+`%wai8YumsL8J6Xy4Kz6~3G8`jF!f5i4i_WwC=yk7*1 zn^q`Z%iOc|jmQR=5-s#+mRH>vq(6-=6?wNWaaK3xP2!`_ljU!S!(^mBLR>CE({mZm#k-x@%P55qsc^CLJCH+ZqjdkDDd(ej)(Usy9o%>(|`9Z;_ znYvF;LWGVjB^yp2C^|GCB(?PECHC{I^yfK^gR@&x#QYCDeiV5k`O~!10r7;-z`*GaQ^ejXeu&Sk=otXxz;2?mPhe&4HDoyPik^b0aSwrZQZQWv#y zjr3JoarMNP)y^-!etr>jMt$G<1*N$Jn=PT8moTTkF!R2A`FR6cm;3W=)W3s>G$I$0 zjglCQ#>tSO^Iurd|AbWmgg9MgAvGurJ_MyAACROf8j?UFs~hz_33vq?>i`Loiny4X z2#IpjLm-TnClZvT;B}%RssOi66}7%K`4bRPkQLHHLaeRH@1=1n>Z%USybl-BmW5y$ z1?>6@DPJ#UEQ_HuMa9-(aI!iWJ))?hI&t&Gte-!B{@Y|5^zqYAd6K%R$)3o_6hX;? znTd~$(vE{(`QN_&F_JQ0T>RFS{&DHcs)J6%21u(rZ%vV`gXm-hzTFmPd!3B^9X5s8 z(L$Z{wip|F*{ru)DSf`2@!*hlVDR=7B;R`P-t6`MCmd#{6lA(de^=0^pq*;lkoavA z=Uvm8d*RN-vA%_>IQ5-q`}z4#hSZ(g+#;*u=klU&9gIrTzXFU^ZR!?_;k8SlSwckh83XU8B*QR8n7 zbMKDdE;xSmuuJ#pQ?-ZWeJ^Ca%G!BiD7Yy~X`i5SVV$zYj_pAur49c3PEGpkKi#ud8+cG_QxNn<*XNOl+C;#$l!&^b&?EKN2506|u6qtSdSaDNRFXEbKv+|J# zNxS`fXW?*NjGY-_M}g^h=7wG$?Zf{otZEKWgIv7C|8}~nxs|#6zr(7rHE2jv%F;Ul zdc!Wz_0*6wpuTlWH4Z1ZS4Gpt`IHSBv)TYNm1Zw-B7SzMmdD++*{$5|a^u4$?~D6e zei^gHpo;6AD87^bSiM%%_6N|c)*uY&G@zllCI>S532`VzWI!Y>{s%m}o1x0ZbwcW$ z<6Z5qZt>MNU(=z(Xu~hN!ct@~NE6lm`(qBP;sb1y?V{x|Q@-}Djg49-{M)>DMy6lH zJ&`V2y+Nb265iSr5m?EiBc~CkYhS`nobV9jfAqGzDrAS*K>c8)?Z&}Id=?nn3{({y zxFy%ISN5M8pIbR#=FXZof~ecE|B}PjO$?q!TnaCu2}kA#P+8lnXB=TuB&<4N01aqG z(k8_*XcKBh1jS{60c#Q{5M4fNL7J`!5A0$R^k>H%RU#?;tTOlS>B&z~v&pnD6W&?c z-c^bOu*fszBLRkn*GO2kJC}Dh4TXYJki$Mrq}^jcTwt$_X3P#792se~z~ zTBXPj)g1g4qa|xZ$XbBtV1Oz(DQRK3czHUcsbxo4JBk&hM%;le@vJ>93Z2U_<9CNZ zv$wM%+^3us(OV2|${V|S*!NZyYXIvmcwnPE{>=Es_3|FNQvoXYT58hWy!DJ5L^^Hx z0>P*E)39RPM+19=D$H3)y-yH@?D4hQmKZsEAbc8+DXb7b7EMcn=OzM*&R!N5#mp*8 z8tKUX!a{?xuDZEJQX)?PeB^}Qj|V$8|CNO3comE>y%~}DNXG55ze5j}fr*PId6QvH zwQ(kNEp^Ow>6VYx)l;}p?rT~lMPQR#bW8d5uAIt|)k%*7dP~Ys3VO+D4-~d~Uwn_X zHGg<#XzSYBJ5$CC_1*X(;xzj5jk7ebp5LdheCbj%us@-SDZHp|>3hQqa~y&{pIqlU zbt1|e^9O75C?32aGViQ?oiMv_1|yV4H=G7~3@`LP#{jw;|M7zX$px6|sv`dO%@dvM z-@o@f!|cS;79OLJ`f`+VkU31B+U=oGV=m&cPj-uyEz|C81jvm7*T*%2IQYC zrAVaD*?Ip+m(m}QXn_W%1z=tzAeg7Mbb6Mye?T&R$l1!dY2<}u9<;A-MAf=`-dstHq1 zr*V*tevrqgQIGzEhaFzd7bo>6?qHTB&+glXM z^`58Owz-Bm@xm|L6`KedZqA~9Re6b_39>Hnqvcao9<53kJ|4YuJ2^sSOj3+4y|k4R z-&z67<)&e`3+_s_WNW1GC$YvuqMiZjjHtC!zm&I+P77%o;~Gc~PhF=na@uopt0g#-_O&I zh{N~(xTt#1nn&Y~^KK8DU1*qf-mb_o;ZE*QYootNllLvRM;#?U zn!~m<`92L;wdghy#T=ixllb#ul}JmN^X4b_N`79d-_o+*Yy8Qho}ZW7 zvRn4`|5BO}Jo%|2QQm-wO?vvGz@&n|*!ZW%&F`hW*C7vkm)JAothbgc-Q&R{wi0pR-f;} zx!JM){aWdVhSQ9{{`UGVzB=GyLgmOz%wny)FYJt8+Arlki&q=E4#!;JIgg=4gD9|^ zi%Y6&TMIsNbqJ}tg$x-eb^L2-h{lm{&l1v7e+>{^rpTBGy!``)lqc^P^C@VEhswZM z81ltB%0EqS4P$rKg1JU z6`rC(NV79MVR0S9Ka_$KpHrPkusD3srRw4znuM;8BE+ZXRzf-WA`8M>Ei|;-FdUv@S4NSOhWv$jbsx_!LXd^K<oofNCHlKF~9^{e>ajDH`n2 zbry#`IBorZg4wLII;-Y*(#I^m+ETGf{njH)F$1=eVkuJpHPCd{JtA$XhyHu#h$y1P zY8--9*wYtjcl=X%=5`b(h}MIv!T3?bC+~$&DA0ftn?L(fy%ouQfZQk}m&dQ9N4jnu zk37|upb}#}QnhX`hs$76o*fasrrEK4%t%a@-bp{x&&-G|npc1Xva1-3A*bM*?*z`E z>(H_CB_(z1DaFP3G6Tisbq-H0ELY5}-uMSX(=2pp#egy1Zpls&Bc_{^kcV%LW*42E zTNl1!w?GG*6o>BYb#}S=xRkF5QE(v_Tqa-XeXrcLMm_~W#4t)YRJBHkm%*PUs~*BR zq9N0lgD*YjB67mYDGFDj`-JSEP16Z4(A~F$Bm<6K3Jm^qV3UTpbsJaJDv@&7>`=?P zdn;Iv=WnNP5-spG97_qzN6aeSM%3=qXra=l@GHc(M(bRCzBp61QVf(9Y{4PppnmK| z>qFOVK8NMk+}|m8SRWsdZ1YV;MP}OO%NO}<#bgE2jY4C=!#7}_ckJ4CQikDd_LejM zEMFt<$iK7@y6DRwe(!a6h?2QX&g8A^mGe0&T=f|rS#&VvNN zJ0TQc>W^-qg`ZqvYCAKp9t9z*lyYgV^i<5}^T0?8$guXGPUR9k*nVkVDs?Aj-eP1K zD2)_UZ3>7Cb0;57doPs=FQduBX*j`L+P-%HU8i_Bgt>GkRp~xTeG*kBdr)p5T?e1` z=AHGyVKkYJFVgb$iWWk*XEfuX<^{}&>8)G{ilc&zGyrvG3XYJw&s&_BJu+yXHRPQ& z9G^8(l-1A$vY`07G_dkeIBN-K%0m;Y_sW_kp;4j22K!#DX3xszyp$z(k5KxiGetde z#$CjtT!7Wv9JgT*O+96)0luu}sKuQ6*>&oNxzw-eQw%8Zyc1~U$LtSs@mkKrdu*D% z4kPJ1u*m-qCMBi~{?)2RR-11B)$!6AB_175B{)L>DVY$Q6?6(7Aa9 zq}+l-3HC=5q>j55D!gJrONAtMA(2_+<&l5XJU_!CG-^?i2a4;{q)w-k^9WGOEo4;& z)(VT%ri!<>7mE*PyLaRhV~)e^g+!M9(N%D25!j~}@w(N?rblI%B|Y_|S4ipmB&91H z(%{1!*U$m&5;U^_u7(c!D{g9#+T4Ikgi6U;iKhg#rc>qfbOa0&Vb{DlSqA* zT90pPVGeq#L?jUy>WGIFR|>PwuFZl>#u?09zLncqn0!=eEQT;4lgwM1zv`i55xPMEnKWUJpcr_Jfy;QPC%Q&H5pXHz zVP+Yc+>q1*PVKM3dvK5HfU-vPQJ?dPmLOhUyl8)ea15peNl?>@%G|(dB6QgetPTiu zC!V|H2J{nsY>Pm(KRMG31jfaP#AGU1<{#7%@12D8X}F(lVwm=lUyPQ0OF~dvEP6_8 zW1yJu6#SeBb@&sC8=5C{n!r@4L^ZrEF|%`~{?=GEroC0U2jGd&m<}*mXw_pJuNk`l z=IT6q!1B*#bamU)G~mN%Ua&QUnq4ICVU7YNWn-wXZW zupYI2Ro+)=Gcb{@*4G8cs><<#m^O@oCPc}_8?e#jYSHS8_`x<3+01+ltZBDm=8QuF zThK9(yg28JE7^{8sUK*Hc@)E_1h_hT$rRZA27c5wXsM>|Ck(eI+Uiz#Dv-&kmuF_q z!&4o*@X&Mu5W|tvzJrScM`4dEN#prv5`pQs&v^(kF|TN~0Jx`D2<%R79hydh9*3U0 zUsz3?x**0b;}IdZq)U%2!T6#WX;2JiiaDx+x?Ym;Wa36@5?JUe9|O#lT7nKRw*s4F z@IjlwdJ+^?3LM6PQg7m2c_L#4#QS45ZWjMB)4pV|EBnZ&lOxz#x6(2+2~`xE<;t>$D(hAOte-JZjcO)ZcJ*6%k12j75{Mz0D)C+^W_nd!D|q; zj`k5;?7raC-CZ3a#ybp#SD>e;*6mqfvArLcOS-9{`O^(NiobP4p+>spt6WDisulqz^acl&*GV5}y*%;NIT5B7=9W-H!|Zu6?q((tKbNr*a<_pz6`|v5fa;;kirC-?zZIVs*Xd zKWFc+S)g{f3mNen)2uEkH-VV^lYY(@Lz93dG%hJJ{y?`e{K>6vx**5>nz7cPxIuHj zHFy)*q0t{&jcs!A-@!!P4T#f12M3oT|u{`HnsLRpX%lJSY{09P=ulR%3hs8ZQFf z)EQ3GZG4QobNk~kY4FL^-%5uS7W)?oq2Az>)J1g8&COS)^C z-<`=lYC3`Oc$6WVnrzjb-IAGWJp`E9WqT(v%=i0BDun4%kbgNaFWqHXARF?b>_@4; zeCe)_zy=)MF`1}#wL)#nN8#$~UMlKe%%#O=3*`2)-^gP*`jX@4UU7qh`5d6qm`@)q zs&c#5Y4h2gP_izu^nLhLY5H{hGca=eqr%ij#p*AoZ+?**oIQoA_vj;^x(140kg@zF zqho;BFJCJSD)8ib zDtMciqx_Pv_CgvkFN zOdkRIh!g@TCqpz8V#2Bj+(&@Et#u#~CodwbOcGT#Ht@396i6nm!x80#MJZUkJixC* zL1g--P-{zn0MtYX$_VHe!bn@$1c)Q_AFPuluLmOQa9DX!k@b$odw_^4BDg^O70OC9 zb5lea5o}@Zuc7X2YP?&5q$)19PFYe%lqAnE_C&){NX?j;v6tI=r}a_>+&w36Z2K4Q zeCVh{G~I^zhq^xR_Z%mzI<;$ z^*ob*ZinY#YwK*r~?_RtN%JWu3y{sYbS&G`qgK7U{q4v66ILh z-927+uDi1QvfF0Aqers6FnLOHdd*FJwN&0Vo#Tgft9t#)+&70?D$`Pv%S_B1xOQ>v z#!Ei~yZ3HQayALj)^v0+-)peg?KRK0Cji@}@GnOuTEgVZK zVzUZv-Fnr+`=BRI3k-~Qab)K4Tkqa|&ooYn*v}3LKDJi=Iy0jNaeZvu;GiSq+}1iV zwEOq;<7IJ_8shP&*?dnMs}mZWA_B`JK8>`!ZAqZ7-C@y1B%&$zaqsE1?>W;&mSa}r zT~Xd=;w(a&{H7~nuhP-R(cAd>k#}9!1!YpZO{FX*^7`+cxLTPs9V_K`^+0`^>5-jy z$JZyvqP6xhZ4(gn#F9@teSO%GEwS0|tUNb1a#T>YDdYbXQ0##G+1FFSe@vfTb0g#b z6i{^3j-FOs2c=Qi92#*0>M)W8Vxgq5;!a=$niCS$liUEaX6Fa-CfnTj{yS8-<**FP z8)DAiXK&xA3Jv%V@KUW#!;lK!-ZMY!e&e3;&X%W$fI_s{^_5$GZ$~pU$)cX$3a#7V zMCBiXUXlqCWMMV~8oel)q(8!rg6yx&B87_Qu!@$z9Sxo=X zjm-b)Xt0;yAyscu)UKw$Zv+{K4qK1+GkP9Ya?^pE4Bu7^0yavC@~S zWH;#1AmOuk%uBysLXf@WyCeV8(-u~Nxa0cWiEEyOoeX;%}*1CFdYep!kQc@JK&b6SiT>xaYr4@h}xAlt|yGKPNn zsgvIFkmP1{3^q(u9iM@@T_{3d{CSIo`nFz=fp>YUK5z`9&GPOwL`AFZ!u>c+t|y{& zKwj>4j27bN-ptR1o~6>S1}s>EAt|#@-|tU%R?&uq9>#9b*&;dg@(w13sR`-Hh_FT> z$)@eSMCz_)nvyVq7Ps1cyDCMT{`NJd)?0n@g3xV2BkMA}XTWYtIRe}dvFuw`=d`pBq?jdPmn9&H?KrZQe&H997Pg0wf5ay%IT8e*gGM_iFxeGvon*VVPT5*?QBw4R z6X@j0icO2jbN;7TQ2vO@W@tWJ^TMC6=WVWO(q~w0KWJ*tEGN-fQ}%fJZbQ>Vod70@A)g-Ht84qqxz6U9*A{O#a|-AW-^w`=?wLeE5xttcQ(AO zBDu5nA6NK`$)Aw)ej57s{cGH3bCNK-n9h33ciV|q-I7(K_-@s~#O<|`M8h0C?WbeH z;h`K!lsa^&9?-?}D34JC3KFq}KGFOfepc<*=pue{u7k&4Hy2J`k@VL6wY$x^E-xG; zoLx)4=8HFxSz2EWvIj6481^h}L{%=R;a&=bBJZ=;zxbN411ixSA3uPe;JWy4qu}2v zho_8%SQ;hR?cPi}DqaHZ-CS^YqR#Y+Ty7bFa5j=IV$W{fjxG6CCjN@0IW>CcXwStR zT4>g7C^{|f$+wDCy}LqMGlIHfzrIyM2T0Mxyi%6@_bU9BdOH~;`D*#S8f4cyXu3^h z_7$!DQ-fiKWzPZx)i%QfOE;u zt;OGK+V&Tc=_Z^*d2h7V_ty1&*V7_zz*DK7dtv`oM-yH}nEsCs_7uRqE-kHrL@xpY zK{Mmtk9JBdCkQo*gbR~}i*~xmj?=*%yGONGUTXl;d#wM>^u_K$5Oq#vZM8Xab1)kS z&M`aHgi@_^X=Q5W@Rbb@4_GCPm#9HzUA>?59S$ZvJ4GxkAKH^0RoZ*+U5!ysqrrwF z?Drg*(JMo9El-~Os;Gp#DcdH$kBV2Yb>@!KeMN_72;9mMlA*SU%n=s1a*I%K0 z`jjRdM9W>eZdUjFAr8`r0pD7$Ckv!pBglqmjyjWqbsC8mi`?#f!ak2&=faZMKF0<{ z1Gw-nNfyWM|Fa#s8RUlMqF6k6H5E0LMr?F^A{%J6v0KgV-R_uxfM%jlzDD&NCl4EN^eu^R3Rsct9XA4$%}} z>>`-$@S%7PqamHaP|lxS;~Nf0IeeuWkkcT@A;l%9;TWGT`}#Uo+W>k1u~hz4$yq@( zb&U9|723CsDD9$xnGc4V=LhRfI5gx?LbCPb)eKq2&=>_sD)3~`1gfTL$K1BK9h20z zr|%2j&h)>8Q38&JsoTTIXW5P{3X&ABG-Q$g0={^0K=vA85PwSV+hLQOPV zl1UMfN#hII@lHNAeoCI=&1Wg)rjjuCLS;v~dZ~PEiQ1Rag4FQisOWvtv42!rA=-!< zeU|*8n?lAx{V3Ykj7_zVwIA0@_VM;dk{lj3J}Nk7_Vp`Q%Z`!=(j=5S7ELb6JQhkw zoQxQI6UppT-D2i)V<(?qc6R!ad4IBcXX`!xO%iWr-^Q^2-u{_&;_rvQB&!J4-W6`o z-{L+;ltaMh0tbblXMecdd6~QM<_@*X{KBM{+N!Wd-=lYunl6uvQ-#=v_s-WnH=w6b zV$$k=ey@+yfBq#qSH0`skG8_gb^+UdC*4>6N$x)WQB$nOYlJSE`)9CjC+(Po@X%^Q z`X@R*Ca^yJgxI9>h%(0TIJBex7wESAapk1^6nFHur4vc8>WKNLl&SoORp#?c+>R}K zX_H#D$%yW|O()YP1^?Ro#w+r*OV~@5No*+=jQ7?(50G<~(SfA(%Z}2?2Q6?=&|~xe z)VXvvvB+~Mnk3W3o~~gluCi<9*%Wh*e;!*sp0iJtGkP}eTnv29W4F>AXY3-ZOW~^5 zbFeYObc&AQEJ4ByC{Pkq=5Y?w(%KMoivmnt$dx$A(S_{9(%&2}uCd~+;SIKHtTjbOtEipacr6wFjA zoD28U04I$sQ3NEz*xM+eL6&@5IyR+VI?X&>XfPcY!&4Z{gxb)*Qc@-7GSAv&VdpZf zK@X_04?)+dVBRGj?Ewp^ zoW?BYK?0-;XEG13BCMY-d^!w_@Imbe`PqO7fs98p2}CAAay18CoexdoZT*22f&2{* zO^lrG#zRvOq@RA8tPPmjfa;wtG#4neoabjjt{g$*2G0Z+o!%&yZ>tS9u3*J-`BtlW z>glKVb&Qq!c`uZ65AtmwM)cv!!gw%STe3G`VgW8v8s>in<1BKgF^xen8cQJX@Rf=xTmNr z&k01QgEMQ`2a6o#cV$BDu(B&S=L6{Vz*H{w_<-jf7tj)14%#cl=dgnfM}SBAT?iVV z)fDnbCNNK*)dscB;4KYk!ccp>s06uGC`Jsef@z5*pxFiJYMh)Ku&OGBtC5z`DsL~) zw}`bj0G3N<@N@AxmcVK@?7?c4f`_m~4E6y5>Y~-c?ZqeTA~aQ^;Oat){lHxZd};vt zjab%_@Xkh%Sqx(MwG!k*C!^0b_;}{|fWhM8Gty<{sa0qXq)!SJGgcQpP{nrzv#BI# z7CBg!mXOVCO9NjH*3%hw(`Lb}|yoJR`*r0GXEuy1NScJ8wT)r&6 zfUItYv#ct=kO8y-dq3r@#FX$W>Bd~w6l<^W3LF&c3u4A_)jd@+mSE^%8JgLu&|dkd zvC<=?rAamolPhw0F-OQi6wPF3>mdC*&^>A?G^yi4#Z6?u*B0t%B@IGTWfg99mOX)1 zRag@ubUgY{CnG%qBxPS7iw+yzE!Wg2gu+``k#&0DexDBf zU?&9O3w_CZstOw#4<$l{FBih@`2c6xLnf9O!zAFf8&sMn2ZFktR$#+!aKnQ9;fbet z7(AI)aTpJ6CN*7MyF?vrAuMBAG;qQnZ2y%h&+hqE40wrPu`1?NBX~ps+47meSlrI> z(#&M1E!W5t2v3o;U4?|#iiJwqhQCBd~ z(1JEVpWO-COHXz8>2^^{-q( z-$G+|0&sHk(`veo_Xy@VXGuqZy?Wq8Np*C3f1}`O&07*AH5)(UJJMUgf0_=Sk+=PZuh*@*Rs+SYXBp%pmVQ~dQUauNppcqHU^Z0P7QkoU94m#{;72J+mM z-k01jNEUjqI*KFT_?vkP%^a$a1SzAVSDL$!lSD~6+uZ^@XMp}TQ8|>YuY2tM&44k6 zMhrz#Rp^#8Wn1dYeKJ7w=vins@O)&HifOQzHQ`i-i6+hTaDXmQEfwQfFvv={Qq!w=%VAy!ctni#| z5{Tk=ue!&s+fqhg3b(iqQ*sC81%8721=hhxJ zk!sz{yGG@(2YX=OTLinTM<=q_+B0|XABL4kkT_91emhw(p5B+%HeX8qz`BiVzbrX* zAI**s=z>dc>%N(v(gnTTs?z7y;Ky(WhE1ZgBJL3(&B-3$^O-psXQ?Bko>6QtshTR^ zj;Y4AE9G@AjYb{=lOflo9+kx%aKfOT-q0_LNtwbjQ``4c}L>bYUtrSJUIXTBeX*~xh$ULcMua` z`_^fI2WJVL=#_d1Oy@V zRMaC=qS7LB>%M>Xrg+#j&v_l26E~|lkyPysty`kce=$6)2A^Cy82Dx7u$L^5B~&jB zF&!1j{}0M72dP7$aP0pi*Z*(LG6J^|5N&PER8pkdS|di~KqQ-v1gsG;vaMB+x#?bn zNTXp%BZFNC5|_fQ!{O!4OuUG&tlg$i5<rv(VdjHqmMty(5I-}*nT?HnY^?kz zy#(LCBboJm!wdlhR$uukK*H|gB$XQ;|7@)S5R0<4mEY3R+BWy-j~~BFh^Z}XYm9a% zMhGp!mdCsVipq9Kt{OqC|9rdNzFo@6u0hPqh`kxX%c3HRM|EoN-FxBe7{0b9Kw{#b zKmT@jJzzlHzOb-_NSm!KcY1mpvbXa$(%)rI53M_Q`NfNc$Vl$juWLG5TRObnEieB? zq{_EE1-jz2YyG!-dPYo*Jce)1fBdj^`O=UX)dwNE?(U(51@%fOBYg!E#I!tlcjn2{ zcbn99AVTIxkLGsmjFU!d_FtRHJ=KiBUSFStp`p7Yx9$fp6Mp{ug?N?KVe8P4bvuNP9(%(38oX2+yUcOkWthkcGt8_IBMEuO{Ig1{)0ekjDAx>t*sC@hO3q;E-2)a>t<|2ix zS5|U)eEd<(=KJ^WeK>mf^u9fbzTS~~7(FvnHz(tL>1n0Oyn+MzXQ&(LR*GBO+a_)f zJwiOpJ9OjDRuAOmRyk_<>tVP2Fa5Hh?0t9F{q?Hmj~{=%vE%PKQ?9ABbz{S=*ln?! zNP9L*L=;+ M|b$m<^!y%J~}n4Wg7!~Vm!%I7J2E^agOOmsZdyZyVqj>DkuO0@Tx znuC2igwnfn*MeM6@At?k(t6ah|J+R4^$TVn?J>q#20fX^hg(nILbSN(AvqQzSOO?!Q_%1Dq8~- zGJ0Kp2I>2LICXD1{Q<(a|M6da4Y)E{H-StkES|W73d2)*-hCtOXK$UN*k>rZ{ztjBJRAK+zn)Dl&@j91fL{(AF8)umJbLl`-AWp_ z;*Vzj*@+xy5gpyJOAYtWGtRpG4HuIemGqQ?2H++Me*SJbAvfR5n-i#NCJwaEs zRy}0@0OC7kS`yd!<>df(+imZ{xu^W(+i$n_ zMt_Q#Lo~~k8zvupV%Lg>g#K%9t$ypDbVx9<RRKw+X2rVX$%QaT2!B-YXK6 z-N%P&PcfXd&$&6|1YNff5;1>M;CFO1P{F!<;Z0FcK{|s+te(j&3F%yXTYAwazc4HM zQTV&^__q!3D)!{vcvs27>MT_8q<=l$9Vy@V|EpR4k8&66f8S7F*Z97%x%2(|rnX^$ z&WGkpkM@6P>3Z9UXqJDz|8QXdi)faIq$57Ik7zV~>_9ZjA1_Wi>3%{q%MqXcquif5 zpB>GNsA;T`yV3P3G2&qGdDqwS*pHnbK0ACFetIwhru$#G`a|@=E=QH*5q>`j)yyCG z&T*jjV^^A@uM3|%+~)tWLU(z{*3p0YrtIzs#;{_&M{qO|iLeJS#Cl@Xqxw9wpmq-O!FTWGnD_=S?b9Sp?-ZLMQY|lp`9#eF;z#D>3 zSG=z%N}59lg)f=v3bl*lpj`ZeE1oWYp3j*>MV!5_vYXUzIXmg`(g1t_1<9NB>#Z$X z&Sg)oYg2sS{uKAdgF)$fa4?bXcDA*bLD9k_(JzQ$xU@BJ+-jzG^L|6;qx(WE7~3ch zIP|?pwYQxI(%&)`rCGVCHD&WfLJ56!u#;AmTF#exN0M}0>>}~{RAnI*u1*AkAND?K5w5_(VQozM{h69^EB8hQ~WGywq(f=Uw-YA9kT0xD`KDk^GFRCHTH zQ|!TxZ3o4!dk4kt-kjz8o-=dGH}m}@Lz^%_p6j`<``&fk)aX4$L#IL%30D!V*?4om z!jbRWt7`)0mr@tw1urnG8`_$awFsENp}l7LPxPPnUWv1IrG{_eH(rsWO;ENM!Y%JHa0jk_Iw15Fl;&;vH=Cmeq3I%cqP8(&7pVU zmS~_K0-_YHRGxFp#V%Fn%4gRy&c7|b(0IdD7_l__Bys1huzjq~y4JPD`O%8DW$u?R ztLN`_iJsD!Bsm{nT0MMRkDhGl|F~{JY}&b;wzaT|d2E_mUW^8b^w%sNeerHun|Tq> zZ&?#_urTJRvwdc!f7^kZr5o?;CMTm<4m(<(68h9l59~J9aUS0FE8M)&)I8LH<(&Fa zMi);8qclFstJux-RGrBnP}0!tkl%mJ^&qpYSiFmfE-eLQ8h}(-IX`daohFLJ-4bZh zTE!W|BAtPHDh{D&4XMFYy<^eh0cp=>G++d9ZwlG#_C9ps%wzp3#GQ9Lu;H036{cAF zQk@F?1?}O^;PzU3u#gGyT}-Y2rcX;$YafEI-X# zG1X_c(KbxPc;lSWbqhA^&8TTRfD;H$tX`4t)@D22~GA<5J)>qrfd#ATbdx0GJnDV>nHi3eOn9FzK+qC@dfW{#)xW z*wK#Tan|l45mS7vuSU|stRB~pW_V3z z$qP9AX-vR{hT-a8cXfba{)}WmY^|R*c21L%5cIgg%Xs{zU<*ea^!Qc^wWI^&wD51I)Z$ULX06WYi6T zZ(q|ZtGtd9ShDCX?|iGO5@;HlN0}|Otfy}`P3uMDf0kt=5?hB<<1x&=GgqT4xP`P! zTAaNg4Y#Ot1ufd1^GXp`d;Qo^TKR^_&I$X0cXN64+qRP?CWT`AMg#inf-MH9u@ne_BkyS_=8Jn4A{s6w zPFQu;G_-T~Ib2F6AXs~NZ)b@i{v(ccrCW78_XG3gGI*o@?B84*6PYFV^}bYU7E!MF zv&d})8`wB9Z3Y4D$_JWoJNl;&ej}#r){%S`-H`Et#Z(j>)n}iwH4@><>Fds7`0F;qE z$4kh`7&Q;L#HHj6b?KFjt6@v{>jc~z1Pfshn<;py9gr=?IZ9Ui3V`*wo&-u>^vQgb z5OY9Wik>M2c;FazW#~khM_<%aaplcZ@G52Q;=AD8jLn#-WZYEjqdxA7c6{PSbc0K@ z#VnMZ?i>Fi&WusKt`<0#T85chyJJ)Jw+(OsH`@6wn7?`rishRhgVYq`aT$UVm$D0O zq3=^yOwNZ!WWwQyRW8FCbD~v2A!%W1Q4dWxLS4#`##rHj$LW<=R>+{{`lsnIUQQ5B ziZHAV(Hl2ItmG{96}VVd88j zVM1_?NG&L>3|MT-FGn@Uc*MbxOfTv%ig9T(IyP4EscuasObCJ6C}kbN(nSq zw-}B_3u|;eyd|>Ln7rt77|1Gp)w$l{e=D0p&0#4X*u#&yW)3$BXeX=+P;-P427GlQ zMJ9vqJ}+LxY=62%d+uzBDzIiUdu6i7wrnI$WtQ$PAj$QYFPwglK4St9v&L69;bej{A9Ep(}%mfZb&spz9+_ynQtUwj)XeCOq~ zWe51#VHm)L0FZ6qOZ*1%Uo5LeJnX zSrGZFi=)gFQdcL?8C|4gK{z|twrVYbwJq;1g<1qNw6|Y~ho#aUK)EYX6MB4U$wE}4 zAq@G`*6QoE!Ldz`+A}pM_ZpZA5Op?kn60pGgIQU#;=9{}w zn2ZCq+8JTNk*|YFO08j4xaDx>A$1G|Glnt1XuF*+zi`PTFBr^0l~q=b@0D+hwNS*xDkWPT?6x9V$KqPzg<=bGgkMQR!2$( zUv1|j)*w1u5>ixo;oFwitu>e#OzOhL-HfkH2PS$wxPw^wTA^*h6 z7+CY_5vXb<6gNN^Idx9A#WtXKOLoNtgyYe-;=$ACy^_73PXX|WbGLXmFSbE5QBMQ5 zlZ5D^(_Y3?k*cr7CZ}QlfC6+lq$>u|PSQAr^lmkL;N;Tb35q!fmfntC_Ok@b`U5j{ z_R|LV^f;!R3m$N1?pWwQXEc~XV2W13H7@UPPfFkiS9>hJP!7ADYu^jsMla^@hKARp zew3h&S9AAp5Mdz>Jp!7aT)HS4Zo+IK3@%lRUas=^5P^kN{}}G;*|Juj(jL#V?q1bq zE>r22*;95Khsz9PAfOnTT$8K$`WT_P0#lgyuwG{Ma3%KJ1!wP3wbQGNe-SA#mPk?K`C&bbB`7sF{Xj&;_EO*4AQyw%;~T~gtAP~wKZp)qL$7K;Y_f2sdX z)Kto|eY$fSBi06rrhKYvmiMHol;d~YKZF-mF{_rv0A_W5xbO00OC85e>`D3`E zbh4@x&Sy;sQ>kMrbb<0xXUGOi^PzwzC z@eJO1C%9`CRx`DF(?hxaKdIXP?1L~v`XK&G)sVq5NBanbmC=nn7!FZRj!`N^10*c! zggovT>EIB-aENBuM>;!3IXXl-IYuK$&CMy6X5`_3ylEflALU>l>Eam0K;GYu zi_kd_MjV3U9PE(~iEuz3bd0cbh;T(7ag26B-q|tS!9JY9h+#NJINC=$BVULS#juZZ zc8GFe#5y}hBPmu(ix30r5D&K)3yTmB_gH=XCCDeYw+pwiS?=l_>FFNl?iTOq8E0W0 zVs9H^X&H(%J6M{BuH_UVtjxtRx-O)~)iKJ$J;u=?%HD3diFFvwJkX92)fif9Z4rtr zpt(B5sj1RwMxJydPliLduWzyy&C}e-9jV3`9lP^$-32|PB}jl4sm4G+85L)&rebPB z3w#@Wgn-k-qjV@_Lkeu-3NLXp2_dT*Qpu*eC#?q$W{|=w`58B(Hf;G zo!zl|>gV?0D;K z!jezT9B=sBh-#|?n;&kQUh1EoyL4@RT=@y!o?DgY;zIIsa%J2E31-6?JfK1oaMi;gzDO7~5(RC5S&<*5<% zTGm}hsML+vg@rxuBqfg)TAs&Z1BRRDk(LdXwV$|gSF9P=*B~;`E{v#3|B`%4c~DVc zk*bUFT;|RX_KrT&`m-|mWEwlIYFV+DZGf+1JW@;X^vPeR^Y*^o^`I!FqPul}d_-!9 zCOgP<&9nN;I|QTa>{gZ~oHW$4-w=EznUVNjeEUGnQ;r9(Vr6+*Vj0UeI>0TlS#N5% zhR2%NZoc-qx;`uyZzkS4Z3a_ENvEjgLIJm>$70$X0rT^mVA=9Ddx$4WsB?M$66)&poGpHVZS%`!i?- zfn;3puTocjS_nR#urj#P686%DQ5%@op2`#daS3#$HwBk*L5B^+5XwQ6B zXXWdf6gmXRwlZ&N4h6CH%wVS)p=f_T@jBtW#ky=F`yn35j;5);3SpxUYui2b9@v=R5uY1}X)-TPr>EIK0@4>sMtZjV*2vr;4>WqGEuBEZw zh_~4d(lv|H-+YrhUfuZa!ztG1?eYqG@^-jP@8FuY;|heT{ehip);?tMJx*-2g2#63 zB7D$qzJQx1{w+gmUyC?`wH#26)~qUMVt#Y_ogKBbS~j7RG2pcR4x!-vMOv-hvG6ZV zIUg@usii0Hw?6g$<5k8byHD3#@8^8F?)hrq(+%&h??2sS;_T<;Z0+3nDURjg`CDPX zv!mP~d!!E{Huv-0xQxS}?f@cBNk*8acf{u{7d#<9~a!u z{raTv)#0yCOTRAI9}hDhV-NgUrLIyqBf5Qd-;VWe4%)!h#eWsDooqBlUUX)xDtgvs zdcRc$bp4nD`#RR1c}>`LqN9NI1VC!h@QLjps#Au&vPKA`HDC=M9Pt8V z6~qH5Y|ychsZ6dp3}1n4WfwZCl&1O&(GM%pfU1d^&H|qvoYtv9Dq~cRIq@)hT)*x_ zrim3V`P4$DRoALQbivUbk{}hHpk7Ce0VOijM-L4WJ}>2^f3WwReE*hG2@S)*W2hei zAzngL^Gx;A;09KPQOZdYCaA)wK%b?durgz|t7N=#o?;qvw&!A4H|%FJF2*@w=vkun zY_z}0N;87)d7VI^1`mg$`{~Ext12ESz@<4oOh&xekVh-m!_(AIK(jl<1I-5kEcyV0 z)MH9-ED%{NJH90sKi&a|b}`pmQzN{_aZsiS9zJ%h_C0N@YMcas6j!>?E$x`dDrSUJ zm`2ud+5=CKBhfFcHtH7LvOwfy>xT!%S$KOZ8N`x~in)rdl+zaOE?*Xw*1f;w`q-1> z6arPOwn?k7#iuL|K2}%xSV(}y`$0|SQrZsoo}X9sC~t?Eb6qeXJ78o_ zHUVYVTQw91uZCH&bBF+ba)@Td1JEizV261c{$rYeJ$E0h)3d1NRNswI8^v!Zo$cKl zjPW?QM!bGUBrR4TQ&YQjZ3EGa2r%Aj$4cPEN(tZxuX`{#fxUH*f=_Ci-3Ae8T(He@ktUGZqae*lqB+dwl#8HfSjttO}z5n;4XA7

OGR_gXOO-XpR3)XD<#i7tdN*oDC3f&F)@z@%+m}XMI7FsGoA!lf1^~e3ChMUemF49%M((?B-sbr_1r)^Q`q@K4BR3;@BrtZ-|A5FTREb{^)qL_dx` zOq`}AY!Mz)OY>J<|KrB@T=&t>4Q-*eeb+7HEBx-&U%0yJE~GuoJg@F2Y%2Lh6B`Ym zVh%9849rBbg+LMJ;XCp7(`V@hFcaItM}O}IP-F#w^Sd?E(f|1|bIGPt%UeLL2Jbb7 z{g*V3l)z>8(};_`H4FwoBFCyiy$7h$ zeIWbDW>lzE41GV=KaaiiL8#`n+{uOJw1KIM&rxI{Dr3V{Y}GJ()A1m;J~t<Fh5rpyq0%z(3SfaT|M6+ECD zR}naZ!GsH`Q$+vn2n$xEDOiDnI3V#iDt{jjRs8Xr`nLwMD z`*DA?s<4XXgmHcCru<4td%;&Lc*unBe%|h%P z4p88TgJo`cq*DMTTZ$!jWAR`mxmyj82x>-Z2=vRKl}Je>aOHT>f>+}lazPP!vG%7{X^;Wg#&Os)8D;>&dEvuE(Xaq6ULn66DR{tiQR z8k;24q<$nX*211?iTt$rtE}dDC#+dV30$y*@9Iz)1dS9$n&p%pr@5Yt1Ywn;U3g&U z{Z^Y~pGD1WWXe`--WD}hF&2rOC0E&wv^nWgn9No}5zGy)1H`RQqbZj0ltgQdz&7|4 zZ>zMw-lGW4%Bs`-4uclkD9!DJaFli&DoLk>?bL3y4UQ^;4Ib1$dE$c)xUHN{{9p@? z-YGim=1gb@1WnYDEt(@Jb!+Mppf&D0wG+?55>Pw#}LcE*^tV(}G+@muN1?O3RdN(Yg!a7!J$>^pq7 z4(>fbZ9GtKR|FR?e23kpsn6@+Eh3G_NYnNkcV`5wAd4^9?Y);f%DKD8z{>0KMt1?F?jZ>*_*#MUW3?!tF>8?)LRrn=0X zcAR<**XmN>9k7@{rFl`~PD>I$ZN7PG2f*jS!mdzh%a67#ky)^}qUypl%wix#_)WP} z%f8a!FJd%q5P$@bz7({TY+LpU0wjHym>VNy9)K9Gh}Ej5YJ#u|gkd0LLJc+@9lMPLf9&nJ zzDtmx5JDg#u|!=D*BC^2)j$MO*Ok7$=_({T7K5mQfsK%(ISH@p=n(Ghn~Emr{l*~(6(ktpaQcW`OC%d2+yYiJ z#uE(?r&eE|iI5BgZ@?-h1cKf&m+*9-R77lL+WMA8Y%B~~@9B{cW)avBQtP>hhn#3l z=m8pd8kwMDqTzt}tcc0V^iD=>S9?a3l||?h=4x%KIikr@U^B${bazcaCE*O! zNcyhGo~wI2V(22tCL+NYIRPWJpNOQZs%nPN7lf?1I!EF0x)rO+Hw5r?$R-q3x`vvu z8lHv_5wa?sOh&|CQ#-qG#HK|IRKz{?VMx;dgNdY0-9u!K7w1E44e?9 zHPD5J(4A!=>kyf>bNk`g*!9t13xD}KM0*VhU16=kM9>K0sv@E)%VAYjVmT5fLQGac zY%#)A5IdGaHbMl}-`4Dscn=$Y1b(zR3lZ3ZIIqaT-O<1u@nVyc$`Oj=WwhkPi3!A) zUG2X*Az=-ow<413a#rT^rTc^ILzgZ|N6gwn|8=HDE(U7ONQR4P8-r-I?oKg?4vTP| z3$mLlm!u#h15s%ak9M&+8_{PGS@v$i!ji?S1I+>g19B{k0{R%$SE3fob)69=^qVSK zFOLY!H>3F(>Du{wW%ImNB1FN{JO;r(h-(|e+J&=Z5eC{v{c2g7!nxN zJFZgkmdp43r>XMytor@KdmnSMGQ=xGJBdjQ9sKR(BPTE!l+qucd-WU7;{QcNB}YLN zwF8J-as0@C$;34s+vuuB{Q1I=QzOhkc||DOx>V7t*mfP6 zRo}hzkCVYn_1Y*=XHUg7TxM<5e^6lZt@4v~!@?V!uux9L*4PoU&>qqP|&21>dR`jX{HvnL<0OD(Iq*^z(#Z_}E z60X!5!2mYzqJPh-ukLRSW$U0JmW}SLDllW15uvkP+4u1(APa9W@}}o6_=4U6v3Y~({On;hdn9AsOgF+e3ZpJ8VD1w-pZt_Hbdf| z_NaG8B)}m%IN_93e;Q5BO7yj#rJq%UHaxq?OLd0~`O!46p8erHI>fB#-z0Aw( zJL-NvRqm|C3Obqc(qcG#?U~Y>(J# zv5_;1md^gxQag{33B%@Fz_*>@ji_LZpb`q#)D6}|F9<2Oi%g^ZPpMPN3|2rOk1O`<8M~mEC$>ByzfEBi^Id^x#XcmLY&=WS@0* zDKJDX9JlywwKn!>?B`6_ zB+S*vUF*?0H96r>JlDWe>D9T!x#+xOt}!#LSMUDhMfWpvNZzN{AUgAOmFH1f`1W2S zQfJlUf6(;&hrP`gJt%%5<6;WSY>!tDr(T{@?%Ui>vm{VHe^^e~=y^}AjfuXd`J$D* z=o;2t*?BJfV_SdN3*B?!Eh(7+z`@47b{WA}6CQqSAHKHNVbkTStCoEvombh%sC^Td z3#&JMltDpV8?UWiZ>MwjozSnZ4qgMvcHFpTQQWB8>}D`d#Lnz<7xvfXSNGD!IAOY8 zCO7iVsJnmYNYv&={xmR`E=kHu9NS9os{kg--d6hm7UKeSs$xno)LhWz$$&r zl#FRvual#S?o?fh_jt>kYSLnNvs?Ouavv-wo}toJw~Tt2dflq?t8miY62NAAwHOSw z2_N;)*@TM5ogd|qwvVk@&TA}o{IgnR28) z+OvXg^6B+k>RcAnQ1rR+9KcKfC8WuKR6R&&3%q4S&!e9mp%T!*d_8>LV*Dr(%weG) z-Ir0n3?!bOXh;bns}$wOz4LAisXcvT@<=|p)0|VTH8Oo;{k`a&7-nWtb@R;~8;|!z zPi6%)JQNLlIdQn!K06~cVR+$506idlbY+C>(bFGaPRYnelmIWJLWf1WrPwm&Gkpv$cbhRCVWWcw||duM2X|RlfIf&D0uBPu@0q z>g?dkfc%=-ZDRZU*@Zr+`vCS;@XPr=PGfA0C=nNt0Wdb*MCI|>H3sP}!h+NJ*N*8P zDiwP_VqeqVF&CtIt~qmF*L3wuPL+pAW|QXhuBIluw%1aM=aRR1E92Kla{bn9NzdzxY{``*yKac<%HV+<4dBNi`pW~zDMrg-C43Q{es?~w6`bso;HWxR3t7gdZv2$ z>~iYgQO2`R_2w*O6z9LKZHu=KslIb9JKS6vG^+pvg)2oXTQ(uvP43pN=RO-y9o5aA ze%8Ww=B;dAV_Nk@ci}Q4C`?r#G#B400vW_OaJ#XEU zx3e^%=~I6Z$G{ivP^+7@OY^v6+OxiKenp4JvSGGa6I@W6=+p9a^4MuF_+P4z$uakm zagh0CpS~G7X*ow@sCy&O20lkW#h0IcxZdoa(~^elRPa$VFvVJ@mAF~lFuW9!n! zn#wsilRZ4)Yr%`8z22+=Qq7H$^PhC%PpURKz^q>HY2$FO>T@aNi}#iD&z?-M8kwt7 z%um}M*-w8zaR$|C`eAQ^Fc7UCPT8ux`E%@ngHvruelIV@s*Rb4tTSG}q@MEzI6JZX z3p&akPka3n$_nv3q3TTgyLRE%eDDQk;i0g9qmyWaE}~v3O-({H%j~|U|5anX;NPDM z3qNbE0K5PeqEH+G^?#QKbP##qe_eC_w;#vQU@?JcfXD;L8Nyh9v6?E4K+q-P4M+q- zLqjj*sByUNos~t{Lh`7+HFED&YHbx}Xy`3%eD7!zWn;J8$suZA#dA^h;g+>G?HnTe zs-FIgKiReM(E;Rnw}?1c^TyI-DRP&IMC7~5?j|m)>#vzzA9ZM8%L~@xtRBIWLDAe` z^EZel$1d#QHXsZSIN;D&M;PqN`n^gIT`EduGO_Pxq_$7tg#Y=0Ge0F9g zw6BZr4)NXiZ~X9v{MK50;y)RGB!_I{EZ#sQ8G6!l8#AuGi#oJ!ZBr^^pdxcPKWT5v z#>+AOwTrEDQD{vMm&9&|4Tn1KFAdF&@@(uEKi%K(WYemFMV>2`cw~6$Z>U{8UY9cx zVir^AnYE+la<6yw>VTf4fVS;Lw>QQ}*DUY$_gd>>ndIY?ak%oY<<=|qmA#CPDhT!3 zd{R80m$p05tdhGduR3?QENy68{;li0eI+Y~xiEg+JB~KyY&*O2OX8B8R_f|-f{$eR z_L_K+r1^5S@fvki({66V_~w)U$6?}k?R~NzS{13tdCdnW8vd_}oV4IY7N$0w%Mr6z z+8L==x`L1IyT0>(lLwG%PFG7a39M;h|G(scEpKw(%J;?`UxOSbvTv8I`j0&D`=KIX{h7)3(`{IYrL|dY*j2Fs6q-Jlc|^-SyAl#@Ht&o1Y`sobOz!r%Nvy z^*61KP#kFp-LrN&KR6KcPk4?4|F2gAyZVue9OG$+zw7WfQlpliKlgJcetk-H6aU|z zKfir?_vg(E7Zw%(td&B5*0M6%jJ4>O2!cMN?p45nRx?!^G50%IW@>3QR?kFc z|GDPe*Z-{E?&Rxd4UCIc&l_FuWj^2H`Lh3cllPa`&yj0R>)GFjiP>h(e{1jG%(f!( zz>Bu1n5-Au;#ME{Ef2hT@w*~tbqk&v`*JzdShuGV8FQ_xWyTG+Un``ji9mW&_tV7Z-_1g!Q$?M-8KJ)SIyFu|kjO@c>FNrL} zBPO=?saLR9-%BR~e|BRiDper1I6(ek`Lp&Fw}*AN*&e}=^H#JEGrDb~PK>(mJRDZ0 zGIYg;@*;E^^94v=isbVf#h`)J{1|4jkK_YO)wBSu2Z$xy(K+Yj274xu++f8RPZR1J zA1?{lHQJPO)mmXxHHg^{OkE1Y_GvWG-FSA?i`t@;t43^ah2zPazSko9fyd1k*?g<{ zI$qnq&)Il0jmONZ=l}-jhvX8W<+sp1+y~f|GB)+6XjD0YOa3Puy(K4K)i7A6d&_0} zrP49ihm#BZaJ22@(o>X2^HMqbvYd{2YVRXMuIV4Fzv%APkp`$949laz$ zZiG8;(Q{#z(dF;l0d=d&`U%`p-qm-D0=Q%LD|2$iABNv8iLtL1e^%n%{2t5% zsnnRFe+Cs-DkrEqx?6v#3*tVKfb2^*D#;C(8pe^d1v3I4E09inG5<$U>0qM4^5*XL zcsDR;52lFSak-IV0+fvLi=z0| z5{Txind(RZW20sv`89)1BB4l9o>0$%E%Iv=J$)OFCjFAo6uE?eC#8I{_Cx21r@I4np?S@ClRWA}spIUYVoTk?~@z=lgBD(SW5R7aP7$2~obW zbcX`PB=$RS$+r=d{KZvl=7-37yGd>R8G*5uS@W6M^l5{y2a>hYI`{Z#Q}(~ILFpW$ z4L9za0+az31+uz78kqLR)&X{~THEB=m$tg@!c2E`t0@3c)-x8M+BY{kuzBgH5-&4& zElM#|C$kMwx>X5|t(KHp00-kw7XL-fw}&g$cpa0@2Jb}mhiO^%R+f?m^zF1l3^Tn zNGkOvHG!0sHCR_c!_pz71;rE6#IA@#71%-- z9tgdxlahC4jyiZX)Vue|;gzz0j01}MRSWGxYQof%A&ij*+DMnL2+lF(vtY+|CjR$E-I`a`8>rA`IW zOD-^ONq(AMAWYsVw(|pJXhW;#P;RClt&{P@LISQEzROy5d<{%805#|KI^?BK*UWD` zNy_obA~zip=H3BRvgb#%L0E+M=q{xWGRaoSDTCy`{zFeNxyH8SD8&ZtTMWSFygsSp zJf+-Q2xV~YZi%{9L3*uo$t|s0w1LetJkG#rXNFf~Cyp7+SOwzmO{rK%PG5<02t=<^ zsKsBa(0a)|W_Js0tOCOpv>tOlArp%YOEmh(=Q?ZYr5R#}`Oy>jITy)DI%r)wLLG6b z(2=JLH9G-}zMvAh46by6WDpZzsh?7Un$jM%uD%hy0%5HhLdLCLKSQ%O$M+@ zb$1|DFwEz5eDORXsRtTC# zuo^PFR~aaHY&TC>Wpmt!%GL|GB_UH+mKF%l;aQ{hR?V=*V@UI9$|ki6(U7D*5<#8?)ZJ!`f14Qi|OuE2-uY4)NA$$x#m_*djo% zT!9;qZTRCAVGO_*@Nx4VSd}T%l%)z=CM0BfZkB@GQvPEU*&QJID)8ZX| zmqB&{1YSDCwQ`3NCXOb-Wxggj-9epMP}C6OD!ZjPUk0I4i6K6Kti&iPLuE>=1~V{@ zCv2ai)julW695wplJ0zj-tsWdVFIiHPVg`ruqZPCbx(p%RN@qV5LpK5h#O?GhVwd& zfA$o`&5RiS`8`J_x)hUMoiGlj4j56I!6Wgc*P zEEp?wQy+5oWDp!AxIeir1>ZnBfM_ZvXo~TNdCuu#uuwr%<3p-akm>2KCB|FPFb{8) zF*aqrr9u}3kdw^8M@BSJqJ6ne`}#a=7^roO5DEioX9RdkQ6@YTD$~iC2YvYhFcnaP zq*QC+HcB6WcE~bKMV$Q#$Vq}(0+W1cSSuc?f&ujaP@WR|etnCJ7~H`PcxaAsmqVk< zX4+-<_gD;@kK3vaSxcZ;7&Mcl1WPfc@=QB1=qE?L5}}agR96NBQAk=+oKy)WPp;)D zpiu;*v~imxP#yytKmh1Wq9(t?Rskf-i9RsNSwTc9-2-4~EleyFlaf-wISEdc59Mxi zbLF8wGCOP0yllpHErvfG#(e!sZsnskGN2uDaF3D{DkI8yDqXbtB{B7MR%GSWCVDrs zD}p#EWxNv;uPbp30m$Gso)dxCPxj-PjSRSPw7>D$g1ixsf!E}!$6$gMfXe3rECt&C zb1bDfB=c?vF=o$UHu0^MV+2FR1i*yJLZ$gCssM4g26R$DDe|qF3?FGKP>8HE@x_{q zHd8FnAd!$aWL=vrLkZV$xTs7X9+`_H9mh@bAU}99mtVevk7g93MG}Z~2Gw!^GckcO zHBin@3{vG4EZ%-DOaPw44oK9rb#10BE~3eBe3WP7d0J zP|9@L?PrO0GSm|)#Fb!|Bk`zCP%0+TQ2>RHaR9K1MOkZkkTH;-&c|m<_oe4Ul@eU} zA~2QbsV^H;9XJ6+jyw!buYBM%soB3u2`NU2TIk;p0zQ zLz@^-+AzjPfvRPyjs|zJQT7bPJIKTGL9!t$EryFD4>9i1b~VG!_uuULa}vD)qBaD`=~s;T=QYsBXTMbMRxgG$W!O-;vzCAm$j1ac>{gG*wu)7LO4VNR zRc(-NKv}6FjP)#rtN17zKGwwc*cwKkDX%wAL0WXCw^Twr1P}}J!2&%@z>ij=1vZ{d z!#Z6h3269j4gHOU2HlGzZX3u9CH!6_0* zr0g*5-Cw>a+*^u8J>Z>W;A5rT+7iODH>4kZI17KjgYW@gKG8%D`ITUAE1+5h>f55g zJPCH}Hjl}`cgjx2$w6-krd3*}CcqRhP)CbZj(K(U;?wM>f>0DJP8hU(B$6d2@8SVh zJqE6G2LS%S^Z_rUv|ZN|cKz97H&svWHx0eZKl}?;S*cD~%_qljRrk~O5Gi24oHVlm zzSwZ~^)WB9xal1SrZce1r5JlTcv8mj;p58`L^RS=y}&~s+Cfm|Nt4Zf%uGU zhv6n1@168QFWH8swo0iAy~gPr8ayiDwEE)ts_O8#Jus<1g_)=$V*ViNenodORX^8@?& zs4t60zrG`o24F0Vv*8Y7=&1NE$SJgDN`k2pgNxwP!Ajz`lG8n$Lnom~r*QCl#imoN zG?jUKZNZs?+2HkqUI)j(fuFe8g-S5?6ZC*rcq)7Mb*}2TByyI$WjzlsVOp2bZ8 zVN#VS+8#IcE4>4-mh?!(R}@)>a~7lAVPZonct#FIzhP;)3}?xYVt;x=C1O=R{?2V@ zkrbOH?WP{^L;9PrS8+Zx)Mjpvk8I3>2i=kNg#I9hO0Sp7aG{Lr?p{8&D+p%-(c1+c z>f)wNypgzuk;Y)u%WIw%VlccIVlz<>-=jk1*F$M2)0!dQ((d$1IJp?}0Rvo+p)8bm zCLiTp+#`UA?I#)ACD=}2`29&-w{-sn(~IxVEbd{VbKw10=^6(a_D?B_EkSF0fwjC- z5mKT^dfj#5!*ypyv$i5whk<%lB5&fOL~?H|0}PNrNlJ3=uZt}|iHp-tANRs+d~bL1 zA+>lG?!E=Nf7ZEjjJe+*(t#((>l+v{m3kRDW#2%J_r3JZ_sH_eMjqxm4M%VR?=eYl zV1ie5D8?V!D_1?hz&+C;)keDufu`{iuzCx2w>Nz7J&T|Tl6k&=GEmulZmxV(pTZ;S z4c<^jx+9aEyXFJibjuoXTjlmzJU|MN?#PjE{FEmXrO8EG8Z6Sz_AG_Ts(g&vZTsTq zxMVr*i8?snCaXe}uF_-n(hVw+5mJ~~!R@o<_t`|DJ(QS4T}XlTr3)~+3zF(xW}({R z+ctN`l9dywLlCqwG2|dlQk+$>19eFX9%e2Rj6qg3EZGe_2tY%dBX)fUKe_C5Ki&Q8 zS=?IXldV#BEj}I@i4C`c3YDboFR+u6?ao|mp;A0!56`ZIZI#yXy*NK>R5r?SnODFW zb?}U`lk?%Cn!NNV4dtu2)48I{wHdn{1svrey>9U0wXk!#X8Z@r6%$VXr@QxLlgxK<@=mk2j#*#=r@M>Px1INgA+H9&69W zTxC4K(O>0ClWe~!G+)s3i z#P%y77X@kfBG@XVD6HwZlYCV!_egO*Dp?9$d4#*vj_#DAT?+oRl9B#e3*3@mjg|P}dzq86 zsTW0A6*5SbK?vizxWV}MCMavgscQV-8i_b*p12|5%|j`+)C#4=$JhX*{oF+yiAs>b zfx^STV&WU~!6O2k2NTbMNoETIw1XDdp@0Syf2H$Cx0Qrc8Lm|Zg)GH2FfJY6ar)vS zYH1F}lC(bm0OK_xeEH_HNjnO~S3P(xn9 zmcEwF)ivVRN(O=OnTrRBhAqtIxv|k*$*KktAg?k=WDNW``|&xDK{DE1k-$%XQ-jyH zahDws6Vlau1PPu}%I&IsVz~E?i||%TrGYWq;CkKu+^yc>E`m&o#ZoojDjU%VJ>a?u z$v190<6>3_cx4-@P{4g947jn&ryNUGTwEk?_uCV=E8+9oJ7?qepXV)4TyR>X!*I2# z{IK0X$3Rbv4;*MRdv>Gn5!Rt=*zCEwPP~(Un8DoZW)9Hrp5Zx1UmbG!jX`GQ&Kqv- zPIby@@0R)9PTpqeX0?r9fnxlvPiwH&VOc}JimfVQ=Ht?^=DWYC2}lOvek#63CPHkO zQIP_TYs)mR)`d^^Y1(TPnAKagO`29~eB@S;S$=xY>%&#%mv6N#=3MS@b+G1B!o0KI zK}qW;Q)_gzPLH=5+4219OuqFW6{<%RqW9u2N_%Cf{J8)t3$|H!oqFUQHkO(uv8WCY zoHFe&u&5fL`wB{%Ii~3_rqL?QHN4KsXvPj&TCn|q3)NHkqA6e@g^6zUeF!1{pt%n! z)bunH>uUc8b?+GsSL45X?-^re7{lIUF!~Im_g;b+2BVkgy|<8z-eoX4F-OhIZ?*IQeYdz<@I_o)WJ(d^Vc{6Li`?~h$x-NfpQSNFY zdlNKJv>w+fBsL`P!tThQT`#p&TYACct}&W;PwMALavjkZvfxpb|4PB@gps&w6>?*4 zP;llUSNCI#YH1}q@&~?_Mu@MCJ`fe2ISK~tC(7~0sx!IDcI-D3nWtQJL{>AXwC*ail%_QPyhS zZTUW!GP2-=L}4{Z2#kaj)A;S-Ey+xCw3!7%Ah=w!FBpYOAB9ga-1w2WfumAOQ_Ib)=Ro1Bnv#bxh>{lq%$Fhy6M?VK|vo5^l zTEdWm&7ZaX)bu{GRC=n<@W59@->I`-ZwKMivowYPo^RI*^suzJ`4~}P^SmCqeFC74 z&}OpNn!dw52mQ=Rq_nou)&ZjqZ`EJHKaD?g;e9*UQY+GEA#V-B9%nrfMJ`=VHSUN< zEMMCXcyq$Dr#eTT-SUI>%erxNx`m^+GdXA%XH%5x5-UTl^%k*1(dt%oSFt*uBW{4C z@it_pJm^b%{J5d@hd;r&!dyqch%J}szYie@l}wNf8z;V4O(TN6k&<7BY|L_BC80NI z((=nlvCa0P#)~1+LMLoUh7i)F;yJOKWNMrX=t=`@tW^GGtJHhtcpyU2Y7zJlvQ%+s z%|X%h2gns&z&~X^Ayx$GJlL$#>2SC$AmfcVdLgRr&(8?WeN!4C!h#Jaq4qB|7jE<) zvf!F>xhk9(at6DwHC=c;Tz)sR^!9AyJsud?#EiW`B-YdlzQ56B#i({lJvo8qkD<#p zMgy61_e;LYGHKLdlJSOy4s{#)`*16OvxgD4u z=j#Pr%Ts5MN^{3Btc=}i@`*pxtaIF}74c`zt6=XUBe6&NH_$YKL?7=&)-B4Bf>|l4XRa~gh zMemcybKP6}BjUp4%DvBee(T8(P}%WH%=1LAo>chD*Z|RKkC_8=eN~d(F>j20=8Des zwnh|*hVSruX#E;Uy|&x?&+wzmG9xGcijYUJRUY37A04`GwI{JY>oGU!yfn@Qh$`9< z@Rksan7_6sb?{=q$J8_gYSIE2KUj$J_ZoVtw^z95;L{iKaNlo$MrvXAQvhp#_*|v|DeDKHZ3!=o{Ic4c-`~ypRAvB7U;Bi7Y|p~zcwaUr`4IX@BfrGPWqG<(Wj3@va}Yf{H#Lr1VFbeQ&ypAf0X6YZ7g-_wH!1b#lAVWq2y~ z;Y?Lga)+F0jGfoRdkquGU3!;eoYEfNKQfWrW@Q?imiKV>n03lYkIS*1=N~>eU6gXv z)^xXTf&AS0iIm=y%ew==Kb$|%o6=YKXLqQ`qlN3%sb?zH;v(<*F5WFl9q2TTkCh%? zoL5gC9K0OAC+*RrmWkA%_}}q~4UZnb?maj3;E8+k`A1Ja6@BlXH~kbh@#yLIiL@)S zj(c;{+@5Wr(?^D%J=vT8*>wqHlRkDVfLV0Rby=V|eLU?6vn>a#;cdODT+y)vd@PE6Mv{f>(Wp!!S`m zPFcap+bU6ksP6)p3{*chBAE(e6#GlpxB!r*>L<)Y>8+my5pr8CuL(G5n83~m%G{qc zK!((G)V*2$eR6o!Q>8C@t5##(8WiO0>||`!G2vp`xvC#sYKpv zn^I8Jb5cyo@Jct=+ugaN@MrX}qa8EAsUnfdF_w={4mj>Y&)yd`P_t*6CcTfLQc%46 zimCc;HCb<%QrRJ%5gNpTxtNUL-nRV5eYTZBW(Pln_S@=Z&x9S13pxk`EH@n*13U^} zx*RLz2?*2b{^Z^h#b|F=Pt}wP^%8Yw#UIs|j?0w{g_(KCR)OHb4$}a9W!o0WiADm$(xL`k7$C~f|=|Viyd9z^~XAr$-d8$~EZ-4gCuCTl1 zy3Xo5N=GPVhegZJNQnL0g?Pwr@T7+T`m6*U9Zaz3Fs8kFjK#1@%RJkJ;Z6w!Tep}O zHxAjKhj9kakZgntAFHVX?$y0DsK3HpW9PBKWuGEV_O)P|zpu4Ry$;#dO#^tLVnXCZV{bq6EnTgw7h;!eS0Cnt1qNo4YpNH)#KfH43!7ge+lAc25 z-PV%rKLh$6r@o8N-i+T34ib3YawODgICIHJB$?MDnAi2*DTxQG)7`3VF&y0xy^eS1 z0gNisfxIyXUJ&KxsT~Fy7b#=1Q(1%>g~f@dbfTs1+Jr<}i`%Gsr)RN(sDWyAlM&C% z4MFpIR|3Ud>G8e4q_$Jrs-q>*Hol_ceU^I{pbiit<}O^@s9f+FPHhK#4CT2`FO>(T zv%#IZw92}Jl3IqYr+|^ir|*Y196B+t7=NJ}D;!2WF^c0EKh7f$umT-~>{e2qVym|< zKo27^>V`$Eozz~S@FGeWA{vkl+@lrv&rcNEn{C3WZ8HcdD3;8o-HlfNx!RGG$x=Bj z(J>*?2XG?Z^j%lKn2jX%S*W5f)84+n^!?+-y;6*KMdASK56ng@2zYRnsC@eUdD><$ z_{*%<-alU#qE7#TQ`?{Zd|xWo_?qXCrttYFUKQ1Mrs^jz+wCbCliC<(oAHH?Y%Ng7WsL9oSUZGnpxF?b z=}ZC?*#x;wY{e`q%cM~T#oY!eM6Z`Ob+^-{Xn4)$1ZHS9L+tM4L>EtJB|a}q{B^XB zkrcb){ml^^{}`a)c^6>mntOaJsWIoR;fQ7+WVEP^W2!Yesk#hmL=8|-5zH$Nm}3D} zA+I|bp{6;Bwl=y^6ixs-i4jpm7U&roj#OL*Y|yO=iqkKvJ^Rt>MjPenx+oq(zZ~#w z)gGS_B0u)!wzz`!RMXlB0`sPTHs*o=%%4+;OOx_Dxo&zjuYe7-5^3>JmWtWeEoE`lvZGnJ(-_6`4mF}hHHNy| zQ7wW?Xc?#c2Swo?GNPRp+B#>PPsfh80EQ}l0?+4)X6xmJ7OZyaaNUa7zplg|+(}9g z;W!^3A)6Z>Cz>%iSEbn9!fTF5>ktkRL?%$_+a0Gex>OiK)$9LD=$Gu@*WRIg#&<3D7%yY#7d+) zxyWjBb8*_D{?3Mz=4PLTJazGra;r7do*=ziMaTaUtwQB&w22{nkN8wGK79S-^>>dyI5+R{yz0@JlE*2+Qo zccPT*{t3!R$#8{7KG$o)U+q$kDUk%s320XUC&dSdW}EXKv{3X>ddo@GrAy&mKhT0J z!3S={lM;EwmifOQpNOOmm-=&C@GXNuX077rg!k&D@!%UV)S|CxX_({&%RE^Y42ibD zqsfyrhezc5hAM{b3*ZM|E=hp(?Y!JZn39DNxMEdOAg+zyKO&9;?n z28cC)1eposHum>

am}_W?(2TOk!A>`pNA(oxSXm5 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 Hi`e}S1S%5$ literal 0 HcmV?d00001 diff --git a/docs/assets/url-bar.png b/docs/assets/url-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..95214ab229d36fa57ef86da208fff7925cae520a GIT binary patch literal 25284 zcmeFYWpo|8vMy?7iZNz8j+vR6851)zGgHionVFfHX__HsW@e6=?KiXbK4)daulMhc zdwX=Z)RL-7^+_s8r8$2n$cZDu;lP1_fFMdrh$w-8Kp+9*g)mUSx5oO|BnSvxrMa-M zf~2r8k%EJ*iMf?A2#Cawgd}JMWp%7?7oJDNIiw<7Il-SK$iKy-Xu!ZscZ*4Y1)>^A zpj1^XnCet&;4-5-5jcR$E< zJkN05NQVbePau!U?=1x}`ffb^3xv?aN{a`70huTpp|}f5?bm}k>Q^;21_2|Bmo~5V z5H}Ks6%U?y0N}kUmkh<^67*XSiX6JpB{K@&k3;HC5h`$y2CN!f`WVT97DWA0bV`&h z=$&+);eefVj&3uCEi~+Lv1B-q%)TATI8dUg58S+IS>b)e?j%;!nBV(gq*3lhhlbFJ zyb$yq`=D!L26mXy-ciXPZ5h!p7~R{AAmuBKg?@GB(nxaA-@mU$zSCkKU6tUOe2-Pi z_uCpOjyzoosF$hq@BiT_RHXJf`B&B^y1U*i`gPsnr83RtqXUNH%mIYFee6(H-glB6 z5xE+M5qg8rf|RXLElDLd%TV{}qxP$MiXdLmA;rE4=^x=K+g6G<>6GJAVViQ#)fg@% zJX(qX1-wn>j0N4AyYO;AxoV%{XhMMq6xIBATBR<9iR|EL=$BbCl&2@zXA#O5QYJ!C zI!TY@9^GVu>}peEaft$_R@@X!#^mkWMJ!Jda>RX!}D0SUuzM zyHcXVluTUkoccms;-gI|l1)twt`K@J?Q%Xy7v^XOD7o5cjTIHpT|29bi;G9*xUS3~ z61+4m&wLap-}wbuE;0Bp1M9JgInq$r~7gLg7P7P3G|mh zfyM;mlK{n**pu#Js>VV8_Nf}%3ffo?c@Y}PFK?5>48pVv(hge-I%AX04WU(#&EDn>LCIHq0DGPbc7&bdj+s~gdfD5^#~g97=rx@*ebAJgaHCY z+3=HJis3zAZUw+6xewvP{UsSN<^#qy)fv!Cy0th^bwJ2_!?t)h2-jhfdcOSn&ls}aiK*-&spWc%s*ZMx2T=JhqJwHI|x8IVF|depag>~c5= z_P-?TT*S5WX!zaqaOy|ixk097YMuCPow z`hupZ5CmsLaKydfgkb#OJTZhkiab^^XEFJR9|JNwpLeVWDh7nfpvZ{HMr15x2vSgG zQVJ;xxn)*l#YaDyFq)i<;*33Ery?McL@D;V8OX8SGwE9C82b!@S$5Y;)GZoMnZs&w zsTZmxYOdG&SEN^nd~GXlH8C)09Y>!iPj%l&H5#iOZ>+32ugO`0SShbDuXkr2G5Y#a zPFuHZ>fPjAE8DbY`@AT(MmJ;=pD}^*4_zAo=#>f~3u%h{8Ywim7Kxlr zAxA8ClCF`_$=Svsone^)ttF#{szs%B&RjCeun)D5p&DKmbt1LET$#0&zGh@Ixc27M zB*~XHo70U-LyM=$c+ezQ0yUH#Dc_{!kMFt86=rAAK`>Jb2Nps zf*E@-LozbMGH}_Nyw1by+I|^toqdS^F8U#agiq{A#3s}W&zOKT$|Bsd|uQY zTxGl&d~RwN_tRUBGY&;9Wga>{t~Y^~UpxT!m4n+c*Hm4G_jRxV|8z)IEDL%WT{oAQ zpP$xq(O{DUlLLEUb=`B?sn+d2k=J~(|30yQu?fI*gKva|3MA+;*c$m9mA{?;W)!ts zF$_+rLrF>*@Tsv_=7x=x!CC%TLc?siyT0Zo`KA@YOH62hvZj?ob~UjiDV0;%5TEkbfMBI&Mp1%Za1z z{^P-GJ95Q!T1^bB;Jm-DV}6 zA1JpTUl`F%*mxH1LS}{h2|4Zme6qT5_W0p7?{F~k7U{&b@?D35qW!Cpri#*yGq`VW zL)NJe)vLLc;q*YH?0A}s?SKuYZD&)zX45ljWaW8roBgb}~MvbM&x)Rqk=#bq{~{+`Igv;ZP4LZ+-CD=oN<9*W<`d5*kqSpLGwdwP&9m3{LyG ztsPgm=xhT=`LW4thPwP?}ksT|)bWUEoks}E;LVAO!#Uf1G@P!*JK@}#R-IA9aYo=e6d?F zN4eudB#VzuZFit{!8M)0M!OpBMVQR<0WkYI@gZE?8R8x99g=S!%6EqFE z;IY9V(7-QL;NzAJ_CKW|kg~!5Ck|2w%mWcr7M7F*hRTKx#>O^|X0}eySXfiQ1Xw!> zbw>~oOw!*EsHD>8UqJo~<|=AVYO*q1hPKvp`bM?}#&mAhcE9<6@VIdSqt?bw`b2Kl zRyK}YZoHrVD!~Pe|4yd=MD$k?CrjQ>YO)GM!nO{^L~L{nbPS*P;E0HbcpQvOxRgZ1 z{z(q};{9aimT(rb~FE5l8xg()dDI=|2v1Ck&c1> ze|ZB*d48vIDVVz%Td9kfTLUoz%HU&UW8?X&{D0*9E%6UZwLd5sm^uC={Uht&NxwK6 zI|$oa17$k#{oP*wB>pq=pM*U0zg7POihtnzS1J%_J~$rw|7|orxFKf3Z@_lMGZ&Fp z0fxX{_SdBhd{Y3Q-y!h9>&AO<9RY?Bk|KgCZlI@Yu3jo%a0V{1@?F7lK07hoe47?T zQQ-1dBccekh7^GuVN+F~ZK$UBiXM}zR*V_FJssvWJIS3Kh>FUU6Iy-1>lOk#Dk~K0 zC-Z>MZ}hXnapXSIchz*z~s8A^iU_|34U( zXixySdaY3m4k^{o#0Lsa@4I^hw?I54u@4lA)y2D`iNbQ}oTQh7NG9>U+Z=y(6(TfP z6g;D@FwV0Y*L=xG4b&t%iJpyCdAU~~E^vYZUnI(B#HDU5=Yy4{A$w*E^?QT`LyEgy6B_tnH_+gm=LJcxbqyfAlrK6V1(3 zXlQK5tV#j6S1 ze6`M=>4(=rqux&Z60Uec0{l<1)U%C(l4nhxM#luuIOz5808#%dOc^8R^*|_`E)MIR zOnfHCS0zqYK4-u1I(*$IkD2ujLC;}Zo79ZL=Sw6Mmw}7K;h1ZYDC!PPjk_$JZb3dn zg$W2KR_QegcB77u=`xxf3XRE|!NGr8mxU^UU^pZKg8NV_{^}8(2%aTJ$zd?j0>LGm zE4_@n*g+?Je%rSbo-23t=A8uu_kIWC3CbF9(?vsRX}fIp(Yes1q>9U_TwZ!6M@uzE zEu1gq#`5;PnP;`uy7i~LwHt4(x_r&?Dzxf?KQRz%Mv^YnNTeGpJr3N?&ac3vE0RQSY9Yr?eO>37GAD9Cocl491y$DIC`icc!#$}KNVuo;c7hCelqo(*XEOpuYHv(*J3eEQyz(5 z$lx^I>_nTq*eHgksViuk%Kv<1U=7O)(Qr0Z9e_TjyXYw5$WE6u$Ee9uHS_ej;u-J} zPb6hiFXzDSD(xNF>7m<4ndDQ8rEaHL@$PVnG+Xi(k%x7|LHA74hG~>uN4 zp+cYw0vdVVn*PGoeO;$mGvqFI&a;uM)ohD6VV98BQ|ja=qNuN^^YT{QppnC(jy-kkDwnTMneZ zXb9Ekh0yml*<4D@6; zTUQERe|2Tf@^hEKu{mDJcBGJaTnCJ??R_n3{s-H>Br>9tF9#CnP7omy-zAGxr6dx_pZvqT-4 z!AHy`BC^tCc_8_n(L$|ppA{BKL#2eiVML`7knYQ2YL#m!KN6O{Lr+qNVt^CO*p zWygRgZAPCFhiZ2;Q}}D@GSqUfs3-5kamwc7BnF>k)GK#)HzxC}u&Kx-F}}v)rC!g6 zVN0D8ce9y`zR_E0t6wpz`uj`=t3~~gSpEUK^=grS+fadhEFgw@PJJL#CAhbRjX%@w zJt}1q4EBtCHuPghRw0h712YYE6NlEYT4S-sG$oc*%qfJqcnyVvte;&a>vEz-elQpD zWG#@dg9=-{_&;;8ZNKubgIVrUxP5<=QZLk=J>LuBqgFit)00P>>k$dOz-s=9jWFPCDU_Z&XD8h4-)m*b6<}l(~*5p`7mwmqj z$2mq2KdY9|-F?64YTUmMpdo+!Sh#8vj87A#LvPL3Qk_}%O6}gha^v-J=}h!FrXF3~ zt6q@Yy-nG-Eh8QZy7kJGx=8B%B4lyG{r!?|`5{X^Z@1!6*8}t9^4Oj{nE;9v+7;`p zVr#AbttUSON^(TX`D{g%o1?kLP5nr%EM@I}HG*2k+iz?=B&qNqCrC!W@5%a+d8#YVNNyAJlB%Dy%}N4rM!BJFuzdyWV6fqD;#f92EANk_eis@sT8ntF3%_f@ZX=t(RoLy^1jN% zn34lduItOtsi{Yvw3BJKEuf&6jo-QlGES@Zp2s*|>62uo7ka`q;5Wz9G?pC+xLngs z8zB&3SSS{q?XqOFSZCS$6S+^X<@e>=%NIiBn~m0GqFz0rp$!vdV!%zl`&aGD zJi5)!hI}+X7Wq5}gA_ZhkNsyK$@;y7sjuu(SANwUe83tZj4vL_iJW>{xQQ}aoVMjv zJ!-@~8D`&Ku(Ngz_hM7r5}J_m<-?wC0q`gR;=I3{^Jj>Lk#U{Phq8~{MblPPYFUzvPY zclzGOUq%P|2(LVDfnLl|OpSJ&Za=wz#maqJr4|uRPl#)_is+%k8{FK@^snEsODE4J za^UiOpVsd_P5OU-!hc}(h#TFgpH~0!6CxqH?WD1mef46jm1DNIPKYWq|F>n)t15YC zp!@NJ+#nT_g8d0+F;B+E1kOJ|MN5Xy{}202hB>6r-M!)CrkguP|F(=e>UQm>EMd10 z!=VZ2T44QEscmOY?=QV@-zhoI1*I{uIgP1NoqS`7Nz8Sdhp9PRsLX++dzXQb@}6M! zJw~N1vAesrxMAAGjenu{8UxSmnG~zt>;9MC6eVtzn4O(w0~D$b)o7-))WB|ArV|r< zXzCU;@(bsS-su%KTXA!X)fZeMFBAX3nZo4knI5V51f;DoD}0EGkZ1y0-n$D3Xzp#- z;a%N>7J|fJhO^$Z~-yf^(otC=YTj@SO zInoAzS3FOi&rri7otG{NiHWuw$rsF3lN%e4Lg^M6Z=}5?xfa;B*a4uSn^JW9d&jDF zmgoDdVmNV=Ru0}C@`M?l8pEqaQIf1QX%VS|(>##XjS49ln%B{BZfw{SN~p%lW)s{h z8uWr0^2McpPq>1oF|WB>A(~}hT5FH&6*lPRaiBF$x+*^4H4p#d`*VC32?#(#Cxj-( zewhfbQ9Zwetr`iOtJAL9_H^YV=RI+*29SkxP7{lY-d*hv(b6~g%*rhk%MFHr~!t~W{u8t2c?dL`d@MI>Py!pECRpQ4rU9ZIeqsB zq+#;R_Jqheo?Q8=W~}5}#h@&q;*!qH(>Q&Vzc$pk2e#4h0!Oj61>S7EFfCv9fM9AB zF7Dq0Phisn73OeLz_(`Y`r^ptYtYt6Cl>zkX4z5lqo_Pm((lbT&J1-<%29?LskK~I zRK8pZ)z!?n#1Y4~`a+Zka>yamQx%i#%0%S}SpyO43}a#8px{({kkJY}R;X;N>|XI8 zc6`w{E5vj?@iH)2w7vPTj`A{?8hjiCE@q05rTq#?P!}LL#q?O0^2rc#OP=^#g)R5d_eZ zN7V>_tQSw@iLwL0JG91CLb*=-<>rbFU+JyoSl$n#n`ILj`2~EBmYa z8C1UJw!Y_&p^VwLhF7N*_e(o+7dX&3IQ1p#YQPGCwIC<_B7y z;+;3-tY!|+;Hopo19~eH>BB?yoAFV4o{0?dim^-cV*8&Ty_tMtALriE>xK??=2n5T zY_&-e_HxbERSy0-vk=W%r$(Z+?#^{{20JVg9xTBhW>i1`5{!>y5(k2xpIa<+my)7Q zmbf1v`>L>?ru!6?#Yw4AmaRQE!1NI56Wa>`VtH>9w@-MBiHM#4d-L{qm-D{7gl1x^ zt#3)lp*&}9_6xYex>70=KRcd~@evoRdgy*UG>+1U@SWKp54B<5x`911Ddg2^cWf}_ zNw#n0YwOoGEBmwbkQ zMrs;te(j=j|8?S5%jXi}?JYcCp4&it^D-x-=>ZMR&qqh@{#y^>$XJ#(vSXuB~EpY80a| zmap%Q42Wdz4R;t18}kSU8i_ zx{937Veq#1JAZGWd7E$+uA#C=aK zk}%W=0ACY-H(4|ORDsq$81#rR+%D=BI}LjF!n-S&s$L;?=IfwU zVhe6uRf}E2Z;L|hTA4I0*e@CY#(O7B#xhkcAPiz{I_7#Pu6$#E(n)a;&l9ywlB2#j z7CVD5Jb4ShKYpNIC?A=@W#gfl&Zs|zz0_=4RK9Yi6UZ_J?e6#Y3fiJmch!GW0S(c`-{A@?15VG4_WO;F&#K zn$^*<{d%;1w|P8IY8j^_dn{%j)!iCQovE1Kv)fUW<^U0EmRs_#1x8=y1^=Eu zLHuMs*^LE&`*K+Df@Of}g&cVhCT%{O3@`ZHnv}V962YB7D1f9#82np4?vx-lWo?kQW@@J=z}~_G-3%1VfIqwohN{dH;)( zUjUNH*siNU*4Hl?RGAcj-FP{c!?8!V2>cH}E&V3&=B933U)_PWICzw{N_h}hHJqsUB7T;l!JL$%#R*m3=zq*~t z>6Tp*{4o;)c?ghU5OECUW3d$!-S&Iak65$M$5G;94u=*y*N(`Tw=9enqoh|wtI#O@ zltWbKqv(_KU35GZc(k9Hj<-p@{bSeid%9%u1L+ndYyNJ|8Fb&qLykOu7QIU*m*O9J z@5?H%Z>62G>p>&(M}q-%9P$DlVx(N8>Re(2`%{d|7u=O23h90NPyN@>OG|{?XhtE$O-;0FaxE$kO|mrvTLw~|2cGi>%0k%f(P-& zx{L5{)kpc22GZ@fVYbBZuONYd`Oyp5p*$=^GykzD_)Cv2TcC8GJmcPfYY!NRP9PMU zy29iCsxFWo0Q9>*L?j}T{69th2ekjYTjZB7@NDw^ooFOF69k0A|M$VdsT~(cL0cD=8a%-*Z!ku1wZ>VIbM4;z5D}vdx1O&KYb+M_PoEAc6u)Gx#<@^C#vdV&8fMOLOG0pbPDy>F7x0 zKNbA0o%uEo!5V{8UJQ=+8|Sg@G$`NMI$!kjG2| zh3B)_6GZ*dWx5c7q&A0)^g-Z_ps3&dfLeUaW`zGkltAeRpduEBGyQ&)c==%?Lva%3 zzfnr%h!Xz;rOjZFAaM4Z^J zrO&?RORi=i>D<0-yqN}C<0W?MsIlaxe%Z!nivUTvOg;i9PmK+QTm|>xOwyus9!D*g z)0Oz`qBy0O5sWf2Y-Xd_-og8k&R%Zi7asR6GZ>@jT*&E#y0A0))RPHsv<#pgA^@Qu z+5jg?yqDVrcTOj#EWAmqaGI1lDZlo9Qq@SWAKs*DZ7ia|igueiw@CQ6quAI|&D|ML3eRvX`U!H)$0gS!LTk9u!1=XM& z!My3hwZq+N$`CX8VWyQYtcSi@MKX*6$9GsGjGrK%Svlw!5qM3?k3i94&7(IHQy*FZ?2Zl3;89dsnT>R5fo zf(KnHe0DXQEzrpBsQTnu)3Jhy%BJ=&?>5J6weAZR7x(q8b|v)ykv6`X7ay`^&d&zk z6nLMvzesXBOR@KK$3F`14pLqmA=?}x%~&sVeoC6_T=opYtV*TGitt*0=3Nz63=^{+$Ms%+6!BV)~O(5#4@vwu6>x9n_7K)E2REt z&w~vIZ6D|kim^v$XGXO>C@)-G0bk0&3C!QBW4ag&zIfFl6u@Y~_=er!zOZu^feGe#k?zK5LP-j~hO=-61(;sod@2b28p&cg`Km)OD|<(N@mK45oqKae)#9DKCh5o62E*~J^d8U`g!s`+%~0bJT5fs#1bp%+sn1N3 z&pjCVzPB#>=^n=_LAQfQ4;i|}4hF*)DKTlplCKU%KWU6-SJ~P$1j?1^56M+#!^rk# zDA4w1Q_RUaitbCrU)GAEhD#{K)|gF3DITv6V!)x1LNZ#>OLZz#SSSj%yCeDUhh|Hz zh0k#8G+7>nf2eI0>OKb1Wd@JFiFLHf-IbL%+vAe+^H-4OLBg9$|~` zIVPGQ3$(ziH?Hvl7$&4Uz7XjuW{0nSZLLI~@eVUL{h*B4Q$WU5ac~nP*Szw=kr)AY z`Li{JNwl|{SLKbVB}eVc%+a6=3sLM-pV~K|-)_o}ygXDP)P__cX-+K|o zR_yyF=p$iWI&<*tUsyGgA++Jq`tDjPv?OSKt>{3X{8i7kwVL$Ks98vhOYG|6p;#sR zmaT|ku;(gXgykd^{eII|bKM!gapN(!@Et#*v_7T>iF$zl-a5XDtW&=X``WZ0wV}ZL z7O8M7XHCCUsCo811iC{A^BkidTZH~WA?rg5%fd6|qo#@W`LC#$RcHY>Ik4g9)LHl0N*fHJzaex8d>@j|UBi|O`x z*8O|b3EWlwlXopT?bJ2Oxe*qo3CD-_2lMgG?|83bPtT8ls`Y4p$m`+!AC9|guJ2gr z8^1ohCs-}j{w!9E+lz~O&8yuViqSrAuS?Tfs;$`__r6?%hZJH_t2Igp$Kg~@q(^>v z{_(===@N^CpLUWhs$<}uMaQRngn+ik_qV=9`rwoTWDQ>L$60>jhXFV{aG{`df;M(lF6B~PD{64HJ zmk0Z?4ZH7DI_Iwh!~V(~c4>rzbv@lp8ciBc)4J^Pikv0*ud+|E3NqYLkhMnab6k1; zgO(nE$mKmkoT}pUd*cqvf4U;1;tnPUqwL7Y>8k&UjrsL0A{7gD11AB&C{s z?SM=$X;3%P!Qzy<8EiR@p*Rx2>h#;YQ+!KyNe?B4N>m1imCn4wF${`WR!4sW&S2q#%}i|~ z$8c_#mm|w6z~Mv=P9`C#!A(s+I6oN(0lsCp?po@U)wwLTxw-4(Ujfau18=sEEg!)Q zbXsiw%g@7sL}VBUgwM>&HsgSA=4firZ@RJ`Gl2(vu4z_l#LK5#)&1Z37ol>%VDr8; z($Z>hi;~g4b(g!o**m^w>@Dt@J?gIQ5{fm~JWhQGZh&ki5=0+P;LSQ}hlU$G4BlXs zwT)8>qDplMHX~yj`m#s_%`DQ>hF5t;$5eI9sPDz?xx->5cKS<2`E zrBOaVnVy(M?pZsg4f9V7+SznNdFT6hTd(R>eMUb2T&1!l^>ljt;bsY=#BOu{&3?s4 zx$YIRLr>900@3Fy$6~!>!e-`R-3;H!)-2Y9CyeI!ZQBj+L747afvM|M59wqHa5!Nj zZ)Gdwyj*3yy_1WEdHC>0;dASkW9aiLWPj6;D~%$_U(mt*?C5*@{z{{m`@Q{P8eFL` z{NNEWNB{XwTdCO&)Ue}QyXUOZ=8wUR_}6FT?J{=Wr$uX}4i8a7;v;mLU<7R1lX;tY z2YNo=@vL`gUumYFquB6!5$sT&Bi{?&(2?37no+?0SZMLWGZ`fYCf-KV?{K5!SPBED zn1JhV+M2#4e$27}H#OXE0_{QI$vaq6ayxw;zC&GOVa9o>KS;jJB?-&$Q|JVU= zKax=QcFI}`E&=&i(o`aw<8URkM?JdG=8H>$8%6#a(-Z8yTv9)5?GtYp1l|tSg|m%_ z!4`a>b%qH2;|cI3uOp?^PKeuA)v|duz%=#=&JOM)eR&3%p{uO~(`}B&xe(aN_lYK2 zc>{a>iQdN)PDiq%^^O3e>51Nu$e)K(GZ|?lI_D17)Wd1)P37txikP$-*!FyFd1)`n zE^}(SS1WA40=*H*@i@4N4wI`^dH8=wQi$y^wEpNuMo zH8<-N#)+7GqDrMMUTNV~cl46W{N5k9AX_w^S#;)>J|9T{5vr>inZyZ*y41kjogaU{ z9lO8`4<>#LPON|A#jm?&vcJ5qwd$p*0Eib;<|2J+)3(n#63J!eRM_d+=|oP*J!{^^ zJNarx7q%d;92V}pZfH2$=~aW{fzN}V$A5n;ah;z}!dompH+{PYRY8KvWl}A-Sb2YW z9>;Qos{XM<+!WzR6Tg4W)vZX~<;|~nTLy)VDyfuO)1@ND zwy1Mwbysbi2wCf$-kR{yxJDyGM(ZZSHO-p;vh|%Pp0#pbZh7{?Ci26NzXsg%i&XyI zK?j8*T|Op1HC}dW84Jy0V9-W#<6^-Q@W8U`8fM zzzKd_V#7g?%ncMP>aR4k6TH4z=+s{&*sNFST7hbJOPLygGK(Dsew~fb``0|xQ zAPDOC`+~S84_Wm%T;ifF%J7eT9BLzq-N~Nx3JcFznLzAKI0CAzS^QJLtA9R>F*OebI--`A3Ru9(4y(50`mVfG8I0DnWFL$&-YFVup6F1kcN?RH< z7djtRVUTBRc`ZE{UA?B14nB^L8(tri^Fg7~6T0BWhu9XcVv9=VQBFcidMqRNxNhrs zTldFMvb&F>xVpn498# z5|a9?cA{1E30En9`~$JWjn!-Q@bz$V5|~CGM-k=AMUrnBX+K#V{~O1OeET_n@~f+r zR~)C<=N`Yb=Rut+wJhBq^Kb1~WT8Q`+Xv`Kbd4Pd4)4xYo<&|uwuKGQ!hRP!W?dUb0PVPc^b7Ab5QQb!xX;!wx<-Xt6T0qfb|QK6z0MAS7A|43oYAv(rzH6V*g9*opPD7DEy=Oyj8sNSLC6uBmh~#%??Iy`gEU+w0 z{T1v@D6zb?SmZcRM1RFTGMYz{ji0)9ytfUUPN)NDb{7=W76|b0jZXUKfc34FI4_9f zdg3rzJ$b72;yTUQHn#o-P8woomlR4AhV&T4wB-g<2SW(;aqOau?A=d^2H)3|vu3xc z2ecfKYxMo=9k-ZphB2}N;pb|c#S)U*3{0<+)z1@OEa-TpXIW;@TImR=#OM0BS(Rr@ zoFVfNp6>}`FL%J|kiPIYJu14e^azHCu}k(+RgB&Q$`5qL8;NkK@am_&DlEKzyq*rS z7~tdlhTS%XTm~_^wvm^&ZntU@SGVJLyGTI6yLv{ubFbGw(86T0jR8Z_6;wO`MMo1sU41%4Le%BDC7+4)p{ zTcyub_*3ud{j>Q62bXO)p+irrfz|$bOJQ(ozL#f#45E zElt;DV$J^95cLG|8-bR%bV|w^+H|XB`8irtzREUxEg)zFVpF}?i=THzWP%}zPajN zS`m@Wi{qE*Ex&?NBAqrVJrCi_<66^2??9~H(+%WR7CSv3z#E$*DBuGLS*dN{uZb+R zWBIMFBp!gcFp(@gG@;M?_i~k)LohD(`U`M=QqBuRuB7{ns&m;|B;C-XL$NGRdN??_ zt?blP5ra(oY6#1~G_D{Yb5Wpkyc>pW;z^346clR({tUiz32ewpRq_ z8-1Yo*Edu%tRDqC7c>-qnZ273IW9zEwPWo@zZd1P2FA7A;nRt|Q%Gf}(+w3vALP=C z$OI?%ki_dmjW04wZIr`KL3(=wp1g%zPABU+dTh;lZ*cah5MmBAO^;`cxgU^zVwBN! zXz&||?K1NF9#7{COl8lkPA8tcI7NQ-;f5qBvrJEmqj8-*fh1CPcdf}^Ek)Up~<6*5khXCrnDZP9^&=a z1^v#dWTfNRTW0@#bDe98ZZCZqtZs@-*+jz5UYzat2^ONZ4PGt_l2QeWf#8gCq>L4? zostYa7xf&12Oq5wX3z_1pQmJ09WtYUQ+NA25T<|ZJ3lq@A2j?h;$(eP-_kqDyfuMK zsGxso(0f`4=2tD&O$T*pXbG{WH!MXc9EFgYdi!n5id6xvPxQZDe9qT9bouakRA`|S zQ#Votoa;|EdpE=Ac_%L98v^*{iYOqYJKkIxZVso0ANUTvFZvIfF5cv}HiyaAx;4>BQ>}ASx-OV~@TPmvZFbp0uAMWjw9&-4dHP~W%Q;&L2D<{7r+~97 zgfR`HOkg0dS=zgGqTAuzL1&z1kZJU>xn6Mq!WRvFt)(v)rC=ce%?j~JjL7%dFftw1 zAVRsVXK(tkr(Ib_SzxhG5B5573j)#n*J4t~b(QrX_;pPUpIWOhw@>mQp$vxrG$MY3 z-taIu*%=2wk8(P)jG13Ze17JL*bYWrA`3&VD02MOD<~k*xhiR-K{*Oy3mm^%LU~vS zW0w#=Gt$Ymj<7HLUW{iS1BT|^4j&-!vSa@W{)JEJEjcZU^GRZ(_#)VP85B0Yw#5B9 zZ*7A$ExkvO=i!lH0uFlfB@&KtDj4jRmOk~O1`gV;_^Ipmoeh)JaNmcRnr-ZsU|vqS z>#<7-I!8TYxG~FZ-FFHG+UA_F>5TouO4jwVNNsxROS#?Vv&==MA{$kiJh(1(?n;%% zx`=H`{h_CNy^TfJOxWE$GeHk1m4o~B(^Vgus~bM?`C`qWh+=Z_6wW3Qr$Xu13jg+7 zmz#+T9bUq?ox!*#_u4(pEs%T5C|p8TAGFg(g{0(PMUoR#5!19&&_kk&etZj19I7m{7>75?zj55_>m__?<4<70AWvijP9rJ+*77_~C zB|!&NH);<}r(#FN5`rJ7P=GB}4jhEgY{*;yJF<{Tf3|wu^jq5bBo+?Z8$|HK z8|}^dPt|*z{27eGYn-9+I zhp65~a;^1x%neGf%H6oDX3Iw4Xb9qELUcl6!+UEg^Ae!t$oow3I_$=Z9Jwf9_e z&fpp-A3e~2CBMZ)Q(|At(Jf&1G+k$phzmsL= zvBj;hy>Cj`ayH1Ta(}WTdB45W%5+ENJ6M0wN&sSxth_H34uWB=3~?l}EHIXnpp8ZA zlXb_r1cDTr>EpZZ5BF3ReF&5!vs4&#qWt8p_WwGf{7ZFfHwwCeJc4%|ZI@>G6xoN8 zVGBePz#yPVs0cu!4}K!L0T<<0c=UUJi(MyotNo(f92J|kCNMRgAX>76TXOcdHyoO~C^7z_!{bYRdG?yLRrk95EXWZBP#qDXcOo1g`vL1 z#`jeHN1|jIvahkHo1xtetM+F2Xu~f%XN--#i=! z1W#j^XnPwLjZx-IekVFbo)yT?X;Aewdczw|xB}Cw+ekBDv#4=zXuG>V7lXG!7E;6# z3$cXfI&5!-AP+;jan0k@L~mmhktKqn?|Ff!TKLZ<@o=}+!n`X_+QVmTVM>1J0omS2 zZq%)=q}y0YJ=)*3;F@$avaBs|Bbg3+k~mj?1^33gwVZ|Zv*<`Cf#s*x{ezl_>cCi5 zsCUzU*8q&4c)FXC32M5d&_)3Q_(l~@$o!WVicLfu zYq0C^`|hpoPDMq_zARX&F$!T+M@UVvROBu(u9GJ`l~PfXKvP&;IBH%1Zo|i0B!;!@ z1bmH95ArdN1P4*neu_Q<5u$T}#t3P`+()(F{d`@-Wh7!#d(qfPe3}0?^v>m-27U;+ za?&#i@(O5pP1TtIJ*iExD=Tv(tON-GFuCUbO9$@#l&9ux^3`ek+UV)T;{JmBaaRRL z4d_bfmp=7H&Ch+%Ok8E`7uoeFvFdyLVpw|6Mg0ExXN?T2ubyqo^muSV#$0bmvb`&& zqmQ?>A0`dasHAY4xw+5EZ_wGcKDkuhT*Oag>To|=vxr-^@Bb0G=3UD~L$|zslAt^O z=@4OBa7s;A1kqzV7roO^e7NRrp)A&R=A9S2J*gnib1k3iv+tXel1kxUbA3V1Kculv zt;=?!_&&qCrv+EL5)}H5s(@v1|Ah51Ei)y`c|<0o%1CXrE5XS({X4>-F*ZJLzLP7A z1)E^SCjV9CZ+xHxNzq>6Xt`BBbYXViGGN9?2MgM3a5{>>pInUjSC5Rb>|}g}Vad*Z z3jnQjJsbHL_DGoHLmwH$Xz}ga> z?%dzHFZ%n=XecRsRd@x_RxoZgcCz@iGHK>|$HWLd0%@}0Tab|-E;zhI=N0yfhF;G? z-m~q8@#vKajabO|Ld}AMIQhMKj@`StlgCXXkzsK2o=R5AkQa*n-f6d%-Q#(m9hXKF z&R)Szug@L!vU|Dv&a_uyJ0@~koewu(p?eR!m4d9u4h8l;Dv+Dl`bm6Q z=Ed>vp*=mKUdRvIeiekWH}KgoZj+MDD(I8aCTf9>fttY3l<+or6Y7hEX5Z1*0!f3s+^9cNslIe>`_}NCMNnvT<9q-!dzP)>Sks3wcUUGQXV}jFJ9;oqLn3ZUD zzBYFaGP}T%xq>5_Pw&~>vRrK84l92P=`SLJ!zlwH!_ul%NW+53c*Y^Mge9?N2NzK5$8ks_`wztceCF@bSL(LKen&@MwfoS(dD;OIBWJ(SV6Z) zCUA9b&O(?rn59a5aPX&}ayfECV#sktB;U^EX)uvZ#NVOmrMZKmTd>%i9gQXi*SWpy zc0eSZB02B1Io0@OV$J+dbI!9}o!*|r!x@}$>;}N$e2|FWe*(@0=zS3c4slfEXPx7z z7O!EiA5vsAWg|$twZykz7(>yliZ7b!gLc=iV6x^mq<=#6jm+?BQQmxkvvK^J8ac<*INIOG=SbeFkcc<*W)yOd=T{*rM zE?ye%zBLXOu@5r<5R-e&$n4LhDapMMs3ZEl#cG(9W*?wXOeI#-c%kqc^qo&cAjLL= zPcHtTLml=sR~|>{2sm|eeTyyXiz9Go8{X;-SuT%-XkHKyk*uuM-Fm`j{OU34)?QwG z0@Ws`$pcnLPbb`K8JLzLj8pJc#$yYb?*~>gd9O%+4yEhH45>n{;G?X(p83`<`CBNR z?|vlJ0>xJ;NK1jFoGUX_LJoxV&_Viox^s-oJQ?qT=Z+OmAQy(Dm({@CwFVgtma(_n zA-TmY%;j1G0{2vN%vrE2CUsPO6_cA~yKj5v9ii=ZGbf;Ra?W<-px>&Q%b{yEkrm;ep z)=CJkEY}rM2xeuIsjEXxRb!RxQReiTN9scVDt@aIRT)zVUD`KE1^4mYAhPF|evqF*@ggXH4oO6PA=ZLM?5#7h=mS{W|jT$?a?R?Mstm-+nrF~b*Mz0mk` z)DD!{P+2&!h(WmUe(^7*LRi-IZ1(s?;F!D)jS5Ejt2}hb|NQ!^j}&UgZF^$(Z3tPt z?)&~s)~v*o7+Kmv^CLYeunLdOw|=vmDk&we1-gH?T$FGmyUPz7QlT9Br33K>6LFF_oB`9g%>DI$DRjx$_`K*~SowOSCYd02}XQ${a<**(V z^Qwrq9z0-B#jrp-kCM*V+wJKQ)iU}kt|s8JNWSy5CwJs&&R$BW^!aJ1&&63e+67kI zyhrQYwFjCiKEKIpR9!sy!APe2O@GvQMM~FVUtr$?nYDP))FQ2Z$+pc6ef_iUx2~?O zyBvqOeqB<2a>pII{bbeCJ6koVW)~+4yPF@>+3SVRio9n3n&y^DU&7sU4PUHi%GPe= zkZsKs$64>UI$?@UqXG?NN~-6|A0i&j>lK0BztLNeWC*uss^(vz7as}=2swsOC6Azf1bbHOGrH~KxY6FNt}`BE z7jZXTO!q#Tb3r|+zG-c(+Z}%X!gjWVO0vTms@l4VXC2} zlFa=FP};4-U$9wz@p>|*dAKOfc^Ue)X=(U1qw8wBg|zQhJpBy&j}Q%;Nc{o7?-UhO z6RY)~*hKLR0 ejggPu8@MLb+|H)P%_vU8Glzx+KKq`rKJhG^|vAogZqe)0ZAP_i==A?y~eUy60hms z^(!#Sd*L-_DULXGoZp_=z%lbdLb#F%lN{VJS=+DOoq}KP91tYXb}!$zommdkJAGMH znH&k#NE>iD#qTQbRZ&-1w_|cMy!>?bL{kCQ=GEJr(EdV$p?XKf!!(tqjkn zF1zXKS06Oj7zVNGigEN2vsa+4y7Au1^mL8D_=Rm|EMJ6;>BhT8;3hNSQgujA<-b#! z#R3WkSEQ&5SvdyfeL8;|`Q|;DMDw&{Vt=4L1Ff*ci|Y?fzMgq*=W7>qwo}l9ug;3d zQ)hDf+b03`SMUJ;%|X*fEiNwP{C=5+Os*w{u%OWVjPs%z9F8T9d6RKNrI(q8^#plMOu+)}mkO|jTz0%3V$y>b)REUAE%aQFTbvde zN|zh4TLlrjG^`8Lm(7!9?y{OA?i#2TQ!aVPxT~xb<$TH)*75;YqR<{_v7o`Yi(!?i zoJ=(7_^^RHS|TmPB&Z#P>)Sx;;~d!o#jYZ^9NPCUKw29~qT{htkk(cX2!jfN>IsN} znLO-)d)tM`WVPAnG(vwF)=h-@G#4B#Xf)UtjV0s2=` z@7XEi*z?r3rIsQA@qYh8E<9egk1)}*k(jz5Je07Q1l5JQx^>JKXm7pv605mYX4C!h z>X|D8B+QhXF$@@mzEBL*jcb|#ZGrefprc0=B4OM&nt<78jnu4- zzrhWkG7^Ki)go4Fxw}Hm#Rp~2yc)+M`ZPNVexzdoz=}mu`sp+f+c>||aL2C$N_aJ| zmtxAg05psIzSufQ1y~g_udCzO_n2eGcEo$c6Ecn@uh=2LRp&qmaD7-fDg4>N^stvW zx!DuDl(JFwUAOYNM8ar*xLO){dBH|1Da#>wf*fVRn72)aLktS6Bz)k0T*M+juQtXw zcXE-L-itlZT@?_7eXP&r_f-H)4i_Y8Q%r#$vT3YN2`a1kQJA;laH;8tlsN$IFZ$@1 z8{n52;C{Y_-Laa!b&0ZZ$vk(n&3)>s=0w$Ls5-x5br7napm6gf>rN^&Z{pePHV^Lj zreA&z?5Jd2zi=NVi1xH7;<^M`X2ym9Ow?=w*ctBT4*UA z{nadF0C-9SDUgZ(+p|PMaR4|_X2U|R|7p1SXDkS0MG86We>i;p?e;nTwRMVZOn(|| z{u!qLIj~T} l@>h4(|8L{}`8Ku?$?O4)Nc|wZ9f1 while it is focused. Where it makes sense, up and down will also move between widgets. +## Mouse navigation + +You can also navigate Posting entirely using the mouse, very much like a typical GUI application. + +If a widget shows a scrollbar, you can use the mouse wheel or trackpad gestures to scroll through its content. +Scrollbars can also be clicked and dragged. + +If you hold shift and scroll using the trackpad or mousewheel, the content will scroll horizontally (if there's a horizontal scrollbar). + ## Contextual help Many widgets have additional bindings for navigation other than those displayed in the footer. You can view the full list of keybindings for the currently @@ -37,6 +46,7 @@ You can use the `focus.on_startup` and `focus.on_response` configuration options |----------------------|---------------|-------------| | `focus.on_startup` | `"url"`, `"method", "collection"` (Default: `"url"`) | Automatically focus the URL bar, method, or collection browser when the app starts. | | `focus.on_response` | `"body"`, `"tabs"` (Default: `unset`)| Automatically focus the response tabs or response body text area when a response is received. | +| `focus.on_request_open` | `"headers"`, `"body"`, `"query"`, `"info"`, `"url"`, `"method"` (Default: `unset`) | Automatically focus the specified target when a request is opened from the collection browser. | ## Exiting diff --git a/docs/overrides/home.html b/docs/overrides/home.html index 230491ab..2782c829 100644 --- a/docs/overrides/home.html +++ b/docs/overrides/home.html @@ -5,11 +5,6 @@ /* hide the main content on the home page. we're gonna do it all ourself. */ html { scroll-behavior: smooth; } - .md-main{ - display: none; - max-width: 1000px; - margin: 0 auto; - } body { background-image: linear-gradient( 0deg, @@ -54,9 +49,14 @@ #home-title { margin: 0 0 0.3rem 0; } + } p#home-intro { font-size: 0.9rem; } + + div.md-nav__source { + background-color: hsla(287deg, 100%, 10%, 0.8) !important; + } #home-subtitle { font-family: "Roboto Mono", monospace; font-size: 1rem; @@ -253,6 +253,16 @@ } } + @media (min-width: 1220px) { + /* The sidebar content sits on top of the main content + and makes some buttons unclickable. This is a hack to workaround + that while keeping the sidebar working on screensizes where it's + still required.*/ + body > div.md-container > main > div { + display: none; + } + } + @media (min-width: 1080px) { .feature-description { font-size: 1rem; diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index c5aefc00..a052cd64 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -33,6 +33,12 @@ table { border: 1px solid hsl(287deg 100% 30%) !important; } +span.filename { + background: hsla(287deg, 100%, 10%, 0.4) !important; + border: 1px solid hsl(287deg 100% 30%) !important; + border-bottom: none !important; + color: hsla(286, 42%, 73%, 0.526) !important; +} .md-nav__link { background-color: transparent !important; @@ -105,6 +111,7 @@ nav.md-tabs { } .md-content { background-color: rgba(0,0,0,0); + padding-bottom: 2.5rem; } .md-nav__title { box-shadow: none !important; diff --git a/mkdocs.yml b/mkdocs.yml index b70da961..b45b5e77 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -27,8 +27,8 @@ nav: - Guide: - "Getting Started": "guide/index.md" - "Navigation": "guide/navigation.md" - - "Requests": "guide/requests.md" - "Collections": "guide/collections.md" + - "Requests": "guide/requests.md" - "Configuration": "guide/configuration.md" - "Environments": "guide/environments.md" - "Command Palette": "guide/command_palette.md" diff --git a/tests/sample-collections/foo.posting.yaml b/tests/sample-collections/foo.posting.yaml new file mode 100644 index 00000000..5a240e3e --- /dev/null +++ b/tests/sample-collections/foo.posting.yaml @@ -0,0 +1 @@ +name: foo From 1c01f78427f2fb2b2f50e695068fb270b2f294a9 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Fri, 18 Oct 2024 17:08:01 +0100 Subject: [PATCH 66/70] Delete a request --- tests/sample-collections/foo.posting.yaml | 1 - 1 file changed, 1 deletion(-) delete mode 100644 tests/sample-collections/foo.posting.yaml diff --git a/tests/sample-collections/foo.posting.yaml b/tests/sample-collections/foo.posting.yaml deleted file mode 100644 index 5a240e3e..00000000 --- a/tests/sample-collections/foo.posting.yaml +++ /dev/null @@ -1 +0,0 @@ -name: foo From 1905f2b3c01d62830dd5df8e4c17be048f9657ad Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Fri, 18 Oct 2024 17:26:07 +0100 Subject: [PATCH 67/70] Rewording docs --- docs/guide/external_tools.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/guide/external_tools.md b/docs/guide/external_tools.md index 08b0b2af..22b1fc17 100644 --- a/docs/guide/external_tools.md +++ b/docs/guide/external_tools.md @@ -1,7 +1,9 @@ ## Overview You can quickly switch between Posting and external editors and pagers. -This can let you use the tools you love for editing requests and browsing responses. + +For example, you could edit request bodies in `vim`, and then browse the JSON response body in `less` or `fx`. + You can even configure a custom pager specifically for browsing JSON. ## External Editors From b964329ac8da6fbd148149c4959be038c068cd8d Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Fri, 18 Oct 2024 17:50:29 +0100 Subject: [PATCH 68/70] Changelog --- docs/CHANGELOG.md | 34 ++++++++++++++++++++++++++++++++++ docs/guide/command_palette.md | 1 - src/posting/jump_overlay.py | 2 -- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 745f4b8e..2b7d3225 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,3 +1,37 @@ +## 2.0.0 [18th October 2024] + +### Added + +- **Scripting**: This allows you run to run Python scripts before and after sending requests. Scripts can be used to perform setup, set variables, modify requests, and more. + - Define "setup", "pre-request" and "post-request" Python functions and attach them to requests. + - Posting will automatically reload these functions when they change, meaning you can edit them in an external editor while Posting is running. + - Scripts can be used to directly manipulate the request, set variables which are used in the request (e.g. set a `$token` variable which is used in the request URL). + - Output from scripts is captured and displayed in the "Scripts" tab. +- **Keymaps**: You can now change the default keybindings for any of Posting's "global" actions (e.g. sending request, opening jump mode, etc.) by editing `keymap` section of your `config.yaml` file. +- Added `heading.hostname` config to allow customisation of the hostname in the header. This field supports Rich markup. You may wish to use this to apply highlighting when `posting` is running on a production system vs a development environment, for example. +- Added `focus.on_request_open` config to automatically shift focus when a request is opened via the collection browser. For example, you might prefer to have focus jump to the "Body" tab when a request is opened. +- More detail and screenshots added to several sections of the guide. + - Much more detail added to the "Getting Started" section. + - Collections guide updated to explain more about the collection browser. + - Guide for Keymaps added. + - Guide for Scripting added. + - Guide for External Tools added (integrating with vim, less, fx, etc.) +- `alt`+`enter` can now be used to send a request (in addition to the existing `ctrl+j` binding). +- Tooltips added to more actions in the app footer. These appear on mouse hover. + +### Changed + +- Automatically apply `content-type` header based on the body type selected in the UI. +- Updated to Textual 0.83.0 +- Various refinements to autocompletion, upgrading to textual-autocomplete 3.0.0a12. +- Dependency specifications loosened on several dependencies. +- Recommended installation method changed from rye to uv. + +### Fixed + +- Fixed double rendering in "jump mode" overlay. +- Fixed sidebar not working on mobile on https://posting.sh + ## 1.13.0 [8th September 2024] ### Added diff --git a/docs/guide/command_palette.md b/docs/guide/command_palette.md index d2b9a964..a7b5fde5 100644 --- a/docs/guide/command_palette.md +++ b/docs/guide/command_palette.md @@ -9,4 +9,3 @@ It can be used to switch themes, show/hide parts of the UI, and more. ### Using the command palette Press ++ctrl+p++ to open the command palette. - diff --git a/src/posting/jump_overlay.py b/src/posting/jump_overlay.py index 2d6996ff..796ba348 100644 --- a/src/posting/jump_overlay.py +++ b/src/posting/jump_overlay.py @@ -66,11 +66,9 @@ async def on_resize(self) -> None: self._resize_counter += 1 if self._resize_counter == 1: return - print("recomposing") await self.recompose() def _sync(self) -> None: - print("syncing") self.overlays = self.jumper.get_overlays() self.keys_to_widgets = {v.key: v.widget for v in self.overlays.values()} From 857fa0bbe53b6f701ecea2fa545708aefba2f250 Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Fri, 18 Oct 2024 17:52:14 +0100 Subject: [PATCH 69/70] Rewording changelog --- docs/CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 2b7d3225..1c961238 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,12 +2,12 @@ ### Added -- **Scripting**: This allows you run to run Python scripts before and after sending requests. Scripts can be used to perform setup, set variables, modify requests, and more. +- **Scripting**: Run Python scripts before and after sending requests. Scripts can be used to perform setup, set variables, modify requests, and more. - Define "setup", "pre-request" and "post-request" Python functions and attach them to requests. - Posting will automatically reload these functions when they change, meaning you can edit them in an external editor while Posting is running. - Scripts can be used to directly manipulate the request, set variables which are used in the request (e.g. set a `$token` variable which is used in the request URL). - Output from scripts is captured and displayed in the "Scripts" tab. -- **Keymaps**: You can now change the default keybindings for any of Posting's "global" actions (e.g. sending request, opening jump mode, etc.) by editing `keymap` section of your `config.yaml` file. +- **Keymaps**: Change the default keybindings for any of Posting's "global" actions (e.g. sending request, opening jump mode, etc.) by editing `keymap` section of your `config.yaml` file. - Added `heading.hostname` config to allow customisation of the hostname in the header. This field supports Rich markup. You may wish to use this to apply highlighting when `posting` is running on a production system vs a development environment, for example. - Added `focus.on_request_open` config to automatically shift focus when a request is opened via the collection browser. For example, you might prefer to have focus jump to the "Body" tab when a request is opened. - More detail and screenshots added to several sections of the guide. From 67232db8e72c3fa03a635cec6317beea0d22693d Mon Sep 17 00:00:00 2001 From: Darren Burns Date: Fri, 18 Oct 2024 17:53:50 +0100 Subject: [PATCH 70/70] Rewording changelog --- docs/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1c961238..3dcb36c8 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -31,6 +31,7 @@ - Fixed double rendering in "jump mode" overlay. - Fixed sidebar not working on mobile on https://posting.sh +- Fixed autocompletion appearing when on 1 item in the list and the "search string" is equal to that item. ## 1.13.0 [8th September 2024]