pry-parsecom作りました

最近お仕事でParseを使っています。parse.comはいわゆるBaaSで、多言語のライブラリやブラウザから使える管理ツールも揃ってて手っ取り早く動くものを公開したいときにはとても便利なんですが*1、運用でデータストアをどうこうしたいときは基本ブラウザ上でデータブラウザを使うしかありません。もしくは、APIを利用して独自のツールを作るか。

まぁデータブラウザもものすごく悪いという感じでもないですが、可能であればコマンドラインで操作したい。rails consoleみたいに。もしくはpry-rails

ということで作りました。

http://github.com/technohippy/pry-parsecom

$ pry-parsecom
[1] pry(main)> login-parse
Email for parse.com: andyjpn@gmail.com
Password for parse.com: 
logged in
[2] pry(main)> show-applications
Email for parse.com: andyjpn@gmail.com
Password for parse.com: 
    Name   | Using
  ================
  FakeApp  |
  FakeApp2 |
(cached at: 2013-11-18 13:59:48 +0900)

起動してログインするとアプリの一覧が見られます。

[3] pry(main)> use-application FakeApp
The current app is FakeApp.
[4] pry(main)> show-classes
   Name   |    Class   
  =====================
  Comment | Comment    
  Post    | Post       
  _User   | Parse::User
(cached at: 2013-11-18 13:59:48 +0900)
[5] pry(main)> show-schema Post
    Name   |       Type
  ============================
  author   | pointer<_User>
  body     | string
  comments | relation<Comment>
(cached at: 2013-11-18 13:59:48 +0900)

使用するアプリを選択すればクラスの一覧や、クラスのスキーマも確認できます。

[6] pry(main)> posts = Post.find :all
=> [---
__type: Post
author:
  __type: Pointer
  className: _User
  objectId: ZybBXQEIjI
body: Hello
comments: <Ralations>
...snip...
[7] pry(main)> posts[0].body = 'World'
=> "World"
[8] pry(main)> posts[0].save

use-applicationコマンド実行時にParseのクラスに対応するRubyクラスを定義するので、手間いらずで検索や新規作成・更新・削除いろいろできます。Parseオブジェクトの操作は、合わせて自作したparsecomライブラリを使ってます。

http://github.com/technohippy/parsecom

game_score = GameScore.find_by_id 'Ed1nuqPvcm'
game_score.score = 73453
game_score.save

ParseのREST APIを使ってできることは、特殊なのを除いてだいたいできるはず。

game_scores = GameScore.find :where => proc {
  subquery = subquery_for :Team
  subquery.where {column(:winPct).gt(0.5)}
  subquery.key = 'city'
  column(:hometown).select(subquery)
}

使いやすいかどうかは別にして、サブクエリも発行できるライブラリは他にあんまりなさそう。

seans_score = GameScore.new 'score' => 1337, 'playerName' => 'Sean Plott'
zerocools_score = GameScore.new 'score' => 1338, 'playerName' => 'ZeroCool'
Parse.batch do
  seans_score.save
  zerocools_score.save
end

バッチリクエストも割と簡単。

[9] pry(main)> logout-parse
logged out
[10] pry(main)> exit

APIキーをローカルに保存するので、気になる人は終了前にログアウトしておいた方がいいかもしれません。

$ gem install pry-parsecom

で使えるようになります。軽い用途にはわりと便利に使えると思うのでよろしければどうぞ。

http://github.com/technohippy/pry-parsecom

*1:実際にプロダクションで使うととてもとても面倒くさいですが、それはまた別の話