App Engine Python のローカルサーバを起動する関数

Emacs Lispでスクリプト処理 ― ありえるえりあ

こちらに触発されて、自家製コマンドを elisp の関数に置き換える勝手プロジェクト進行中(笑


一日一善ならぬ、一日一関数(爆。手始めとして、App Engine Python のローカルサーバを起動するコマンドを置き換えてみました。

#!/bin/sh

set -x -e -u

bin=/usr/local/bin/dev_appserver.py

[ -f `pwd`/app.yaml -a -x ${bin} ] && \
    ${bin} --datastore_path=`pwd`/dev_appserver.datastore `pwd`

exit 0

必須要件は下記 3点ほど。

  • dev_appserver.py の有無、かつ起動したいアプリディレクトリ内の app.yaml の有無の確認。
  • /tmp が tmpfs のため、datastore のパスをオプション(--datastore_path)で渡すこと
  • カレントを移動せずに済むよう はフルパスで渡すこと

で、完成したのが下記の通り。

(defun dev-appserver-pwd ()
  (interactive)
  (let (
        (target (file-name-directory (buffer-file-name (get-buffer (buffer-name)))))
        (dev-appserver (executable-find "dev_appserver.py")) )
    (if (and dev-appserver
             (file-exists-p (format "%sapp.yaml" target)))
        (progn
          (setq buf-name (format "** dev_appserver Output: %s **" target))
          (get-buffer-create buf-name)
          (start-process "dev-appserver-pwd"
                         buf-name
                         dev-appserver
                         (format "--datastore_path=%sdev_appserver.datastore" target)
                         target) ))))

sh の方が端的。elisp の方が冗長か。しかし、emacs からターミナルに移動する必要がなくなったので、良しとしましょう。

追記

  • 機能分離できそうな関数を選別したこと
  • エラー処理
    • ファイルを編集中ではないバッファ(*scratch* など)で実行してしまった
    • あるいは app.yaml の無いディレクトリのファイルで実行してしまった
(defun get-directory-name-from-buffer-name ()
  (let ((target (buffer-file-name (get-buffer (buffer-name)))))
    (if target
        (file-name-directory traget))))

(defun dev-appserver-pwd ()
  (interactive)
  (let (
        (target (get-directory-name-from-buffer-name))
        (dev-appserver (executable-find "dev_appserver.py")) )
    (if target
        (if (and dev-appserver
                 (file-exists-p (format "%sapp.yaml" target)))
            (progn
              (setq buf-name (format "** dev_appserver Output: %s **" target))
              (get-buffer-create buf-name)
              (start-process "dev-appserver-pwd"
                             buf-name
                             dev-appserver
                             (format "--datastore_path=%sdev_appserver.datastore" target)
                             target))
          (message "dev_appserver.py or app.yaml is not exist!"))
      (message "Current Buffer is not file for google appeengine.") )))