Skip to content

Commit 15a4365

Browse files
committed
Fix searchsnippet, add event params, tokenless help/describe, jsonl validation
1 parent 90fe586 commit 15a4365

1 file changed

Lines changed: 23 additions & 9 deletions

File tree

jmapc_cli.py

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ def handle_searchsnippet_get(args: argparse.Namespace) -> Tuple[int, Dict[str, A
389389
account_id = resolve_account_id(session_json, args.account)
390390
ids = parse_json_arg(args.email_ids)
391391
filt = parse_json_arg(args.filter)
392-
call = SearchSnippetGet(ids=ids, filter=filt, properties=args.properties)
392+
call = SearchSnippetGet(ids=ids, filter=filt)
393393
using, mrs = jmap_request(client, account_id, call, raise_errors=True)
394394
resp = mrs[0].response
395395
capabilities_server = session_json.get("capabilities", {}).keys()
@@ -474,8 +474,13 @@ def handle_events_listen(args: argparse.Namespace) -> Tuple[int, Dict[str, Any]]
474474
try:
475475
client, session_json = build_client(args.host, args.api_token, args.timeout, not args.insecure)
476476
account_id = resolve_account_id(session_json, args.account)
477-
# Recreate client with last_event_id
478-
client = Client.create_with_api_token(args.host, args.api_token, last_event_id=args.since)
477+
from jmapc.client import EventSourceConfig
478+
esc = EventSourceConfig(
479+
types=args.types or "*",
480+
closeafter=args.closeafter,
481+
ping=args.ping,
482+
)
483+
client = Client.create_with_api_token(args.host, args.api_token, last_event_id=args.since, event_source_config=esc)
479484
meta_base = meta_block(
480485
args.host,
481486
account_id,
@@ -510,7 +515,7 @@ def handle_events_listen(args: argparse.Namespace) -> Tuple[int, Dict[str, Any]]
510515

511516
def handle_help(args: argparse.Namespace) -> Tuple[int, Dict[str, Any]]:
512517
data = {"commands": [{"name": k, "summary": v["summary"]} for k, v in COMMAND_SPECS().items()]}
513-
meta = meta_block(args.host, "n/a", [], None)
518+
meta = {"timestamp": utc_now_iso(), "host": "n/a", "accountId": "n/a", "capabilitiesUsed": []}
514519
return 0, envelope(True, "help", vars(args), meta, data=data)
515520

516521

@@ -520,7 +525,7 @@ def handle_describe(args: argparse.Namespace) -> Tuple[int, Dict[str, Any]]:
520525
err = {"type": "validationError", "message": f"Unknown command {args.command_name}", "details": {}}
521526
return 2, envelope(False, "describe", vars(args), meta_block(args.host, "unknown", []), error=err)
522527
data = {"command": args.command_name, **specs[args.command_name]}
523-
meta = meta_block(args.host, "n/a", [], None)
528+
meta = {"timestamp": utc_now_iso(), "host": "n/a", "accountId": "n/a", "capabilitiesUsed": []}
524529
return 0, envelope(True, "describe", vars(args), meta, data=data)
525530

526531

@@ -624,11 +629,11 @@ def build_parser() -> argparse.ArgumentParser:
624629
sub = parser.add_subparsers(dest="command", required=True)
625630

626631
h = sub.add_parser("help", help="List commands")
627-
add_connection_opts(h)
632+
h.add_argument("--json", choices=["compact", "pretty"], default="compact", help="JSON output style")
628633

629634
d = sub.add_parser("describe", help="Describe a command")
630-
add_connection_opts(d)
631635
d.add_argument("command_name")
636+
d.add_argument("--json", choices=["compact", "pretty"], default="compact", help="JSON output style")
632637

633638
s = sub.add_parser("session.get", help="Return JMAP session object")
634639
add_connection_opts(s)
@@ -683,6 +688,9 @@ def build_parser() -> argparse.ArgumentParser:
683688
add_connection_opts(ev)
684689
ev.add_argument("--since", help="lastEventId")
685690
ev.add_argument("--max-events", type=int, help="Max events before exit")
691+
ev.add_argument("--types", help="Comma-separated event types (default *)")
692+
ev.add_argument("--closeafter", default="no", help="closeafter param (no|state|push)")
693+
ev.add_argument("--ping", type=int, default=0, help="ping interval seconds (0=default)")
686694

687695
pl = sub.add_parser("pipeline.run", help="Run raw multi-call pipeline")
688696
add_connection_opts(pl)
@@ -696,6 +704,13 @@ def main(argv: Optional[List[str]] = None) -> int:
696704
parser = build_parser()
697705
args = parser.parse_args(argv)
698706

707+
if args.command in {"help", "describe"}:
708+
# No auth needed for introspection
709+
args_dict = vars(args)
710+
code, payload = command_map[args.command](args)
711+
json_dump(payload, args.json)
712+
return code
713+
699714
if not args.api_token:
700715
err = envelope(
701716
False,
@@ -729,7 +744,6 @@ def main(argv: Optional[List[str]] = None) -> int:
729744
code, payload = handler(args)
730745
if payload is not None:
731746
if args.json == "jsonl" and args.command != "events.listen":
732-
# jsonl only makes sense for streaming; treat as validation error
733747
err = envelope(
734748
False,
735749
args.command,
@@ -739,7 +753,7 @@ def main(argv: Optional[List[str]] = None) -> int:
739753
)
740754
json_dump(err, "compact")
741755
return 2
742-
json_dump(payload, args.json if args.command == "events.listen" else ("compact" if args.json == "jsonl" else args.json))
756+
json_dump(payload, args.json)
743757
return code
744758

745759

0 commit comments

Comments
 (0)