Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

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

Ouverte Adaptée aux débutants
#4,098 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@tomron y travaille déjà.

Depuis le 13/10/2026.

  • #4101 par @tomron — ouverte

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
87/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
python
Domaine
cli

Piste de recherche

Lisez pyiceberg/cli/output.py et examinez JsonOutput.describe_refs() avec ConsoleOutput.describe_refs(). Ajoutez des tests de régression pour une référence et plusieurs références, puis exécutez les tests pertinents de sortie. Le travail est terminé lorsque chaque référence produit un objet JSON contenant toutes ses propriétés de rétention.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

kind:bug
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
Langage dominant
Python
Étoiles
1.2k
Forks
618
Merge moyen
1 j 3 h
PR mergées (30 j)
45

Préparer son environnement

  • Aucun Dockerfile ni fichier Docker Compose
  • Propose un modèle de pull request
  • Aucun guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de apache/iceberg-python

Toutes les issues de apache/iceberg-python

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.