3 points par GN⁺ 2023-09-07 | 1 commentaires | Partager sur WhatsApp
  • L’option --argfile, qui n’était plus prise en charge, ainsi que les filtres leaf_paths et recurse_down ont été supprimés
  • L’image Docker est désormais fournie via ghcr.io/jqlang/jq au lieu de Docker Hub
  • Les cibles de build de release incluent explicitement Linux, macOS, Windows ainsi que plusieurs architectures Docker
  • --raw-output0 a été ajouté pour insérer des octets NUL entre les sorties, et l’affichage de chaînes contenant des NUL est traité comme une erreur
  • Sous Windows, l’option --binary/-b a été ajoutée pour permettre une sortie avec des fins de ligne en \n au lieu de \r\n
  • JQ_COLORS permet de définir la couleur des clés d’objet, et la variable d’environnement NO_COLOR est respectée pour désactiver la sortie en couleur
  • Le problème de code de sortie de l’option --exit-code/-e a été corrigé : si la dernière valeur de sortie est vraie, le code retourné est 0 ; si c’est false ou null, c’est 1 ; s’il n’y a aucune sortie, c’est 4
  • Des littéraux numériques décimaux sont utilisés pour préserver la précision des littéraux numériques ; les opérations de comparaison respectent cette précision, mais les opérations arithmétiques peuvent la tronquer
  • De nouvelles fonctions intégrées pick(stream), debug(msgs), scan($re; $flags) et abs ont été ajoutées
  • Dans les instructions if, la branche else peut être omise ; dans ce cas, elle se comporte comme .
  • halt et halt_error ont été modifiés pour s’arrêter immédiatement sans continuer vers l’entrée suivante
  • Des correctifs ont été apportés à un problème où la représentation de grands nombres produisait un JSON incorrect sur certaines plateformes, à une erreur de segmentation lors de l’utilisation de libjq avec des threads, ainsi qu’au crash d’assertion de --jsonarg
  • Le CI, les scan builds, les releases et la build du site web utilisent désormais GitHub Actions, et OSS-Fuzz a été ajouté

