Ich habe eine Cookiecutter-Vorlage, die eine YAML-Datei basierend auf einigen Optionen darstellen soll.
Angenommen, eine gerenderte YAML-Datei könnte folgendermaßen aussehen:
supported_databases:
- mysql
- postgres
Und mein Ausstecher JSON sah so aus:
{
"mysql": ["yes", "no"],
"postgres": ["yes", "no"]
}
Meine YAML-Datei wird furchtbar gespickt if
s zur Unterstützung aller 4 gültigen Kombinationen:
{%- if cookiecutter.mysql == "yes" or cookiecutter.postgres == "yes" %}
supported_databases:
{%- if cookiecutter.mysql == "yes" %}
- mysql
{%- endif %}
{%- if cookiecutter.mysql == "yes" %}
- postgres
{%- endif %}
{%- endif %}
Das Äußere if
ist erforderlich, um zu verhindern, dass ungültige YAML in dem Fall gerendert wird, wenn beide Optionen "nein" sind
Gibt es einen besseren Weg, um dies zu erreichen?
Danke für jede Hilfe.
Antworten:
2 für die Antwort № 1Sie können den Fließstil von YAML nutzen:
supported_databases: [
{% for db_type in ["mysql", "postgres"] %}
{% if cookiecutter[db_type] == "yes" %}{{ db_type }},{% endif %}
{% endfor %}
]
Wenn beide möglichkeiten sind no
dies macht:
supported_databases: [
]
Welches ist gültige YAML, die eine leere Sequenz als Wert für darstellt supported_databases
.
Mit beiden Optionen erhalten Sie
supported_databases: [
mysql,
postgres,
]
Dies gilt auch für YAML, da YAML im Gegensatz zu JSON ein nachfolgendes Komma in Sequenzen zulässt. Diese YAML entspricht semantisch der YAML, die Sie in der Frage anzeigen.
Achtung: Code wurde nicht getestet.