fd5447cbb9
Testing / remote-protocol-compat (0.9.3) (push) Successful in 42s
Testing / remote-protocol-compat (0.9.5) (push) Successful in 44s
Package Extension / package-extension (push) Successful in 43s
Build & Publish Package / publish (push) Successful in 43s
Testing / test (push) Successful in 45s
Restructure the Python API and internals around composable namespaces and a standalone transport/endpoint layer. Bump to 0.12.0. Python API: - Replace flat methods (b.tabs_list(), b.group_list()) with namespaces: b.nav, b.tabs, b.groups, b.windows, b.dom, b.extract, b.page, b.storage, b.cookies, b.session, b.perf, b.extension. - Shrink browser_cli/__init__.py to a thin composition root; move all behaviour into browser_cli/sdk/ (one module per namespace + factories, base, routing). Internals: - Add browser_cli/transport.py and remote_transport.py to isolate IPC from command logic; client.py now delegates instead of owning transport. - Add browser_cli/endpoints.py for endpoint resolution and browser_cli/errors.py for shared error types. - Extract markdown rendering into browser_cli/markdown.py (out of extract). - Add USER_AGENT to version_manager. Tooling & tests: - Add justfile with common dev tasks. - Update CLI commands and demo to the namespaced API. - Rework tests for the new layout; add test_transport.py and test_refactor_boundaries.py to lock in module boundaries. BREAKING CHANGE: flat API methods are removed in favour of namespaces (e.g. b.tabs_list() -> b.tabs.list(), b.group_list() -> b.groups.list()).
64 lines
2.2 KiB
Python
64 lines
2.2 KiB
Python
"""Session namespace: ``b.session.*``."""
|
|
from __future__ import annotations
|
|
|
|
from browser_cli.sdk.base import Namespace
|
|
|
|
class SessionNS(Namespace):
|
|
"""Save, restore, list, and diff browser sessions."""
|
|
|
|
def save(self, name: str) -> dict:
|
|
"""Save all current tabs as session *name*. Returns the save result (incl. tab count)."""
|
|
return self._c._cmd("session.save", {"name": name}) or {}
|
|
|
|
@staticmethod
|
|
def _load_args(name, gentle_mode, discard_background_tabs, lazy, eager_tabs) -> dict:
|
|
return {
|
|
"name": name,
|
|
"gentleMode": gentle_mode,
|
|
"discardBackgroundTabs": discard_background_tabs,
|
|
"lazy": lazy,
|
|
"eagerTabs": eager_tabs,
|
|
}
|
|
|
|
def load(
|
|
self,
|
|
name: str,
|
|
*,
|
|
gentle_mode: str = "auto",
|
|
discard_background_tabs: bool = False,
|
|
lazy: bool = False,
|
|
eager_tabs: int = 10,
|
|
) -> dict:
|
|
"""Restore session *name*. Returns the load result (incl. tabs opened)."""
|
|
args = self._load_args(name, gentle_mode, discard_background_tabs, lazy, eager_tabs)
|
|
return self._c._cmd("session.load", args) or {}
|
|
|
|
def load_background(
|
|
self,
|
|
name: str,
|
|
*,
|
|
gentle_mode: str = "auto",
|
|
discard_background_tabs: bool = False,
|
|
lazy: bool = False,
|
|
eager_tabs: int = 10,
|
|
) -> dict:
|
|
"""Restore session *name* as a background job. Returns the job descriptor."""
|
|
args = self._load_args(name, gentle_mode, discard_background_tabs, lazy, eager_tabs)
|
|
return self._c._cmd("session.load", {**args, "__background": True}) or {}
|
|
|
|
def diff(self, name_a: str, name_b: str) -> dict:
|
|
return self._c._cmd("session.diff", {"nameA": name_a, "nameB": name_b}) or {}
|
|
|
|
def list(self) -> list[dict]:
|
|
"""Return saved sessions.
|
|
|
|
In implicit multi-browser mode each session dict includes a ``browser`` key.
|
|
"""
|
|
return self._c._multi_list("session.list", {}, self._c._tag_browser)
|
|
|
|
def remove(self, name: str) -> None:
|
|
self._c._cmd("session.remove", {"name": name})
|
|
|
|
def auto_save(self, enabled: bool) -> None:
|
|
self._c._cmd("session.auto_save", {"enabled": enabled})
|