Hatena::ブログ(Diary)

urekatのスカンク日記3 このページをアンテナに追加 RSSフィード

2009-08-01

[][][]irbからGAEのDataStoreの中身を見たり、GAEアプリRSpecしたり

New!⇒ GAE/JRubyグループを作ってみました

dev_appserver.shを使わずにGAEのローカル環境を作り出して、

irbからDataStoreの中身を見たり、RSpecユニットテスト書いたりできるようになりました。

WEB-INF/lib/local_gae.rb

# jruby -J-cp $GAEJ_HOME/lib/impl/appengine-api-stubs.jar:$GAEJ_HOME/lib/impl/appengine-local-runtime.jar:$GAEJ_HOME/lib/impl/appengine-api.jar local_gae.rb

# http://www.okisoft.co.jp/esc/ruby/tut-08.html
# http://code.google.com/intl/ja/appengine/docs/java/howto/unittesting.html

class LocalGAE
  require "java"
  import "com.google.apphosting.api.ApiProxy"
  import "com.google.appengine.tools.development.ApiProxyLocalImpl"
  import "com.google.appengine.api.datastore.dev.LocalDatastoreService"

  class GaeEnvironment
    include ApiProxy::Environment
    def getAppId;               "JRubyLocal" end
    def getVersionId;           "1.0"        end
    def setDefaultNamespace(s);              end
    def getRequestNamespace;    nil          end
    def getDefaultNamespace;    nil          end
    def getAuthDomain;          nil          end
    def isLoggedIn;             false        end
    def getEmail;               nil          end
    def isAdmin;                false        end
  end

  class EmptyApiProxyLocalImpl < ApiProxyLocalImpl
  end

  def self.setup(profile_dir=nil)
    profile_dir ||= "./_tmp_gae_profile"
    #puts "setup"
    ApiProxy.setEnvironmentForCurrentThread(GaeEnvironment.new)
    localImpl = EmptyApiProxyLocalImpl.new( java.io.File.new(profile_dir) )
    ApiProxy.setDelegate(localImpl)

    proxy = ApiProxy.getDelegate
    proxy.setProperty(LocalDatastoreService::NO_STORAGE_PROPERTY, "true")
  end

  def self.teardown
    proxy = ApiProxy.getDelegate
    datastoreService = proxy.getService("datastore_v3")
    datastoreService.clearProfiles
    ApiProxy.setDelegate(nil)
    ApiProxy.setEnvironmentForCurrentThread(nil)
    #puts "teardown"
  end

  def self.run(profile_dir=nil)
    setup(profile_dir)
    yield(ApiProxy.getDelegate)
    teardown
  end
end

if __FILE__ == $0
  LocalGAE.run do |proxy|
    p proxy
  end
  exit
end

WEB-INF/gae_irb.rb

# jruby -J-cp $GAEJ_HOME/lib/impl/appengine-api-stubs.jar:$GAEJ_HOME/lib/impl/appengine-local-runtime.jar:$GAEJ_HOME/lib/impl/appengine-api.jar gae_irb.rb
require "irb"

ENV["GEM_HOME"] = "./gems"
$: << "./lib/dm-datastore-adapter.jar"
require "app"

require "lib/local_gae"
LocalGAE.run do
  IRB.start
end
exit

こんな感じで実行↓

cd WEB-INF
WEB-INF% jruby -J-cp $GAEJ_HOME/lib/impl/appengine-api-stubs.jar:$GAEJ_HOME/lib/impl/appengine-local-runtime.jar:$GAEJ_HOME/lib/impl/appengine-api.jar gae_irb.rb
irb(main):001:0> Post.count
=> 0
irb(main):002:0> Post.create(:body=>"asdf")        
=> #<Post id=1 body="asdf" created_at=#<DateTime: 212115893129/86400,3/8,2299161>>
irb(main):003:0> Post.create(:body=>"qwer")
=> #<Post id=2 body="qwer" created_at=#<DateTime: 70705297711/28800,3/8,2299161>>
irb(main):004:0> Post.create(:body=>"xxxx")
=> #<Post id=3 body="xxxx" created_at=#<DateTime: 4419081107/1800,3/8,2299161>>
irb(main):005:0> Post.create(:body=>"yryry")
=> #<Post id=4 body="yryry" created_at=#<DateTime: 10605794657/4320,3/8,2299161>>
irb(main):006:0> Post.all.each{|post| p [post.id, post.body, post.created_at] }
[1, "asdf", #<DateTime: 212115893129/86400,3/8,2299161>]
[2, "qwer", #<DateTime: 70705297711/28800,3/8,2299161>]
[3, "xxxx", #<DateTime: 4419081107/1800,3/8,2299161>]
[4, "yryry", #<DateTime: 10605794657/4320,3/8,2299161>]
=> [#<Post id=1 body="asdf" created_at=#<DateTime: 212115893129/86400,3/8,2299161>>, #<Post id=2 body="qwer" created_at=#<DateTime: 70705297711/28800,3/8,2299161>>, #<Post id=3 body="xxxx" created_at=#<DateTime: 4419081107/1800,3/8,2299161>>, #<Post id=4 body="yryry" created_at=#<DateTime: 10605794657/4320,3/8,2299161>>]
irb(main):007:0>

WEB-INF/unit_test.rb

# jruby -J-cp $GAEJ_HOME/lib/impl/appengine-api-stubs.jar:$GAEJ_HOME/lib/impl/appengine-local-runtime.jar:$GAEJ_HOME/lib/impl/appengine-api.jar unit_test.rb

ENV["GEM_HOME"] = "./gems"
$: << "./lib/dm-datastore-adapter.jar"
require "app"

require "lib/local_gae"
LocalGAE.run do
  Post.create()
  Post.create()
  Post.create()
  Post.create()
  p Post.count
end
exit

設定ファイルを読んでWebと同じ環境を作るとかロードパスの自動ロードとか、

RSpecとの上手い組み合わせとかは誰かがやってくれるはず。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

Connection: close