1 commentaires

 
GN⁺ 2023-09-07
Avis Hacker News
  • J’adore vraiment JQ, il est excellent.
    Dans notre produit (un outil Kafka basé sur la JVM et le navigateur), nous avons implémenté en Clojure un sous-ensemble de JQ pour permettre aux utilisateurs de transformer/filtrer leurs données. C’était l’un des travaux les plus amusants que j’aie jamais codés, et comme j’aime écrire des grammaires, un grand merci aussi à Instaparse : https://github.com/Engelberg/instaparse
    En l’implémentant, j’ai découvert que JQ était un LISP-2, ce qui m’a surpris, car ça ne se ressent pas vraiment à la lecture de sa syntaxe : https://github.com/jqlang/jq/wiki/jq-Language-Description#:~...

    • Je n’arrive vraiment pas à aimer jq. Il y a beaucoup de jq dans les scripts bash de la base de code de mon entreprise, une partie du code est de moi, et je l’utilise à contrecœur quand c’est le meilleur choix.
      Mais sa syntaxe de requête peu intuitive, le fait de devoir chercher à chaque toute petite étape, et le résultat qui ressemble à une incantation difficile à déchiffrer pour qui n’est pas expert jq, me dérangent. J’ai une répulsion instinctive pour les DSL intégrés dans des chaînes, comme htmx ou tailwind.
      Je reconnais tout de même que c’est un logiciel bien conçu et que, parfois, il n’y a pas de meilleure option. C’est aussi l’option la moins mauvaise pour manipuler du JSON en bash, bien meilleure que des monstres à base de sed/awk/cut. Cela dit, les commandes jq plantées au milieu des scripts comme des chaînes indéchiffrables font partie, avec les expressions régulières, des choses que je préfère éviter de voir dans du code. J’ai déjà essayé, comme alternative, de passer du Python inline dans un heredoc via un pipe, mais ça finit aussi brouillon qu’un script jq.
    • J’ai aussi ajouté un parseur/une grammaire JQ à un éditeur/testeur de grammaire LALR(1)/FLEX en ligne : https://mingodad.github.io/parsertl-playground/playground/
      Dans les exemples, sélectionnez « Jq parser (partially working) » puis cliquez sur « Parse » pour voir l’arbre de parsing correspondant au code dans « Input source ». Les retours sont toujours bienvenus.
    • Il existe déjà une implémentation de JQ pour la JVM. Elle n’est pas complète à 100 %, mais elle est utilisable : https://github.com/eiiches/jackson-jq
    • jq est excellent pour permettre aux utilisateurs de transformer leurs propres données. Nous utilisons une approche similaire : les utilisateurs créent un endpoint de webhook entrant, envoient des données JSON arbitraires et configurent des mappings utiles avec des tests de régression et du monitoring.
      jq rend la plupart des cas simples (en pratique, une notation pointée pour JSON), tout en permettant aussi les cas complexes de longue traîne.
    • Si le produit est déjà utilisable, j’aimerais vraiment l’essayer.
  • J’aime jq, mais j’utilise aussi JMESPath (surtout avec AWS CLI), yq (y compris tomlq et xq) et dasel. Dommage que hclq soit pratiquement mort.
    https://jmespath.org/
    https://kislyuk.github.io/yq/
    https://github.com/TomWright/dasel
    https://hclq.sh/

    • Rendre JSON compatible avec grep : https://github.com/tomnomnom/gron
      J’utilise jq depuis des années et j’arrive toujours, d’une manière ou d’une autre, à composer ce dont j’ai besoin, mais je ne l’ai jamais trouvé intuitif. Dès que ça devient un peu complexe, il est difficile d’arriver à une solution sans lire longtemps la documentation, et j’aimerais qu’il soit plus facile à utiliser.
    • La page du tutoriel interactif de JMESPath est vraiment excellente : https://jmespath.org/tutorial.html
      Elle m’a aidé quand j’apprenais la syntaxe au début, et j’y retourne encore quand je tombe sur une syntaxe étrange.
    • J’ai créé un petit outil pour convertir plusieurs formats vers plusieurs formats.
      Son principal usage est de convertir en JSON des choses comme CSV, TOML ou XML, puis de les passer à jq via un pipe : https://github.com/sentriz/rsl
    • Il existe aussi ces outils comme alternatives :
      https://github.com/kellyjonbrazil/jello
      https://github.com/wwkimball/yamlpath
    • Une autre excellente alternative est JSONPath, qui est très bon, mais dont le support et la notoriété ne sont malheureusement pas très larges.
      Inspiré de XPath, il est plus familier qu’un DSL entièrement nouveau, et je considère que sa fonction clé est la recherche récursive de clés. En écrivant people..address, on récupère toutes les clés « address » situées sous « people », où qu’elles se trouvent dans le JSON. C’est mon langage de parsing préféré pour JSON, et j’ai aussi écrit un article expliquant comment l’utiliser pour parser des jeux de données JSON.
      https://github.com/JSONPath-Plus/JSONPath
      https://scrapfly.io/blog/parse-json-jsonpath-python/
  • Si vous n’utilisez jq qu’occasionnellement et devez relire la documentation à chaque fois, gron vaut le détour. C’est du JSON que l’on peut grepper
    https://github.com/tomnomnom/gron

    • Simple, mais ça a l’air très utile
      J’utilise curl cheat.sh/jq depuis des années, et je trouve que cheat.sh est globalement une excellente ressource. Aujourd’hui, j’utiliserais probablement quelque chose comme ChatGPT
    • C’est vraiment très bien conçu
      On peut même faire des choses du genre gron | grep | sed | gron -u
    • J’ai toujours galéré avec la syntaxe de jq, mais je suis à chaque fois impressionné de voir à quel point ChatGPT arrive à produire la bonne commande quand on lui donne un JSON d’exemple
  • L’une des raisons pour lesquelles j’aime jq, ou du moins je le supporte, c’est sa stabilité. Des scripts écrits il y a plusieurs années fonctionnent encore exactement de la même façon aujourd’hui
    À l’inverse, le code que j’avais gardé pour yq s’est souvent cassé, parce que yq n’a cessé d’évoluer d’une manière non rétrocompatible. Je n’ai pas vérifié à quelle fréquence ces changements ont eu lieu, mais j’en ai subi plusieurs fois les effets dans des contextes comme des scripts CI, où les versions des outils de base varient et ne sont pas mises à jour au même rythme
    J’ai donc toujours été reconnaissant aux mainteneurs de jq de comprendre l’importance de la rétrocompatibilité. J’espère que cette annonce ne signifie pas que cette stabilité n’était qu’un effet secondaire accidentel de la stagnation, et que corriger cette stagnation se fera au prix de la stabilité

  • En plus des outils proches de jq, il existe des outils intéressants à utiliser avec jq, comme jo et jc
    https://github.com/jpmens/jo
    https://github.com/kellyjonbrazil/jc

    • Il y a aussi jless et gron
      Je découvre gron ici, mais je l’ajoute pour être complet. Par ailleurs, JSON semble devenir une sorte de format de sortie standard pour les outils en ligne de commande. Idéalement, tous les outils CLI proposeraient un flag du genre --json, ce qui rendrait jc inutile
      https://jless.io/
      https://github.com/tomnomnom/gron
  • Article lié du mois dernier, « First release of jq in 5 years » : https://news.ycombinator.com/item?id=36951830
    Je suis un grand fan de jq et je l’utilise en permanence

  • Enfin
    C’est vraiment chouette de voir comment la communauté s’est mobilisée pour recruter de nouveaux mainteneurs et relancer le projet. Remerciements particuliers à @stedolan, @itchyny et @owenthereal, d’après leurs noms d’utilisateur GitHub

  • jq et miller sont des indispensables dans ma boîte à outils, avec awk et vim
    https://github.com/johnkerl/miller

  • La nouvelle fonction intégrée pick(stream) ajoute la possibilité d’émettre une projection de l’objet ou du tableau d’entrée
    jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | pick(.a, .b.c, .x)'
    C’est vraiment une fonction providentielle. Merci aux contributeurs

    • Si vous n’avez pas besoin de creuser en profondeur, on peut aussi faire ainsi
      $ jq -n '{"a": 1, "b": {"c": 2, "d": 3}, "e": 4} | {a, e}'
      {
      "a": 1,
      "e": 4
      }
    • Je l’ai installée depuis Git il y a quelques jours pour utiliser cette fonctionnalité, et elle est très utile
    • C’est vraiment une excellente nouveauté. Pour l’instant, cela semble impossible sans réassembler d’abord le flux ; ce serait donc bien d’avoir une version de pick qui fonctionne aussi sur des données en streaming
  • Je voudrais aussi recommander jaq. C’est un clone de jq axé sur l’exactitude, la vitesse et la simplicité
    Il n’implémente qu’un sous-ensemble de jq, mais je l’utilise jusqu’ici avec pas mal de satisfaction : https://github.com/01mf02/jaq