stackmob 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/Gemfile +16 -0
- data/Gemfile.lock +47 -0
- data/LICENSE.txt +175 -0
- data/README.md +210 -0
- data/Rakefile +59 -0
- data/VERSION +1 -0
- data/lib/stackmob.rb +67 -0
- data/lib/stackmob/client.rb +90 -0
- data/lib/stackmob/data_store.rb +74 -0
- data/lib/stackmob/deployer.rb +37 -0
- data/lib/stackmob/helpers.rb +63 -0
- data/lib/stackmob/push.rb +63 -0
- data/lib/stackmob/rack/simple_oauth_provider.rb +59 -0
- data/lib/stackmob/rails.rb +15 -0
- data/lib/stackmob/railtie.rb +38 -0
- data/lib/stackmob/sinatra.rb +5 -0
- data/lib/stackmob/tasks.rb +40 -0
- data/stackmob.gemspec +99 -0
- data/test/helper.rb +22 -0
- data/test/integration/test_client.rb +45 -0
- data/test/integration/test_data_store.rb +31 -0
- data/test/integration/test_deployer.rb +23 -0
- data/test/integration/test_push.rb +24 -0
- data/test/integration_helper.rb +46 -0
- data/test/unit/stackmob/rack/test_simple_oauth_provider.rb +52 -0
- data/test/unit/stackmob/test_client.rb +105 -0
- data/test/unit/stackmob/test_data_store.rb +83 -0
- data/test/unit/stackmob/test_deployer.rb +21 -0
- data/test/unit/stackmob/test_push.rb +133 -0
- metadata +258 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'rack/test'
|
3
|
+
|
4
|
+
class DummyApp
|
5
|
+
def call(env)
|
6
|
+
[200, {}, ""]
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class SimpleOAuthProviderTest < MiniTest::Unit::TestCase
|
11
|
+
include Rack::Test::Methods
|
12
|
+
|
13
|
+
def app
|
14
|
+
StackMob::Rack::SimpleOAuthProvider.new(DummyApp.new)
|
15
|
+
end
|
16
|
+
|
17
|
+
def http_host
|
18
|
+
"jordan.panic.int.mob:3000"
|
19
|
+
end
|
20
|
+
|
21
|
+
def secret
|
22
|
+
"ebfe8b21-9401-421c-9b98-28bd721cf367"
|
23
|
+
end
|
24
|
+
|
25
|
+
def valid_oauth_header
|
26
|
+
"OAuth realm=\"\", oauth_signature=\"5JXBwMgL7yBrsDbxUCrfmidJ1gU%3D\", oauth_nonce=\"1312914650715662000\", oauth_signature_method=\"HMAC-SHA1\", oauth_consumer_key=\"655b062d-8c36-413d-ac0f-8354ca32c5ad\", oauth_timestamp=\"1312914650\""
|
27
|
+
end
|
28
|
+
|
29
|
+
def invalid_oauth_header
|
30
|
+
# this header has a slightly altered signature
|
31
|
+
"OAuth realm=\"\", oauth_signature=\"5XBwMgL7yBrsDbxUCrfmidJ1gU%3D\", oauth_nonce=\"1312914650715662000\", oauth_signature_method=\"HMAC-SHA1\", oauth_consumer_key=\"655b062d-8c36-413d-ac0f-8354ca32c5ad\", oauth_timestamp=\"1312914650\""
|
32
|
+
end
|
33
|
+
|
34
|
+
def setup
|
35
|
+
StackMob.stubs(:config).returns('development' => {}, 'production' => {})
|
36
|
+
StackMob.stubs(:secret).returns("ebfe8b21-9401-421c-9b98-28bd721cf367")
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_successful_oauth
|
40
|
+
get "/", {}, {"HTTP_AUTHORIZATION" => valid_oauth_header, "HTTP_HOST" => http_host}
|
41
|
+
|
42
|
+
assert last_response.ok?, "OAuth Failed When it Shouldn't Have"
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_failed_oauth
|
46
|
+
get "/", {}, {"HTTP_AUTHORIZATION" => invalid_oauth_header, "HTTP_HOST" => http_host}
|
47
|
+
|
48
|
+
assert !last_response.ok?, "OAuth Suceeded When it Shouldn't Have"
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class StackmobClientTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
attr_reader :valid_client
|
6
|
+
|
7
|
+
def app_name
|
8
|
+
"test"
|
9
|
+
end
|
10
|
+
|
11
|
+
def app_vsn
|
12
|
+
0
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_params
|
16
|
+
{:abc => 123, :def => 456}
|
17
|
+
end
|
18
|
+
|
19
|
+
def stub_all_requests(method, resp_obj)
|
20
|
+
OAuth::AccessToken.any_instance.stubs(method).returns(resp_obj)
|
21
|
+
end
|
22
|
+
|
23
|
+
def setup
|
24
|
+
@valid_client = StackMob::Client.new("http://123.com/", app_name, app_vsn, "some-valid-test-key", "some-valid-test-secret")
|
25
|
+
@test_hash = {"a" => 1, "b" => 2}
|
26
|
+
@good_resp = mock("Net::HTTPResponse")
|
27
|
+
@good_resp.stubs(:code).returns(200)
|
28
|
+
@good_resp.stubs(:body).returns(Yajl::Encoder.encode(@test_hash))
|
29
|
+
|
30
|
+
# hack to give test suite access to underlying oauth object
|
31
|
+
class << valid_client
|
32
|
+
def _oauth
|
33
|
+
@oauth_client
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_response_json_parsed
|
39
|
+
stub_all_requests(:get, @good_resp)
|
40
|
+
|
41
|
+
assert_equal @test_hash, valid_client.request(:get, :some_service, "/abc")
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_requesting_invalid_method_raises_error
|
45
|
+
assert_raises StackMob::Client::InvalidRequestMethod do
|
46
|
+
valid_client.request(:invalid, :some_service, "/asd")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_when_resp_code_is_not_200
|
51
|
+
failed = mock("Net::HTTPResponse")
|
52
|
+
failed.stubs(:code).returns(404)
|
53
|
+
stub_all_requests(:get, failed)
|
54
|
+
|
55
|
+
|
56
|
+
assert_raises StackMob::Client::RequestError do
|
57
|
+
valid_client.request(:get, :some_service, "/asd")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_when_json_parsing_will_raise_an_error
|
62
|
+
resp_w_invalid_body = mock("Net::HTTPResponse")
|
63
|
+
resp_w_invalid_body.stubs(:code).returns(200)
|
64
|
+
resp_w_invalid_body.stubs(:body).returns("this is not valid json")
|
65
|
+
stub_all_requests(:get, resp_w_invalid_body)
|
66
|
+
|
67
|
+
assert_raises StackMob::Client::BadResponseBody do
|
68
|
+
valid_client.request(:get, :some_service, "/asd")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_get_with_request_params
|
73
|
+
service = :some_service
|
74
|
+
path = "user"
|
75
|
+
|
76
|
+
valid_client._oauth.expects(:get).with("/#{service}/#{app_vsn}/#{app_name}/#{path}?abc=123&def=456", "").returns(@good_resp)
|
77
|
+
valid_client.request(:get, service, path, test_params)
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_post_with_request_params
|
81
|
+
service = :some_service
|
82
|
+
path = "user"
|
83
|
+
@good_resp.stubs(:code).returns(201)
|
84
|
+
|
85
|
+
valid_client._oauth.expects(:post).with("/#{service}/#{app_vsn}/#{app_name}/#{path}", Yajl::Encoder.encode(test_params)).returns(@good_resp)
|
86
|
+
valid_client.request(:post, service, path, test_params)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_delete_with_request_params
|
90
|
+
service = :a_service
|
91
|
+
path = "abc"
|
92
|
+
|
93
|
+
valid_client._oauth.expects(:delete).with("/#{service}/#{app_vsn}/#{app_name}/#{path}?something=123", "").returns(@good_resp)
|
94
|
+
valid_client.request(:delete, service, path, something: "123")
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_put_with_request_params
|
98
|
+
service = :some_service
|
99
|
+
path = "abc"
|
100
|
+
|
101
|
+
valid_client._oauth.expects(:put).with("/#{service}/#{app_vsn}/#{app_name}/#{path}", Yajl::Encoder.encode(test_params)).returns(@good_resp)
|
102
|
+
valid_client.request(:put, service, path, test_params)
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class StackMobDataStoreTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@mock_client = mock("StackMob::Client")
|
7
|
+
@datastore = StackMob::DataStore.new(@mock_client)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_given_client_is_returned_client
|
11
|
+
assert_equal @mock_client, @datastore.client
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_api_schema_calls_listapi
|
15
|
+
@mock_client.expects(:request).with(:get, :api, "/listapi").returns("obj" => "")
|
16
|
+
@datastore.api_schema
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_delete_call
|
20
|
+
uid = "abc"
|
21
|
+
|
22
|
+
@mock_client.expects(:request).with(:delete, :api, "/user", :user_id => uid).returns(nil)
|
23
|
+
@datastore.delete(:user, :user_id => uid)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_create_call
|
27
|
+
name = "test user"
|
28
|
+
|
29
|
+
@mock_client.expects(:request).with(:post, :api, "/user", :name => name).returns(nil)
|
30
|
+
@datastore.create(:user, :name => name)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_get_all_call
|
34
|
+
@mock_client.expects(:request).with(:get, :api, "/user", Hash.new).returns(nil)
|
35
|
+
@datastore.get(:user)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_update_call
|
39
|
+
uid = "abc"
|
40
|
+
name = "test user"
|
41
|
+
params = {:name => name}
|
42
|
+
|
43
|
+
@mock_client.expects(:request).with(:put, :api, "/user/#{uid}", params).returns(nil)
|
44
|
+
@datastore.update(:user, uid, params)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_create_returns_false_on_request_error
|
48
|
+
@mock_client.expects(:request).raises(StackMob::Client::RequestError)
|
49
|
+
assert !@datastore.create(:user, :name => "def")
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_create_bang_does_not_catch_error
|
53
|
+
@mock_client.expects(:request).raises(StackMob::Client::RequestError)
|
54
|
+
assert_raises StackMob::Client::RequestError do
|
55
|
+
@datastore.create!(:user, :name => "def")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_update_returns_false_on_request_error
|
60
|
+
@mock_client.expects(:request).raises(StackMob::Client::RequestError)
|
61
|
+
assert !@datastore.update(:user, "123", :name => "def")
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_update_bang_does_not_catch_error
|
65
|
+
@mock_client.expects(:request).raises(StackMob::Client::RequestError)
|
66
|
+
assert_raises StackMob::Client::RequestError do
|
67
|
+
@datastore.update!(:user, "123", :name => "def")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_delete_returns_false_on_request_error
|
72
|
+
@mock_client.expects(:request).raises(StackMob::Client::RequestError)
|
73
|
+
assert !@datastore.delete(:user, :name => "ads")
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_delete_bang_does_not_catch_error
|
77
|
+
@mock_client.expects(:request).raises(StackMob::Client::RequestError)
|
78
|
+
assert_raises StackMob::Client::RequestError do
|
79
|
+
@datastore.delete!(:user, :name => "def")
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class StackMobDeployerTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@mock_client = mock("StackMob::Client")
|
7
|
+
@deployer = StackMob::Deployer.new(@mock_client)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_register_call
|
11
|
+
hostname = "testing1234"
|
12
|
+
@mock_client.expects(:request).with(:post, :api, "heroku/app", :hostname => hostname)
|
13
|
+
@deployer.register(hostname)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_fetch_call
|
17
|
+
@mock_client.expects(:request).with(:get, :api, "heroku/app")
|
18
|
+
@deployer.fetch
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class StackMobPushTest < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@test_token = "abcdefghijklmnopqrstuv"
|
7
|
+
@user_id = "123"
|
8
|
+
|
9
|
+
@mock_client = mock("StackMob::Client")
|
10
|
+
@push = StackMob::Push.new(@mock_client)
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_given_client_is_returned_client
|
14
|
+
assert_equal @mock_client, @push.client
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_register_call
|
18
|
+
@mock_client.expects(:request).with(:post, :push, "/device_tokens", :userId => @user_id, :token => @test_token).returns(nil)
|
19
|
+
@push.register(@user_id, @test_token)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_broadcast_call
|
23
|
+
badge = 1,
|
24
|
+
sound = "testsound.mp3"
|
25
|
+
alert = "testing"
|
26
|
+
|
27
|
+
expected_body = {:recipients => [],
|
28
|
+
:aps => {:alert => alert, :sound => sound, :badge => badge},
|
29
|
+
:areRecipientsDeviceTokens => true,
|
30
|
+
:exclude_tokens => []}
|
31
|
+
expected_params = [:post, :push, "/push_broadcast", expected_body]
|
32
|
+
@mock_client.expects(:request).with(*expected_params).returns(nil)
|
33
|
+
|
34
|
+
@push.broadcast(:badge => badge, :sound => sound, :alert => alert)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_broadcast_missing_alert_raises_error
|
38
|
+
assert_raises ArgumentError do
|
39
|
+
@push.broadcast(:badge => 0, :sound => "")
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_broadcast_badge_defaults_to_zero
|
44
|
+
sound = "test.mp3"
|
45
|
+
alert = "alert message"
|
46
|
+
|
47
|
+
expected_body = {:recipients => [],
|
48
|
+
:aps => {:alert => alert, :sound => sound, :badge => 0},
|
49
|
+
:areRecipientsDeviceTokens => true,
|
50
|
+
:exclude_tokens => []}
|
51
|
+
expected_params = [:post, :push, "/push_broadcast", expected_body]
|
52
|
+
@mock_client.expects(:request).with(*expected_params).returns(nil)
|
53
|
+
@push.broadcast(:sound => sound, :alert => alert)
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_broadcast_sound_defaults_to_empty_string
|
57
|
+
badge = 1
|
58
|
+
alert = "alert message"
|
59
|
+
|
60
|
+
expected_body = {:recipients => [],
|
61
|
+
:aps => {:alert => alert, :sound => "", :badge => badge},
|
62
|
+
:areRecipientsDeviceTokens => true,
|
63
|
+
:exclude_tokens => []}
|
64
|
+
expected_params = [:post, :push, "/push_broadcast", expected_body]
|
65
|
+
@mock_client.expects(:request).with(*expected_params).returns(nil)
|
66
|
+
@push.broadcast(:badge => badge, :alert => alert)
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_send_messsage_to_one_call
|
70
|
+
sound = "testsound.mp3"
|
71
|
+
alert = "Single Message"
|
72
|
+
badge = 2
|
73
|
+
token = "abc"
|
74
|
+
|
75
|
+
expected_body = {:recipients => [token],
|
76
|
+
:aps => {:badge => badge, :sound => sound, :alert => alert},
|
77
|
+
:areRecipientsDeviceTokens => true,
|
78
|
+
:exclude_tokens => []}
|
79
|
+
expected_params = [:post, :push, "/push", expected_body]
|
80
|
+
@mock_client.expects(:request).with(*expected_params).returns(nil)
|
81
|
+
@push.send_message(token, :alert => alert, :sound => sound, :badge => badge)
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_send_message_without_alert_raises_error
|
85
|
+
assert_raises ArgumentError do
|
86
|
+
@push.send_message("avc", :sound => "somefile.mp3", :badge => 1)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_send_message_defaults_badge_to_zero
|
91
|
+
sound = "testsound.mp3"
|
92
|
+
alert = "Single Message"
|
93
|
+
token = "abc"
|
94
|
+
|
95
|
+
expected_body = {:recipients => [token],
|
96
|
+
:aps => {:badge => 0, :sound => sound, :alert => alert},
|
97
|
+
:areRecipientsDeviceTokens => true,
|
98
|
+
:exclude_tokens => []}
|
99
|
+
expected_params = [:post, :push, "/push", expected_body]
|
100
|
+
@mock_client.expects(:request).with(*expected_params).returns(nil)
|
101
|
+
@push.send_message(token, :alert => alert, :sound => sound)
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_send_message_defaults_sound_to_empty_string
|
105
|
+
alert = "Single Message"
|
106
|
+
badge = 2
|
107
|
+
token = "abc"
|
108
|
+
|
109
|
+
expected_body = {:recipients => [token],
|
110
|
+
:aps => {:badge => badge, :sound => "", :alert => alert},
|
111
|
+
:areRecipientsDeviceTokens => true,
|
112
|
+
:exclude_tokens => []}
|
113
|
+
expected_params = [:post, :push, "/push", expected_body]
|
114
|
+
@mock_client.expects(:request).with(*expected_params).returns(nil)
|
115
|
+
@push.send_message(token, :alert => alert, :badge => badge)
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_send_message_with_user_ids
|
119
|
+
sound = "testsound.mp3"
|
120
|
+
alert = "Single Message"
|
121
|
+
badge = 2
|
122
|
+
token = "abc"
|
123
|
+
|
124
|
+
expected_body = {:recipients => [token],
|
125
|
+
:aps => {:badge => badge, :sound => sound, :alert => alert},
|
126
|
+
:areRecipientsDeviceTokens => false,
|
127
|
+
:exclude_tokens => []}
|
128
|
+
expected_params = [:post, :push, "/push", expected_body]
|
129
|
+
@mock_client.expects(:request).with(*expected_params).returns(nil)
|
130
|
+
@push.send_message(token, :alert => alert, :sound => sound, :badge => badge, :recipients_are_users => true)
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
metadata
ADDED
@@ -0,0 +1,258 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: stackmob
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 31
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 0.0.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- StackMob
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-08-24 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
type: :runtime
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ~>
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 5
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
- 4
|
31
|
+
- 5
|
32
|
+
version: 0.4.5
|
33
|
+
version_requirements: *id001
|
34
|
+
name: oauth
|
35
|
+
prerelease: false
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
type: :runtime
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 59
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
- 8
|
47
|
+
- 2
|
48
|
+
version: 0.8.2
|
49
|
+
version_requirements: *id002
|
50
|
+
name: yajl-ruby
|
51
|
+
prerelease: false
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
type: :development
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
version_requirements: *id003
|
64
|
+
name: minitest
|
65
|
+
prerelease: false
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
type: :development
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ~>
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 7
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
- 6
|
77
|
+
- 0
|
78
|
+
version: 0.6.0
|
79
|
+
version_requirements: *id004
|
80
|
+
name: yard
|
81
|
+
prerelease: false
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
type: :development
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
version_requirements: *id005
|
94
|
+
name: cucumber
|
95
|
+
prerelease: false
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
type: :development
|
98
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
hash: 23
|
104
|
+
segments:
|
105
|
+
- 1
|
106
|
+
- 0
|
107
|
+
- 0
|
108
|
+
version: 1.0.0
|
109
|
+
version_requirements: *id006
|
110
|
+
name: bundler
|
111
|
+
prerelease: false
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
type: :development
|
114
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - ~>
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
hash: 7
|
120
|
+
segments:
|
121
|
+
- 1
|
122
|
+
- 6
|
123
|
+
- 4
|
124
|
+
version: 1.6.4
|
125
|
+
version_requirements: *id007
|
126
|
+
name: jeweler
|
127
|
+
prerelease: false
|
128
|
+
- !ruby/object:Gem::Dependency
|
129
|
+
type: :development
|
130
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
hash: 3
|
136
|
+
segments:
|
137
|
+
- 0
|
138
|
+
version: "0"
|
139
|
+
version_requirements: *id008
|
140
|
+
name: rcov
|
141
|
+
prerelease: false
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
type: :development
|
144
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ">="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
hash: 3
|
150
|
+
segments:
|
151
|
+
- 0
|
152
|
+
version: "0"
|
153
|
+
version_requirements: *id009
|
154
|
+
name: mocha
|
155
|
+
prerelease: false
|
156
|
+
- !ruby/object:Gem::Dependency
|
157
|
+
type: :development
|
158
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
159
|
+
none: false
|
160
|
+
requirements:
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
hash: 3
|
164
|
+
segments:
|
165
|
+
- 0
|
166
|
+
version: "0"
|
167
|
+
version_requirements: *id010
|
168
|
+
name: rack-test
|
169
|
+
prerelease: false
|
170
|
+
- !ruby/object:Gem::Dependency
|
171
|
+
type: :development
|
172
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
173
|
+
none: false
|
174
|
+
requirements:
|
175
|
+
- - ">="
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
hash: 3
|
178
|
+
segments:
|
179
|
+
- 0
|
180
|
+
version: "0"
|
181
|
+
version_requirements: *id011
|
182
|
+
name: bluecloth
|
183
|
+
prerelease: false
|
184
|
+
description: Support Gem for StackMob Heroku Add-On
|
185
|
+
email: jordan@stackmob.com
|
186
|
+
executables: []
|
187
|
+
|
188
|
+
extensions: []
|
189
|
+
|
190
|
+
extra_rdoc_files:
|
191
|
+
- LICENSE.txt
|
192
|
+
- README.md
|
193
|
+
files:
|
194
|
+
- .document
|
195
|
+
- Gemfile
|
196
|
+
- Gemfile.lock
|
197
|
+
- LICENSE.txt
|
198
|
+
- README.md
|
199
|
+
- Rakefile
|
200
|
+
- VERSION
|
201
|
+
- lib/stackmob.rb
|
202
|
+
- lib/stackmob/client.rb
|
203
|
+
- lib/stackmob/data_store.rb
|
204
|
+
- lib/stackmob/deployer.rb
|
205
|
+
- lib/stackmob/helpers.rb
|
206
|
+
- lib/stackmob/push.rb
|
207
|
+
- lib/stackmob/rack/simple_oauth_provider.rb
|
208
|
+
- lib/stackmob/rails.rb
|
209
|
+
- lib/stackmob/railtie.rb
|
210
|
+
- lib/stackmob/sinatra.rb
|
211
|
+
- lib/stackmob/tasks.rb
|
212
|
+
- stackmob.gemspec
|
213
|
+
- test/helper.rb
|
214
|
+
- test/integration/test_client.rb
|
215
|
+
- test/integration/test_data_store.rb
|
216
|
+
- test/integration/test_deployer.rb
|
217
|
+
- test/integration/test_push.rb
|
218
|
+
- test/integration_helper.rb
|
219
|
+
- test/unit/stackmob/rack/test_simple_oauth_provider.rb
|
220
|
+
- test/unit/stackmob/test_client.rb
|
221
|
+
- test/unit/stackmob/test_data_store.rb
|
222
|
+
- test/unit/stackmob/test_deployer.rb
|
223
|
+
- test/unit/stackmob/test_push.rb
|
224
|
+
homepage: http://github.com/stackmob/stackmob-ruby
|
225
|
+
licenses:
|
226
|
+
- MIT
|
227
|
+
post_install_message:
|
228
|
+
rdoc_options: []
|
229
|
+
|
230
|
+
require_paths:
|
231
|
+
- lib
|
232
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
233
|
+
none: false
|
234
|
+
requirements:
|
235
|
+
- - ">="
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
hash: 3
|
238
|
+
segments:
|
239
|
+
- 0
|
240
|
+
version: "0"
|
241
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
242
|
+
none: false
|
243
|
+
requirements:
|
244
|
+
- - ">="
|
245
|
+
- !ruby/object:Gem::Version
|
246
|
+
hash: 3
|
247
|
+
segments:
|
248
|
+
- 0
|
249
|
+
version: "0"
|
250
|
+
requirements: []
|
251
|
+
|
252
|
+
rubyforge_project:
|
253
|
+
rubygems_version: 1.8.6
|
254
|
+
signing_key:
|
255
|
+
specification_version: 3
|
256
|
+
summary: Support Gem for StackMob Heroku Add-On
|
257
|
+
test_files: []
|
258
|
+
|