Add core modules: CLI, recorder, server, snapshot manager
This commit is contained in:
114
api_snapshot/cli/record.py
Normal file
114
api_snapshot/cli/record.py
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
from datetime import datetime
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
import click
|
||||||
|
from rich.console import Console
|
||||||
|
from rich.table import Table
|
||||||
|
|
||||||
|
from api_snapshot.recorder import record_session
|
||||||
|
from api_snapshot.snapshot import save_snapshot
|
||||||
|
|
||||||
|
console = Console()
|
||||||
|
|
||||||
|
|
||||||
|
@click.command()
|
||||||
|
@click.argument("url")
|
||||||
|
@click.option("--name", "-n", required=True, help="Name for the snapshot")
|
||||||
|
@click.option("--method", "-m", default="GET", help="HTTP method")
|
||||||
|
@click.option("--headers", "-H", multiple=True, help="Request headers")
|
||||||
|
@click.option("--body", "-d", default=None, help="Request body")
|
||||||
|
@click.option("--description", "-D", default=None, help="Snapshot description")
|
||||||
|
@click.option("--tag", multiple=True, help="Tags for the snapshot")
|
||||||
|
def record(
|
||||||
|
url: str,
|
||||||
|
name: str,
|
||||||
|
method: str,
|
||||||
|
headers: tuple[str, ...],
|
||||||
|
body: str | None,
|
||||||
|
description: str | None,
|
||||||
|
tag: tuple[str, ...],
|
||||||
|
) -> None:
|
||||||
|
"""Record a single HTTP request and save as a snapshot."""
|
||||||
|
click.echo(f"Recording {method} {url}...")
|
||||||
|
|
||||||
|
request_headers = {}
|
||||||
|
for header in headers:
|
||||||
|
if ":" in header:
|
||||||
|
key, value = header.split(":", 1)
|
||||||
|
request_headers[key.strip()] = value.strip()
|
||||||
|
|
||||||
|
request_body = body
|
||||||
|
if body and body.startswith("@"):
|
||||||
|
file_path = body[1:]
|
||||||
|
with open(file_path, "r") as f:
|
||||||
|
request_body = f.read()
|
||||||
|
|
||||||
|
session_data = record_session(
|
||||||
|
url=url,
|
||||||
|
method=method,
|
||||||
|
headers=request_headers,
|
||||||
|
body=request_body,
|
||||||
|
)
|
||||||
|
|
||||||
|
snapshot = save_snapshot(
|
||||||
|
name=name,
|
||||||
|
session_data=session_data,
|
||||||
|
description=description,
|
||||||
|
tags=list(tag),
|
||||||
|
source_url=url,
|
||||||
|
)
|
||||||
|
|
||||||
|
click.echo(f"Snapshot saved: {snapshot}")
|
||||||
|
|
||||||
|
|
||||||
|
@click.command()
|
||||||
|
@click.argument("config_file", type=click.File("r"))
|
||||||
|
@click.option("--name", "-n", required=True, help="Name for the snapshot")
|
||||||
|
@click.option("--description", "-D", default=None, help="Snapshot description")
|
||||||
|
@click.option("--delay", default=1.0, help="Delay between requests in seconds")
|
||||||
|
def record_multi(
|
||||||
|
config_file: click.File,
|
||||||
|
name: str,
|
||||||
|
description: str | None,
|
||||||
|
delay: float,
|
||||||
|
) -> None:
|
||||||
|
"""Record multiple requests from a JSON config file."""
|
||||||
|
import json
|
||||||
|
|
||||||
|
requests_config = json.load(config_file)
|
||||||
|
click.echo(f"Recording {len(requests_config)} requests...")
|
||||||
|
|
||||||
|
table = Table(title="Recording Results")
|
||||||
|
table.add_column("Request")
|
||||||
|
table.add_column("Status")
|
||||||
|
table.add_column("Latency")
|
||||||
|
|
||||||
|
for req in requests_config:
|
||||||
|
url = req.get("url", "")
|
||||||
|
method = req.get("method", "GET")
|
||||||
|
headers = req.get("headers", {})
|
||||||
|
body = req.get("body")
|
||||||
|
|
||||||
|
session_data = record_session(
|
||||||
|
url=url,
|
||||||
|
method=method,
|
||||||
|
headers=headers,
|
||||||
|
body=body,
|
||||||
|
)
|
||||||
|
|
||||||
|
status = session_data["response"]["status_code"]
|
||||||
|
latency = session_data["response"].get("latency_ms", 0)
|
||||||
|
url_display = url[:50] + "..." if len(url) > 50 else url
|
||||||
|
table.add_row(f"{method} {url_display}", str(status), f"{latency}ms")
|
||||||
|
|
||||||
|
console.print(table)
|
||||||
|
|
||||||
|
snapshot = save_snapshot(
|
||||||
|
name=name,
|
||||||
|
session_data=session_data,
|
||||||
|
description=description,
|
||||||
|
tags=[],
|
||||||
|
source_url=url,
|
||||||
|
)
|
||||||
|
|
||||||
|
click.echo(f"Snapshot saved: {snapshot}")
|
||||||
Reference in New Issue
Block a user