/ / Wie soll ich YAML-Arrays mit dem Cookiecutter ordentlich rendern? - Python, yaml, jinja2, Template-Engine, Ausstecher

Wie sollte ich YAML-Arrays sauber mit Cookiecutter rendern? - Python, Yaml, Jinja2, Templating-Engine, Cookiecutter

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 ifs 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 № 1

Sie 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 nodies 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.