web-dev-qa-db-fra.com

Utiliser des espaces réservés dans yaml

Y a-t-il un moyen d'utiliser des espaces réservés dans yaml comme ceci:

foo: &FOO
    <<propname>>: 
        type: number 
        default: <<default>>

bar:
    - *FOO 
       propname: "some_prop"
       default: "some default" 
21
Trace

Le contexte

  • YAML version 1.2
  • l'utilisateur souhaite inclure des espaces réservés variables dans YAML

Problème

  • YAML ne supporte pas nativement les espaces réservés variables
  • Les ancres et les alias permettent un certain niveau d'abstraction et d'indirection, mais ils ne fonctionnent pas comme des espaces réservés variables pouvant être insérés dans des régions arbitraires dans le texte YAML. Ils doivent être placés en tant que nœuds YAML distincts
  • Certaines bibliothèques complémentaires prennent en charge des espaces réservés pour variables variables, mais elles ne font pas partie de la spécification YAML native.

Exemple

Considérez l'exemple suivant YAML. Il s'agit d'une syntaxe YAML bien formée, mais elle utilise des espaces réservés (non standard) entre accolades avec expressions incorporées.

Les expressions incorporées ne produisent pas le résultat souhaité en YAML, car elles ne font pas partie de la spécification YAML native. Néanmoins, ils ne sont utilisés dans cet exemple que pour illustrer ce qui est disponible avec YAML standard et ce qui ne l’est pas.

part01_customer_info:
  cust_fname:   "Homer"
  cust_lname:   "Himpson"
  cust_motto:   "I love donuts!"
  cust_email:   [email protected]

part01_government_info:
  govt_sales_taxrate: 1.15

part01_purchase_info:
  prch_unit_label:    "Bacon-Wrapped Fancy Glazed Donut"
  prch_unit_price:    3.00
  prch_unit_quant:    7
  prch_product_cost:  "{{prch_unit_price * prch_unit_quant}}"
  prch_total_cost:    "{{prch_product_cost * govt_sales_taxrate}}"

part02_shipping_info:
  cust_fname:   "{{cust_fname}}"
  cust_lname:   "{{cust_lname}}"
  ship_city:    Houston
  ship_state:   Hexas

part03_email_info:
  cust_email:     "{{cust_email}}"
  mail_subject:   Thanks for your DoughNutz order!
  mail_notes: |
    We want the mail_greeting to have all the expected values
    with filled-in placeholders (and not curly-braces).
  mail_greeting: |
    Greetings {{cust_fname}} {{cust_lname}}!

    We love your motto "{{cust_motto}}" and we agree with you!

    Your total purchase price is {{prch_total_cost}}

    Thank you for your order!

Explication

  • Les substitutions marquées en [~ # ~] vert [~ # ~] sont facilement disponibles en YAML standard, en utilisant des ancres, des alias et touches de fusion .

  • Les substitutions marquées en [~ # ~] jaune [~ # ~] sont techniquement disponibles en YAML standard, mais pas sans type personnalisé) déclaration , ou un autre mécanisme de liaison.

  • Les substitutions marquées en [~ # ~] en rouge [~ # ~] ne sont pas disponibles en YAML standard. Pourtant, il existe des solutions de contournement et des alternatives; tels que format de chaîne ou des moteurs de modèles de chaîne (tels que str.format de python).

Image explaining the different types of variable substitution in YAML

Détails

Une fonctionnalité fréquemment demandée pour YAML est la possibilité d'insérer des espaces réservés de variables arbitraires prenant en charge des références croisées et des expressions arbitraires se rapportant à l'autre contenu du même (ou transcluded fichier (s) YAML.

YAML prend en charge les ancres et les alias, mais cette fonctionnalité ne prend pas en charge le placement arbitraire d’espaces réservés et d’expressions dans le texte YAML. Ils ne fonctionnent qu'avec les nœuds YAML.

YAML prend également en charge déclaration de type personnalisé s; toutefois, ils sont moins courants et la sécurité peut être compromise si vous acceptez le contenu YAML provenant de sources potentiellement non fiables.

Bibliothèques addon YAML

Il existe des bibliothèques d'extension YAML, mais elles ne font pas partie de la spécification YAML native.

Solutions de contournement

  • Utilisez YAML en conjonction avec un système de gabarit, tel que Jinja2 ou Twig
  • Utiliser une bibliothèque d'extension YAML
  • Utilisez les fonctionnalités de style sprintf ou str.format À partir du langage d'hébergement

Voir également

58
dreftymac