2017-02-07 4 views
1

YAMLとJinja2のリーダー

{% set name = "abawaca" %} 
{% set version = "1.00" %} 

package: 
    name: {{ name }} 
    version: {{ version }} 

source: 
    fn: {{ name }}-{{ version }}.tar.gz 
    url: https://github.com/CK7/abawaca/archive/v{{ version }}.tar.gz 
    sha256: 57465bb291c3a9af93605ffb11d704324079036205e5ac279601c9e98c467529 

build: 
    number: 0 

requirements: 
    build: 
     - gcc # [not osx] 
     - llvm # [osx] 
+1

私は完全な作業例で私の答えを更新しました。申し訳ありませんが、これに戻るにはとても時間がかかりました。 – Anthon

答えて

1

あなたの入力は、あなたのように、有効なYAMLではありません簡単にチェックすることができます。 here 最初{% %}構造を展開し、YAMLを処理するか、有効なYAMLにあなたのファイルを作成する必要がありますする必要があります。

これは、マクロシーケンス{% ... %}がYAMLで特別な意味を持つ文字({)で始まるjinja2を選択したことの結果の一部です。

あなたはYAMLを変更し、再びそれを記述する必要がある場合は、独自の区切り文字を定義することができますし、YAMLで特別な意味を持っていないように、それらを選択してください。

{% %}マッピングを持っているだけで、キーと値のペアを持つ必要があり、トップレベルにあるとして、あなたはYAMLのコメントブロックに入れる必要があります。それを達成する1つの方法は、開始を#% %#として再定義することです(必ずしも終了を変更する必要はありませんが、私は対称性を優先します)。

更新後、ファイルを処理する小さなスクリプトで正しいYAMLを実行し、jinja2が使用する実際の定義を変更するために、jinja2が理解できるものに区切り文字を置き換えるか、環境を調整します。

data.yamlを修正:

#% set name = "abawaca" %# 
#% set version = "1.00" %# 

package: 
    name: <{ name }> 
    version: 42 

source: 
    fn: <{ name }>-<{ version }>.tar.gz 
    url: https://github.com/CK7/abawaca/archive/v<{ version }>.tar.gz 
    sha256: 57465bb291c3a9af93605ffb11d704324079036205e5ac279601c9e98c467529 

build: 
    number: 0 

requirements: 
    build: 
     - gcc # [not osx] 
     - llvm # [osx] 

これは、によって処理することができます与えること

import jinja2 
from ruamel import yaml 

yaml_file = 'data.yaml' 
tmp_file = 'tmp.yaml' 

data = yaml.round_trip_load(open(yaml_file)) 
data['package']['version'] = '<{ version }>' 
with open(tmp_file, 'w') as fp: 
    yaml.round_trip_dump(data, fp) 

environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(searchpath='.'), 
    trim_blocks=True, 
    block_start_string='#%', block_end_string='%#', 
    variable_start_string='<{', variable_end_string='}>') 

    print(environment.get_template(tmp_file).render()) 

package: 
    name: abawaca 
    version: 1.00 

source: 
    fn: abawaca-1.00.tar.gz 
    url: https://github.com/CK7/abawaca/archive/v1.00.tar.gz 
    sha256: 57465bb291c3a9af93605ffb11d704324079036205e5ac279601c9e98c467529 

build: 
    number: 0 

requirements: 
    build: 
    - gcc  # [not osx] 
    - llvm  # [osx] 

をあなたは `ruamel.yaml(免責事項を使用する必要があることに注意してください:私はそのパッケージの作者です)、PyYAMLを使って簡単にこれを実行することはできませんYAMLファイルを読み込んでいます。コメント内のすべてのjinja2はファイルの先頭にあるので、この特定の例でこれを回避することはできますが、一般的にはそうではありません。

+0

ありがとう@anthonしかし、yamlをプログラム的に拡張し、yamlで結果を読み取る方法を知っていますか? – ypriverol

+0

構文を展開するには、jinja2から構文を展開し、ファイルを取得し、パーサーでそのファイルを読み込みます。 – Anthon

+0

私はこれを前に試してもうまくいかない例(スニペットコード)を持っていますか? – ypriverol