Skip to content

CLI: --output=json list-refs emits one object per retention property instead of per ref #4098

Open

Description

@med9110

Apache Iceberg version

None

Please describe the bug 🐞

Apache Iceberg version

main (development)

Please describe the bug

JsonOutput.describe_refs() emits one JSON object for each retention property rather than one object per snapshot reference.

As a result, pyiceberg --output=json list-refs <table> can return three objects for a table containing only one snapshot reference.

Reproduction

from pyiceberg.cli.output import JsonOutput
from pyiceberg.table.refs import SnapshotRefType

JsonOutput().describe_refs([
    (
        "main",
        SnapshotRefType.BRANCH,
        {
            "min_snapshots_to_keep": "1",
            "max_snapshot_age_ms": "432000000",
            "max_ref_age_ms": "forever",
        },
    )
])

Actual output

[
  {"name": "main", "type": "branch", "min_snapshots_to_keep": "1"},
  {"name": "main", "type": "branch", "max_snapshot_age_ms": "432000000"},
  {"name": "main", "type": "branch", "max_ref_age_ms": "forever"}
]

Expected output

[
  {
    "name": "main",
    "type": "branch",
    "min_snapshots_to_keep": "1",
    "max_snapshot_age_ms": "432000000",
    "max_ref_age_ms": "forever"
  }
]

Root cause

In pyiceberg/cli/output.py, JsonOutput.describe_refs() uses a nested list comprehension:

[
    {"name": name, "type": type, detail_key: detail_val}
    for name, type, detail in refs
    for detail_key, detail_val in detail.items()
]

The inner loop creates a separate object for every entry in detail.

This is inconsistent with ConsoleOutput.describe_refs(), which renders one row per reference.

Suggested fix

Construct one dictionary per reference and merge the retention properties into it. Add a regression test ensuring that one input reference produces one complete JSON object, ideally also covering multiple references.

I reproduced the incorrect output by executing the current list-comprehension logic in isolation. I have not yet run the full CLI against a catalog.

Willingness to contribute

I'd be happy to submit a focused fix with regression tests if the proposed JSON structure is correct.

Willingness to contribute

  • I can contribute a fix for this bug independently
  • I would be willing to contribute a fix for this bug with guidance from the Iceberg community
  • I cannot contribute a fix for this bug at this time

Activity

  1. added a commit that references this issue on Oct 13, 2026
    2465231
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions