読者です 読者をやめる 読者になる 読者になる

GitHubに上げるために、app.yamlのapplicationを変更するツールの作成

GoogleAppEngine Python

「作れば分かる本」のPython写経では、app.yamlのapplicationを修正してGitHubへ上げていた。
ただ、さすがに何度も同じことを手動で行うのはよくないので、Pythonプログラムを作成した。そのメモ。

■環境

■機能

変更したいapp.yamlファイルを読込み、applicationを修正し、app_forGitHub.yamlファイルとして出力する。

■実装するときに悩んだことと対応

似たようなソースコードがないかを探したところ、以下を組み合わせればできそうだった。あとはそれぞれのソースコードの理解のみ。

「if __name__ == '__main__':」とは何か?

GoogleAppEngineで作成するときには気にしなかったが、Web上では上記が含まれているソースコードを目にする機会が多い。
調べたところ、

ifの中身はスクリプトファイルとして実行された時にだけ実行されるらしい。
へたれプログラマな日々 - if __name__ == '__main__': について

とのことらしい。

コマンドラインからの引数の受け取り

sys.argvを使うとのこと。
Yukun's Blog - Python: コマンドライン引数の取得 – sys.argv変数

「sys.exit(1)」とは何か?

ドキュメントによると、「Pythonをステータス"1"(異常終了)として終了する」のように読み取れました。
Python 2.7ja1 documentation - 27.1. sys ― システムパラメータと関数


以下の様な記事もあり、例外の時にはsys.exit(1)のように使うのがよさそう。
蟲!虫!蟲! - Pythonであんまり意識しなかった"return 0"と"sys.exit()"について



ソースコード

gistにも上げました。


2012.11.02 追記
最初記載したコードでは、app.yamlの記述順が変わった状態で出力されてしまうため、ソースコードを差し替え。
最初記載したコードは、gistを参照ください。

# -*- coding: utf-8 -*-

import sys
import yaml
from collections import OrderedDict

# OrderedDictを出力するための関数
def represent_odict(dumper, instance):
     return dumper.represent_mapping(u'tag:yaml.org,2002:map', instance.items())

# OrderedDictを読み込むための関数
def construct_odict(loader, node):
    return OrderedDict(loader.construct_pairs(node))



def main(path, convertedPath):
    # 記述順で読み込めるようにadd_constructorで設定
    yaml.add_constructor(u'tag:yaml.org,2002:map', construct_odict)
    data = yaml.load(open(path).read().decode('utf-8'))

    data['application'] = u'<your application id>'

    # OrderedDictを出力できるように、add_representerにて設定
    yaml.add_representer(OrderedDict, represent_odict)
    yaml.dump(
        data,
        file(convertedPath, 'w'),
        default_flow_style=False,
        encoding='utf-8',
        allow_unicode=True
        )



if __name__ == '__main__':
    if len(sys.argv) < 2:
        print 'Usage: %s [filename]' % sys.argv[0]
        sys.exit(1)

    path = sys.argv[1]
    convertedPath = path.replace('.yaml', '_forGitHub.yaml', path.rindex('.'))

    main(path, convertedPath)