stackmob 0.0.2 → 0.1.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/README.md CHANGED
@@ -17,7 +17,7 @@ Additionally, you will want to include some helpful methods in your controllers.
17
17
  ## Configuring Your Application (For Local Development)
18
18
 
19
19
  This section only pertains to setting up your Rails or Sinatra application for development & testing. If you wish solely to deploy to Heroku you can skip this section.
20
-
20
+
21
21
  For local development, a few configuration details need to be set in the file `config/stackmob.yml`. You will need your subdomain, the name of the application you created, as well as your public and private keys for both development (sandbox) and production from the StackMob add-on dashboard. When specifying your Heroku hostname, if your application is available under the herokuapp.com domain as well as heroku.com, use the herokuapp.com domain otherwise, use heroku.com.
22
22
 
23
23
  # example config/stackmob.yml
@@ -171,7 +171,7 @@ Deploying your Heroku application only requires one additional step. After you h
171
171
 
172
172
  This rake task will inform the StackMob servers that you have deployed a new version of your application as well as update any information that may be needed to proxy requests to your application.
173
173
 
174
- Once your API & Application are deployed, you can, of course, start using it with the [StackMob iOS SDK](https://github.com/stackmob/StackMob_iOS) but if you would like to take things for a test drive, you can also use `StackMob::Client`. Create a client to use your production keys like the example below:
174
+ Once your API & Application are deployed, you can, of course, start using it with the <a href="https://github.com/stackmob/StackMob_iOS">StackMob iOS SDK</a> but if you would like to take things for a test drive, you can also use `StackMob::Client`. Create a client to use your production keys like the example below:
175
175
 
176
176
  client = StackMob::Client.new(StackMob.dev_url, StackMob.app_name, StackMob::PRODUCTION, StackMob.config['production']['key'], StackMob.config['production']['secret'])
177
177
 
@@ -179,9 +179,6 @@ You can then proxy requests to your application using the `StackMob::Client#requ
179
179
 
180
180
  client.request(:get, :api, "heroku/proxy/path/to/proxy/to")
181
181
 
182
- ## Running your Application Locally in Development
183
-
184
-
185
182
 
186
183
  ## Contributing to stackmob gem
187
184
 
@@ -189,13 +186,13 @@ The stackmob Ruby Gem is Apache 2.0 licensed (see LICENSE.txt) and we look forwa
189
186
 
190
187
  ### Reporting Bugs
191
188
 
192
- We are using [GitHub Issues](https://github.com/stackmob/stackmob-ruby/issues) to track feature requests and bugs.
189
+ We are using <a href="https://github.com/stackmob/stackmob-ruby/issues">GitHub Issues</a> to track feature requests and bugs.
193
190
 
194
191
  ### Running the Tests
195
192
 
196
193
  Before submitting a pull request add any appropriate tests and run them along with the existing ones. The gem includes tasks to run unit & integration tests seperately or together. Before running the integration tests you will need to setup a few things. First, create a new application on your StackMob account named "test". In the new application, create a User Object named "user", with one extra string field, "name". Finally, you will have to set a few environment variables. If your using RVM, a good place to put these is your .rvmrc file.
197
194
 
198
- export STACKMOB_TEST_URL="YOURDOMAIN.stackmob.com"
195
+ export STACKMOB_TEST_URL="http://YOURDOMAIN.stackmob.com"
199
196
  export STACKMOB_TEST_KEY="YOUR TEST APP PUB KEY"
200
197
  export STACKMOB_TEST_SECRET="YOUR TEST APP PRIV KEY"
201
198
 
data/bin/stackmob ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'stackmob'
4
+
5
+ StackMob::CLI::Main.start(ARGV)
data/lib/stackmob.rb CHANGED
@@ -21,14 +21,31 @@ require 'stackmob/data_store'
21
21
  require 'stackmob/push'
22
22
  require 'stackmob/rack/simple_oauth_provider'
23
23
  require 'stackmob/helpers'
24
+ require 'stackmob/cli/main'
24
25
 
25
26
  module StackMob
26
27
 
28
+ CONFIG_FILES = ["config/stackmob.yml",".stackmob"]
29
+
30
+ class ConfigurationError < RuntimeError; end
31
+
32
+
27
33
  SANDBOX = 0
28
34
  PRODUCTION = 1
29
35
 
30
36
  def self.config
31
- @config ||= YAML.load_file("config/stackmob.yml")
37
+ @config ||= load_config(CONFIG_FILES.clone)
38
+
39
+ end
40
+
41
+ def self.load_config(filenames)
42
+ YAML.load_file(filenames.shift)
43
+ rescue Errno::ENOENT
44
+ if !filenames.empty?
45
+ load_config(filenames)
46
+ else
47
+ raise ConfigurationError.new("Missing configuration file (#{CONFIG_FILES.join(' or ')})")
48
+ end
32
49
  end
33
50
 
34
51
  def self.secret
@@ -47,8 +64,13 @@ module StackMob
47
64
  ENV['STACKMOB_CLIENT_NAME'] || StackMob.config['sm_client_name']
48
65
  end
49
66
 
50
- def self.dev_url
51
- "http://#{StackMob.client_name}.mob2.stackmob.com"
67
+ def self.dev_url
68
+ if env_url = ENV['STACKMOB_DEV_URL']
69
+ env_url
70
+ else
71
+ cluster_name = (is_html5?) ? "mob1" : "mob2"
72
+ "http://#{StackMob.client_name}.#{cluster_name}.stackmob.com"
73
+ end
52
74
  end
53
75
 
54
76
  def self.env
@@ -59,12 +81,16 @@ module StackMob
59
81
  env == PRODUCTION ? "production" : "development"
60
82
  end
61
83
 
84
+ def self.is_html5?
85
+ config['html5']
86
+ end
87
+
62
88
  def self.is_production?
63
89
  ENV["RACK_ENV"] == "production"
64
90
  end
65
91
 
66
92
  def self.sm_env_key_str(suffix)
67
- "STACKMOB_" + ((is_production?) ? "PROD" : "SAND") + "_#{suffix.upcase}"
93
+ "STACKMOB_" + ((is_production?) ? "PROD" : "SAND") + "_#{suffix.to_s.upcase}"
68
94
  end
69
95
 
70
96
 
@@ -0,0 +1,60 @@
1
+ # Copyright 2012 StackMob
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'rack'
16
+ require 'stackmob/middleware/rewrite'
17
+ require 'stackmob/middleware/proxy'
18
+
19
+ begin
20
+ require 'thin/version'
21
+
22
+ module Thin::VERSION
23
+ # Censoring
24
+ if CODENAME == "Bat-Shit Crazy"
25
+ remove_const :CODENAME
26
+ CODENAME = "Rockhead Slate"
27
+ end
28
+ end
29
+ rescue LoadError
30
+ end
31
+
32
+ module StackMob
33
+ module CLI
34
+ module LocalServer
35
+ DEFAULT_PORT = 4567
36
+
37
+ class Server < ::Rack::Server
38
+ def app
39
+ options[:app]
40
+ end
41
+ end
42
+
43
+ def start_local_server(port = DEFAULT_PORT, path_root = '.')
44
+ app = ::Rack::Builder.new do
45
+ use StackMob::Middleware::Proxy
46
+ use StackMob::Middleware::Rewrite
47
+
48
+ endpoint = ::Rack::Static.new lambda { |e| [] }, :urls => ['/'], :root => path_root
49
+ map "/" do
50
+ run endpoint
51
+ end
52
+ end.to_app
53
+ Server.start :app => app, :host => '0.0.0.0', :server => 'thin', :Port => port
54
+ end
55
+
56
+ end
57
+ end
58
+ end
59
+
60
+
@@ -0,0 +1,33 @@
1
+ # Copyright 2012 StackMob
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+
16
+ require 'thor'
17
+ require 'stackmob/cli/local_server'
18
+
19
+ module StackMob
20
+ module CLI
21
+ class Main < Thor
22
+ include LocalServer
23
+
24
+ method_option "port", :type => :string, :banner => "port to start server on", :aliases => "-p", :default => "4567"
25
+ method_option "path", :type => :string, :banner => "root directory to serve files from", :default => "."
26
+ desc "server", "start test server"
27
+ def server
28
+ start_local_server(options[:port], options[:path])
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -33,18 +33,28 @@ module StackMob
33
33
  create_oauth_client(oauth_key, oauth_secret, base_url)
34
34
  end
35
35
 
36
- def request(method, service, path, params = {})
37
- request_path, request_body = generate_path_and_body(method, service, path, params)
36
+ def request(method, service, path, params = {}, raw = false, headers = {})
37
+ request_path, request_body = generate_path_and_body(method, service, path, params, raw)
38
+
39
+ args = [method, request_path]
40
+ if [:post, :put].include?(method)
41
+ headers.merge!("Content-Type" => "application/json")
42
+ args << request_body << headers
43
+ else
44
+ args << headers
45
+ end
38
46
 
39
- args = [method, request_path, request_body]
40
- args << {"Content-Type" => "application/json"} if [:post, :put].include?(method)
41
47
  response = @oauth_client.send(*args)
42
48
 
43
- rcode = response.code.to_i
44
- if rcode >= 200 && rcode <= 299
45
- parse_response(response) if method != :delete
49
+ if raw
50
+ response
46
51
  else
47
- raise RequestError.new("\nReq Method: #{method}\nReq. Path: #{request_path}\nReq. Body: #{request_body}\nResp. Code: #{rcode}, Resp Body: #{response.respond_to?(:body) ? response.body : 'unknown'}")
52
+ rcode = response.code.to_i
53
+ if rcode >= 200 && rcode <= 299
54
+ parse_response(response) if method != :delete
55
+ else
56
+ raise RequestError.new("\nReq Method: #{method}\nReq. Path: #{request_path}\nReq. Body: #{request_body}\nResp. Code: #{rcode}, Resp Body: #{response.respond_to?(:body) ? response.body : 'unknown'}")
57
+ end
48
58
  end
49
59
  end
50
60
 
@@ -53,13 +63,13 @@ module StackMob
53
63
  end
54
64
  private :create_oauth_client
55
65
 
56
- def generate_path_and_body(method, service, path, params)
66
+ def generate_path_and_body(method, service, path, params, raw)
57
67
  intermediate_path = full_path(service, path)
58
68
  case method
59
69
  when :get, :delete
60
- [intermediate_path + "?" + params_to_qs(params), ""]
70
+ [intermediate_path + "?" + (raw ? params : params_to_qs(params)), ""]
61
71
  when :post, :put
62
- [intermediate_path, Yajl::Encoder.encode(params)]
72
+ [intermediate_path, raw ? params : Yajl::Encoder.encode(params)]
63
73
  else
64
74
  raise InvalidRequestMethod
65
75
  end
@@ -0,0 +1,68 @@
1
+ # Copyright 2012 StackMob
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'rack'
16
+
17
+ module StackMob
18
+ module Middleware
19
+ class Proxy
20
+
21
+ HEADER_NAME = 'X-StackMob-Proxy'
22
+ RACK_ENV_NAME = 'HTTP_X_STACKMOB_PROXY'
23
+ VALID_HEADER_VALUES = ['stackmob-api']
24
+
25
+ EXCLUDED_HEADERS = ["VERSION", "DATE", "HOST"].map { |s| "HTTP_#{s}" }
26
+
27
+ def initialize(app)
28
+ @app = app
29
+ end
30
+
31
+ def call(env)
32
+ if VALID_HEADER_VALUES.include?(env[RACK_ENV_NAME])
33
+ req = ::Rack::Request.new(env)
34
+ method = http_method(env)
35
+ headers = http_headers(env)
36
+ params = [:put,:post].include?(method) ? req.body : req.query_string
37
+
38
+ response = client.request(method, :api, env['PATH_INFO'], params, true, headers)
39
+
40
+ [response.code.to_i, response.to_hash, response.body]
41
+ else
42
+ @app.call(env)
43
+ end
44
+ end
45
+
46
+ def client
47
+ @client ||= StackMob::Client.new(StackMob.dev_url, StackMob.app_name, StackMob::SANDBOX, StackMob.key, StackMob.secret)
48
+ end
49
+ private :client
50
+
51
+ def http_method(env)
52
+ env['REQUEST_METHOD'].downcase.to_sym
53
+ end
54
+
55
+ def http_headers(env)
56
+ headers = {}
57
+ for headerArr in env.select { |k, v| k.start_with? 'HTTP_' }
58
+ if !EXCLUDED_HEADERS.include?(headerArr[0])
59
+ headers[headerArr[0].sub('HTTP_', '')] = headerArr[1]
60
+ end
61
+ end
62
+ headers["Accept"] = "application/json"
63
+ headers
64
+ end
65
+
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,50 @@
1
+ # Copyright 2012 StackMob
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module StackMob
16
+ module Middleware
17
+ class Rewrite
18
+ def initialize(app)
19
+ @app = app
20
+ end
21
+
22
+ def call(env)
23
+ status, hdrs, body = @app.call(env)
24
+ original_response = [status, hdrs, body]
25
+
26
+ if status == 404
27
+ path_info = env['PATH_INFO']
28
+ env['PATH_INFO'] = "#{path_info}/index.html".gsub('//', '/')
29
+
30
+
31
+ status, hdrs, body = @app.call(env)
32
+
33
+ if status == 404
34
+ env['PATH_INFO'] = "/404.html"
35
+
36
+ status, hdrs, body = @app.call(env)
37
+
38
+ if status == 404
39
+ status, hdrs, body = original_response
40
+ else
41
+ status = 404
42
+ end
43
+ end
44
+ end
45
+
46
+ [ status, hdrs, body ]
47
+ end
48
+ end
49
+ end
50
+ end
@@ -23,7 +23,7 @@ namespace :stackmob do
23
23
  abort("No Heroku App Name or Hostname Found in StackMob Config") if StackMob.config['heroku_app_name'].to_s.blank? && StackMob.config['heroku_hostname'].to_s.blank?
24
24
 
25
25
  hostname = StackMob.config['heroku_hostname'] || "#{StackMob.config['heroku_app_name']}.herokuapp.com"
26
- client = StackMob::Client.new("http://#{StackMob.client_name}.mob2.stackmob.com", StackMob.app_name, StackMob::SANDBOX, StackMob.config['development']['key'], StackMob.config['development']['key'])
26
+ client = StackMob::Client.new("http://#{StackMob.client_name}.mob2.stackmob.com", StackMob.app_name, StackMob::SANDBOX, StackMob.config['development']['key'], StackMob.config['development']['secret'])
27
27
  deployer = StackMob::Deployer.new(client)
28
28
 
29
29
  begin
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 2
10
- version: 0.0.2
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - StackMob
@@ -15,11 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-12 00:00:00 Z
18
+ date: 2012-02-15 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- type: :runtime
22
- requirement: &id001 !ruby/object:Gem::Requirement
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
23
22
  none: false
24
23
  requirements:
25
24
  - - ~>
@@ -30,12 +29,12 @@ dependencies:
30
29
  - 4
31
30
  - 5
32
31
  version: 0.4.5
33
- version_requirements: *id001
34
- name: oauth
35
32
  prerelease: false
36
- - !ruby/object:Gem::Dependency
33
+ requirement: *id001
37
34
  type: :runtime
38
- requirement: &id002 !ruby/object:Gem::Requirement
35
+ name: oauth
36
+ - !ruby/object:Gem::Dependency
37
+ version_requirements: &id002 !ruby/object:Gem::Requirement
39
38
  none: false
40
39
  requirements:
41
40
  - - ~>
@@ -46,26 +45,76 @@ dependencies:
46
45
  - 8
47
46
  - 2
48
47
  version: 0.8.2
49
- version_requirements: *id002
48
+ prerelease: false
49
+ requirement: *id002
50
+ type: :runtime
50
51
  name: yajl-ruby
52
+ - !ruby/object:Gem::Dependency
53
+ version_requirements: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ~>
57
+ - !ruby/object:Gem::Version
58
+ hash: 39
59
+ segments:
60
+ - 0
61
+ - 14
62
+ - 0
63
+ version: 0.14.0
51
64
  prerelease: false
65
+ requirement: *id003
66
+ type: :runtime
67
+ name: thor
52
68
  - !ruby/object:Gem::Dependency
53
- type: :development
54
- requirement: &id003 !ruby/object:Gem::Requirement
69
+ version_requirements: &id004 !ruby/object:Gem::Requirement
55
70
  none: false
56
71
  requirements:
57
- - - ">="
72
+ - - ~>
58
73
  - !ruby/object:Gem::Version
59
- hash: 3
74
+ hash: 31
60
75
  segments:
76
+ - 1
77
+ - 2
61
78
  - 0
62
- version: "0"
63
- version_requirements: *id003
64
- name: minitest
79
+ version: 1.2.0
65
80
  prerelease: false
81
+ requirement: *id004
82
+ type: :runtime
83
+ name: thin
66
84
  - !ruby/object:Gem::Dependency
85
+ version_requirements: &id005 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ~>
89
+ - !ruby/object:Gem::Version
90
+ hash: 27
91
+ segments:
92
+ - 1
93
+ - 3
94
+ - 0
95
+ version: 1.3.0
96
+ prerelease: false
97
+ requirement: *id005
98
+ type: :runtime
99
+ name: rack
100
+ - !ruby/object:Gem::Dependency
101
+ version_requirements: &id006 !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ~>
105
+ - !ruby/object:Gem::Version
106
+ hash: 35
107
+ segments:
108
+ - 2
109
+ - 11
110
+ - 0
111
+ version: 2.11.0
112
+ prerelease: false
113
+ requirement: *id006
67
114
  type: :development
68
- requirement: &id004 !ruby/object:Gem::Requirement
115
+ name: minitest
116
+ - !ruby/object:Gem::Dependency
117
+ version_requirements: &id007 !ruby/object:Gem::Requirement
69
118
  none: false
70
119
  requirements:
71
120
  - - ~>
@@ -76,12 +125,12 @@ dependencies:
76
125
  - 6
77
126
  - 0
78
127
  version: 0.6.0
79
- version_requirements: *id004
80
- name: yard
81
128
  prerelease: false
82
- - !ruby/object:Gem::Dependency
129
+ requirement: *id007
83
130
  type: :development
84
- requirement: &id005 !ruby/object:Gem::Requirement
131
+ name: yard
132
+ - !ruby/object:Gem::Dependency
133
+ version_requirements: &id008 !ruby/object:Gem::Requirement
85
134
  none: false
86
135
  requirements:
87
136
  - - ">="
@@ -90,12 +139,12 @@ dependencies:
90
139
  segments:
91
140
  - 0
92
141
  version: "0"
93
- version_requirements: *id005
94
- name: cucumber
95
142
  prerelease: false
96
- - !ruby/object:Gem::Dependency
143
+ requirement: *id008
97
144
  type: :development
98
- requirement: &id006 !ruby/object:Gem::Requirement
145
+ name: cucumber
146
+ - !ruby/object:Gem::Dependency
147
+ version_requirements: &id009 !ruby/object:Gem::Requirement
99
148
  none: false
100
149
  requirements:
101
150
  - - ~>
@@ -106,12 +155,12 @@ dependencies:
106
155
  - 0
107
156
  - 0
108
157
  version: 1.0.0
109
- version_requirements: *id006
110
- name: bundler
111
158
  prerelease: false
112
- - !ruby/object:Gem::Dependency
159
+ requirement: *id009
113
160
  type: :development
114
- requirement: &id007 !ruby/object:Gem::Requirement
161
+ name: bundler
162
+ - !ruby/object:Gem::Dependency
163
+ version_requirements: &id010 !ruby/object:Gem::Requirement
115
164
  none: false
116
165
  requirements:
117
166
  - - ~>
@@ -122,12 +171,12 @@ dependencies:
122
171
  - 6
123
172
  - 4
124
173
  version: 1.6.4
125
- version_requirements: *id007
126
- name: jeweler
127
174
  prerelease: false
128
- - !ruby/object:Gem::Dependency
175
+ requirement: *id010
129
176
  type: :development
130
- requirement: &id008 !ruby/object:Gem::Requirement
177
+ name: jeweler
178
+ - !ruby/object:Gem::Dependency
179
+ version_requirements: &id011 !ruby/object:Gem::Requirement
131
180
  none: false
132
181
  requirements:
133
182
  - - ">="
@@ -136,12 +185,12 @@ dependencies:
136
185
  segments:
137
186
  - 0
138
187
  version: "0"
139
- version_requirements: *id008
140
- name: rcov
141
188
  prerelease: false
142
- - !ruby/object:Gem::Dependency
189
+ requirement: *id011
143
190
  type: :development
144
- requirement: &id009 !ruby/object:Gem::Requirement
191
+ name: rcov
192
+ - !ruby/object:Gem::Dependency
193
+ version_requirements: &id012 !ruby/object:Gem::Requirement
145
194
  none: false
146
195
  requirements:
147
196
  - - ">="
@@ -150,12 +199,12 @@ dependencies:
150
199
  segments:
151
200
  - 0
152
201
  version: "0"
153
- version_requirements: *id009
154
- name: mocha
155
202
  prerelease: false
156
- - !ruby/object:Gem::Dependency
203
+ requirement: *id012
157
204
  type: :development
158
- requirement: &id010 !ruby/object:Gem::Requirement
205
+ name: mocha
206
+ - !ruby/object:Gem::Dependency
207
+ version_requirements: &id013 !ruby/object:Gem::Requirement
159
208
  none: false
160
209
  requirements:
161
210
  - - ">="
@@ -164,12 +213,12 @@ dependencies:
164
213
  segments:
165
214
  - 0
166
215
  version: "0"
167
- version_requirements: *id010
168
- name: rack-test
169
216
  prerelease: false
170
- - !ruby/object:Gem::Dependency
217
+ requirement: *id013
171
218
  type: :development
172
- requirement: &id011 !ruby/object:Gem::Requirement
219
+ name: rack-test
220
+ - !ruby/object:Gem::Dependency
221
+ version_requirements: &id014 !ruby/object:Gem::Requirement
173
222
  none: false
174
223
  requirements:
175
224
  - - ">="
@@ -178,50 +227,54 @@ dependencies:
178
227
  segments:
179
228
  - 0
180
229
  version: "0"
181
- version_requirements: *id011
230
+ prerelease: false
231
+ requirement: *id014
232
+ type: :development
182
233
  name: bluecloth
234
+ - !ruby/object:Gem::Dependency
235
+ version_requirements: &id015 !ruby/object:Gem::Requirement
236
+ none: false
237
+ requirements:
238
+ - - ~>
239
+ - !ruby/object:Gem::Version
240
+ hash: 15
241
+ segments:
242
+ - 2
243
+ - 2
244
+ - 4
245
+ version: 2.2.4
183
246
  prerelease: false
247
+ requirement: *id015
248
+ type: :development
249
+ name: httpclient
184
250
  description: Support Gem for StackMob Heroku Add-On
185
251
  email: jordan@stackmob.com
186
- executables: []
187
-
252
+ executables:
253
+ - stackmob
188
254
  extensions: []
189
255
 
190
256
  extra_rdoc_files:
191
257
  - LICENSE.txt
192
258
  - README.md
193
259
  files:
194
- - .document
195
- - Gemfile
196
- - Gemfile.lock
197
260
  - LICENSE.txt
198
261
  - README.md
199
- - Rakefile
200
- - VERSION
201
262
  - lib/stackmob.rb
263
+ - lib/stackmob/cli/local_server.rb
264
+ - lib/stackmob/cli/main.rb
202
265
  - lib/stackmob/client.rb
203
266
  - lib/stackmob/data_store.rb
204
267
  - lib/stackmob/deployer.rb
205
268
  - lib/stackmob/helpers.rb
269
+ - lib/stackmob/middleware/proxy.rb
270
+ - lib/stackmob/middleware/rewrite.rb
206
271
  - lib/stackmob/push.rb
207
272
  - lib/stackmob/rack/simple_oauth_provider.rb
208
273
  - lib/stackmob/rails.rb
209
274
  - lib/stackmob/railtie.rb
210
275
  - lib/stackmob/sinatra.rb
211
276
  - 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
- - test/unit/test_stackmob.rb
277
+ - bin/stackmob
225
278
  homepage: http://github.com/stackmob/stackmob-ruby
226
279
  licenses:
227
280
  - MIT
@@ -251,7 +304,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
251
304
  requirements: []
252
305
 
253
306
  rubyforge_project:
254
- rubygems_version: 1.8.6
307
+ rubygems_version: 1.8.15
255
308
  signing_key:
256
309
  specification_version: 3
257
310
  summary: Support Gem for StackMob Heroku Add-On