Commit 4bd7a9f9 authored by Jan Reimes's avatar Jan Reimes
Browse files

feat(cli): enhance output format options and improve error messages

* Add support for 'ison' and 'toon' output formats in crawl and query commands.
* Update error messages to reflect new output format options.
* Refactor output handling to use a common formatting function.
* Include new dependencies for 'ison' and 'toon' in pyproject.toml.
parent a02d0175
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -497,7 +497,7 @@ def _checkout_tdoc_if_needed(tdoc_id: str, metadata: TDocMetadata, checkout_base
        _logger.warning(f"Checkout returned invalid path for TDoc {tdoc_id}")
        return None
    except FileNotFoundError as e:
        _logger.warning(f"TDoc {tdoc_id} not found or withdrawn: {e}")
        _logger.warning(f"TDoc {tdoc_id} not found: {e}")
        return None
    except (OSError, ValueError) as e:
        _logger.warning(f"Error checking out TDoc {tdoc_id}: {e}")
+4 −0
Original line number Diff line number Diff line
@@ -37,6 +37,9 @@ dependencies = [
    "pool-executors",
    "oxyde>=0.4.0",
    "truststore>=0.10.4",
    "ison-py>=1.0.2",
    "isonantic>=1.0.1",
    "toon-format",
]

[project.urls]
@@ -109,3 +112,4 @@ members = ["packages/*"]

[tool.uv.sources]
pool-executors = { workspace = true }
toon-format = { git = "https://github.com/toon-format/toon-python.git" }
+6 −8
Original line number Diff line number Diff line
@@ -3,11 +3,9 @@
from __future__ import annotations

import asyncio
import json
from datetime import date, datetime

import typer
import yaml
from dotenv import load_dotenv

from tdoc_crawler.cli._shared import console, create_progress_bar, handle_clear_options
@@ -47,6 +45,7 @@ from tdoc_crawler.cli.args import (
    WorkersOption,
    WorkingGroupOption,
)
from tdoc_crawler.cli.formatting import format_output
from tdoc_crawler.cli.printing import print_spec_crawl_table, spec_crawl_to_dict
from tdoc_crawler.config import CacheManager
from tdoc_crawler.credentials import set_credentials
@@ -397,7 +396,7 @@ def crawl_specs(
    try:
        output = OutputFormat(output_format.lower())
    except ValueError as exc:
        console.print("[red]Invalid output format; use table, json, or yaml")
        console.print("[red]Invalid output format; use table, json, ison, toon, or yaml")
        raise typer.Exit(code=2) from exc

    sources = build_default_spec_sources()
@@ -433,12 +432,11 @@ def crawl_specs(

        asyncio.run(checkout_specs_db())

    if output is OutputFormat.JSON:
        console.print(json.dumps([spec_crawl_to_dict(result) for result in results], indent=2))
    elif output is OutputFormat.YAML:
        console.print(yaml.dump([spec_crawl_to_dict(result) for result in results], sort_keys=False))
    else:
    if output is OutputFormat.TABLE:
        print_spec_crawl_table(results)
    else:
        data = [spec_crawl_to_dict(result) for result in results]
        console.print(format_output(data, output))


__all__ = [
+18 −20
Original line number Diff line number Diff line
@@ -3,12 +3,10 @@
from __future__ import annotations

import asyncio
import json
from datetime import UTC, datetime
from typing import Annotated

import typer
import yaml
from dotenv import load_dotenv

from tdoc_crawler.cli._shared import console, handle_clear_options
@@ -39,6 +37,7 @@ from tdoc_crawler.cli.args import (
    VerbosityOption,
    WorkingGroupOption,
)
from tdoc_crawler.cli.formatting import format_output
from tdoc_crawler.cli.printing import (
    meeting_to_dict,
    print_meeting_table,
@@ -116,7 +115,7 @@ def query_tdocs(
    try:
        format_val = OutputFormat(output_format.lower())
    except ValueError as exc:
        console.print("[red]Invalid output format; use table, json, or yaml")
        console.print("[red]Invalid output format; use table, json, jsonl, toon, or yaml")
        raise typer.Exit(code=2) from exc

    config = TDocQueryConfig(
@@ -190,12 +189,11 @@ def query_tdocs(
    # This functionality has been disabled as it doesn't make logical sense in CLI context.
    pass

    if config.output_format is OutputFormat.JSON:
        console.print(json.dumps([tdoc_to_dict(result, meeting_map) for result in results], indent=2))
    elif config.output_format is OutputFormat.YAML:
        console.print(yaml.dump([tdoc_to_dict(result, meeting_map) for result in results], sort_keys=False))
    else:
    if config.output_format is OutputFormat.TABLE:
        print_tdoc_table(results, meeting_map)
    else:
        data = [tdoc_to_dict(result, meeting_map) for result in results]
        console.print(format_output(data, config.output_format))


def query_meetings(
@@ -256,14 +254,15 @@ def query_meetings(
    try:
        output = OutputFormat(output_format.lower())
    except ValueError as exc:
        console.print("[red]Invalid output format; use table, json, or yaml")
        console.print("[red]Invalid output format; use table, json, ison, toon, or yaml")
        raise typer.Exit(code=2) from exc
    if output is OutputFormat.JSON:
        console.print(json.dumps([meeting_to_dict(meeting) for meeting in meetings], indent=2))
    elif output is OutputFormat.YAML:
        console.print(yaml.dump([meeting_to_dict(meeting) for meeting in meetings], sort_keys=False))
    else:

    output_str = output.value
    if output_str == OutputFormat.TABLE.value:
        print_meeting_table(meetings)
    else:
        data = [meeting_to_dict(meeting) for meeting in meetings]
        console.print(format_output(data, output))


def query_specs(
@@ -296,7 +295,7 @@ def query_specs(
    try:
        output = OutputFormat(output_format.lower())
    except ValueError as exc:
        console.print("[red]Invalid output format; use table, json, or yaml")
        console.print("[red]Invalid output format; use table, json, jsonl, toon, or yaml")
        raise typer.Exit(code=2) from exc

    db_file = manager.db_file
@@ -327,12 +326,11 @@ def query_specs(

        asyncio.run(load_specs_for_checkout())

    if output is OutputFormat.JSON:
        console.print(json.dumps([spec_query_to_dict(result) for result in results], indent=2))
    elif output is OutputFormat.YAML:
        console.print(yaml.dump([spec_query_to_dict(result) for result in results], sort_keys=False))
    else:
    if output is OutputFormat.TABLE:
        print_spec_table(results)
    else:
        data = [spec_query_to_dict(result) for result in results]
        console.print(format_output(data, output))


__all__ = [