stackmob 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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