tddium-preview 0.0.4 → 0.0.5
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/Gemfile.lock +3 -3
- data/lib/tddium.rb +121 -131
- data/lib/tddium/version.rb +1 -1
- data/spec/tddium_spec.rb +130 -90
- data/tddium.gemspec +3 -3
- metadata +10 -21
data/Gemfile.lock
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
tddium-preview (0.0.
|
4
|
+
tddium-preview (0.0.5)
|
5
5
|
highline
|
6
6
|
json
|
7
|
-
tddium_client (
|
7
|
+
tddium_client (>= 0.0.6)
|
8
8
|
thor
|
9
9
|
|
10
10
|
GEM
|
@@ -29,7 +29,7 @@ GEM
|
|
29
29
|
simplecov (0.4.1)
|
30
30
|
simplecov-html (~> 0.4.3)
|
31
31
|
simplecov-html (0.4.3)
|
32
|
-
tddium_client (0.0.
|
32
|
+
tddium_client (0.0.6)
|
33
33
|
httparty
|
34
34
|
json
|
35
35
|
thor (0.14.6)
|
data/lib/tddium.rb
CHANGED
@@ -37,10 +37,9 @@ class Tddium < Thor
|
|
37
37
|
method_option :ssh_key_file, :type => :string, :default => nil
|
38
38
|
def account
|
39
39
|
set_default_environment(options[:environment])
|
40
|
-
if user_logged_in?
|
41
|
-
|
42
|
-
|
43
|
-
end
|
40
|
+
if user_details = user_logged_in?
|
41
|
+
# User is already logged in, so just display the info
|
42
|
+
show_user_details(user_details)
|
44
43
|
else
|
45
44
|
params = get_user_credentials(options.merge(:invited => true))
|
46
45
|
|
@@ -65,11 +64,15 @@ class Tddium < Thor
|
|
65
64
|
license_accepted = ask(Text::Prompt::LICENSE_AGREEMENT)
|
66
65
|
return unless license_accepted.downcase == Text::Prompt::Response::AGREE_TO_LICENSE.downcase
|
67
66
|
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
begin
|
68
|
+
new_user = call_api(:post, Api::Path::USERS, {:user => params}, false, false)
|
69
|
+
write_api_key(new_user["user"]["api_key"])
|
70
|
+
say Text::Process::ACCOUNT_CREATED % [new_user["user"]["email"], new_user["user"]["recurly_url"]]
|
71
|
+
rescue TddiumClient::Error::API => e
|
72
|
+
say((e.status == Api::ErrorCode::INVALID_INVITATION) ? Text::Error::INVALID_INVITATION : e.message)
|
73
|
+
rescue TddiumClient::Error::Base => e
|
74
|
+
say e.message
|
71
75
|
end
|
72
|
-
say((api_result.api_status == Api::ErrorCode::INVALID_INVITATION) ? Text::Error::INVALID_INVITATION : api_result.message) unless api_result.success?
|
73
76
|
end
|
74
77
|
end
|
75
78
|
|
@@ -82,9 +85,7 @@ class Tddium < Thor
|
|
82
85
|
if user_logged_in?
|
83
86
|
say Text::Process::ALREADY_LOGGED_IN
|
84
87
|
else
|
85
|
-
login_user(:params => get_user_credentials(options), :show_error => true)
|
86
|
-
say Text::Process::LOGGED_IN_SUCCESSFULLY
|
87
|
-
end
|
88
|
+
say Text::Process::LOGGED_IN_SUCCESSFULLY if login_user(:params => get_user_credentials(options), :show_error => true)
|
88
89
|
end
|
89
90
|
end
|
90
91
|
|
@@ -108,72 +109,63 @@ class Tddium < Thor
|
|
108
109
|
return unless git_push
|
109
110
|
|
110
111
|
# Call the API to get the suite and its tests
|
111
|
-
|
112
|
-
|
112
|
+
begin
|
113
|
+
suite_details = call_api(:get, current_suite_path)
|
114
|
+
test_pattern = suite_details["suite"]["test_pattern"]
|
113
115
|
test_files = Dir.glob(test_pattern).collect {|file_path| {:test_name => file_path}}
|
114
116
|
|
115
117
|
# Create a session
|
116
|
-
call_api(:post, Api::Path::SESSIONS)
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
# Print out the progress of running tests
|
142
|
-
api_response["tests"].each do |test_name, result_params|
|
143
|
-
test_status = result_params["status"]
|
144
|
-
if result_params["end_time"] && !finished_tests[test_name]
|
145
|
-
message = case test_status
|
146
|
-
when "passed" then [".", :green, false]
|
147
|
-
when "failed" then ["F", :red, false]
|
148
|
-
when "error" then ["E", nil, false]
|
149
|
-
when "pending" then ["*", :yellow, false]
|
150
|
-
end
|
151
|
-
finished_tests[test_name] = test_status
|
152
|
-
test_statuses[test_status] += 1
|
153
|
-
say *message
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
# save response for later use
|
158
|
-
get_test_executions_response = api_response
|
159
|
-
|
160
|
-
# If all tests finished, exit the loop else sleep
|
161
|
-
if finished_tests.size == api_response["tests"].size
|
162
|
-
tests_not_finished_yet = false
|
163
|
-
else
|
164
|
-
sleep(Default::SLEEP_TIME_BETWEEN_POLLS)
|
165
|
-
end
|
166
|
-
end
|
167
|
-
api_call_successful = call_api_result.success?
|
168
|
-
end
|
118
|
+
new_session = call_api(:post, Api::Path::SESSIONS)
|
119
|
+
session_id = new_session["session"]["id"]
|
120
|
+
|
121
|
+
# Register the tests
|
122
|
+
call_api(:post, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::REGISTER_TEST_EXECUTIONS}", {:suite_id => current_suite_id, :tests => test_files})
|
123
|
+
|
124
|
+
# Start the tests
|
125
|
+
start_test_executions = call_api(:post, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::START_TEST_EXECUTIONS}")
|
126
|
+
tests_not_finished_yet = true
|
127
|
+
finished_tests = {}
|
128
|
+
test_statuses = Hash.new(0)
|
129
|
+
|
130
|
+
say Text::Process::STARTING_TEST % test_files.size
|
131
|
+
say Text::Process::CHECK_TEST_REPORT % start_test_executions["report"]
|
132
|
+
say Text::Process::TERMINATE_INSTRUCTION
|
133
|
+
while tests_not_finished_yet do
|
134
|
+
# Poll the API to check the status
|
135
|
+
current_test_executions = call_api(:get, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::TEST_EXECUTIONS}")
|
136
|
+
|
137
|
+
# Catch Ctrl-C to interrupt the test
|
138
|
+
Signal.trap(:INT) do
|
139
|
+
say Text::Process::INTERRUPT
|
140
|
+
say Text::Process::CHECK_TEST_STATUS
|
141
|
+
tests_not_finished_yet = false
|
142
|
+
end
|
169
143
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
144
|
+
# Print out the progress of running tests
|
145
|
+
current_test_executions["tests"].each do |test_name, result_params|
|
146
|
+
test_status = result_params["status"]
|
147
|
+
if result_params["end_time"] && !finished_tests[test_name]
|
148
|
+
message = case test_status
|
149
|
+
when "passed" then [".", :green, false]
|
150
|
+
when "failed" then ["F", :red, false]
|
151
|
+
when "error" then ["E", nil, false]
|
152
|
+
when "pending" then ["*", :yellow, false]
|
153
|
+
end
|
154
|
+
finished_tests[test_name] = test_status
|
155
|
+
test_statuses[test_status] += 1
|
156
|
+
say *message
|
174
157
|
end
|
175
158
|
end
|
159
|
+
|
160
|
+
# If all tests finished, exit the loop else sleep
|
161
|
+
finished_tests.size == current_test_executions["tests"].size ? tests_not_finished_yet = false : sleep(Default::SLEEP_TIME_BETWEEN_POLLS)
|
176
162
|
end
|
163
|
+
|
164
|
+
# Print out the result
|
165
|
+
say " "
|
166
|
+
say Text::Process::FINISHED_TEST % (Time.now - start_time)
|
167
|
+
say "#{finished_tests.size} examples, #{test_statuses["failed"]} failures, #{test_statuses["error"]} errors, #{test_statuses["pending"]} pending"
|
168
|
+
rescue TddiumClient::Error::Base
|
177
169
|
end
|
178
170
|
end
|
179
171
|
|
@@ -183,13 +175,14 @@ class Tddium < Thor
|
|
183
175
|
set_default_environment(options[:environment])
|
184
176
|
return unless git_repo? && tddium_settings && suite_for_current_branch?
|
185
177
|
|
186
|
-
|
187
|
-
|
178
|
+
begin
|
179
|
+
current_suites = call_api(:get, Api::Path::SUITES)
|
180
|
+
if current_suites["suites"].size == 0
|
188
181
|
say Text::Status::NO_SUITE
|
189
182
|
else
|
190
|
-
say Text::Status::ALL_SUITES %
|
183
|
+
say Text::Status::ALL_SUITES % current_suites["suites"].collect {|suite| suite["repo_name"]}.join(", ")
|
191
184
|
|
192
|
-
if current_suite =
|
185
|
+
if current_suite = current_suites["suites"].detect {|suite| suite["id"] == current_suite_id}
|
193
186
|
say Text::Status::SEPARATOR
|
194
187
|
say Text::Status::CURRENT_SUITE % current_suite["repo_name"]
|
195
188
|
|
@@ -201,6 +194,7 @@ class Tddium < Thor
|
|
201
194
|
say Text::Status::CURRENT_SUITE_UNAVAILABLE
|
202
195
|
end
|
203
196
|
end
|
197
|
+
rescue TddiumClient::Error::Base
|
204
198
|
end
|
205
199
|
end
|
206
200
|
|
@@ -213,29 +207,27 @@ class Tddium < Thor
|
|
213
207
|
return unless git_repo? && tddium_settings
|
214
208
|
|
215
209
|
params = {}
|
216
|
-
|
217
|
-
|
210
|
+
begin
|
211
|
+
if current_suite_id
|
212
|
+
current_suite = call_api(:get, current_suite_path)
|
218
213
|
# Get the current test pattern and prompt for updates
|
219
|
-
params[:test_pattern] = prompt(Text::Prompt::TEST_PATTERN, options[:test_pattern],
|
214
|
+
params[:test_pattern] = prompt(Text::Prompt::TEST_PATTERN, options[:test_pattern], current_suite["suite"]["test_pattern"])
|
220
215
|
|
221
216
|
# Update the current suite if it exists already
|
222
|
-
call_api(:put, current_suite_path, {:suite => params})
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
# Check to see if there is an existing suite
|
237
|
-
api_call_successful = call_api(:get, Api::Path::SUITES, params) do |api_response|
|
238
|
-
existing_suite = api_response["suites"].first
|
217
|
+
call_api(:put, current_suite_path, {:suite => params})
|
218
|
+
say Text::Process::UPDATE_SUITE
|
219
|
+
else
|
220
|
+
params[:branch] = current_git_branch
|
221
|
+
default_suite_name = File.basename(Dir.pwd)
|
222
|
+
params[:repo_name] = options[:name] || default_suite_name
|
223
|
+
|
224
|
+
existing_suite = nil
|
225
|
+
use_existing_suite = false
|
226
|
+
suite_name_resolved = false
|
227
|
+
while !suite_name_resolved
|
228
|
+
# Check to see if there is an existing suite
|
229
|
+
current_suites = call_api(:get, Api::Path::SUITES, params)
|
230
|
+
existing_suite = current_suites["suites"].first
|
239
231
|
|
240
232
|
# Get the suite name
|
241
233
|
current_suite_name = params[:repo_name]
|
@@ -256,10 +248,8 @@ class Tddium < Thor
|
|
256
248
|
# Suite name does not exist yet and already prompted
|
257
249
|
suite_name_resolved = true
|
258
250
|
end
|
259
|
-
end
|
260
|
-
end
|
251
|
+
end
|
261
252
|
|
262
|
-
if api_call_successful
|
263
253
|
if use_existing_suite
|
264
254
|
# Write to file and exit when using the existing suite
|
265
255
|
write_suite(existing_suite["id"])
|
@@ -274,31 +264,30 @@ class Tddium < Thor
|
|
274
264
|
params[:test_pattern] = prompt(Text::Prompt::TEST_PATTERN, options[:test_pattern], Default::TEST_PATTERN)
|
275
265
|
|
276
266
|
# Create new suite if it does not exist yet
|
277
|
-
call_api(:post, Api::Path::SUITES, {:suite => params})
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
end
|
267
|
+
new_suite = call_api(:post, Api::Path::SUITES, {:suite => params})
|
268
|
+
# Save the created suite
|
269
|
+
write_suite(new_suite["suite"]["id"])
|
270
|
+
|
271
|
+
# Manage git
|
272
|
+
`git remote rm #{Git::REMOTE_NAME}`
|
273
|
+
`git remote add #{Git::REMOTE_NAME} #{new_suite["suite"]["git_repo_uri"]}`
|
274
|
+
git_push
|
286
275
|
end
|
276
|
+
rescue TddiumClient::Error::Base
|
287
277
|
end
|
288
278
|
end
|
289
279
|
|
290
280
|
private
|
291
281
|
|
292
|
-
def call_api(method, api_path, params = {}, api_key = nil, show_error = true
|
282
|
+
def call_api(method, api_path, params = {}, api_key = nil, show_error = true)
|
293
283
|
api_key = tddium_settings(:fail_with_message => false)["api_key"] if tddium_settings(:fail_with_message => false) && api_key != false
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
end
|
284
|
+
begin
|
285
|
+
result = tddium_client.call_api(method, api_path, params, api_key)
|
286
|
+
rescue TddiumClient::Error::Base => e
|
287
|
+
say e.message if show_error
|
288
|
+
raise e
|
300
289
|
end
|
301
|
-
|
290
|
+
result
|
302
291
|
end
|
303
292
|
|
304
293
|
def current_git_branch
|
@@ -324,11 +313,11 @@ class Tddium < Thor
|
|
324
313
|
end
|
325
314
|
|
326
315
|
def environment
|
327
|
-
tddium_client.environment
|
316
|
+
tddium_client.environment.to_sym
|
328
317
|
end
|
329
318
|
|
330
|
-
def get_user
|
331
|
-
call_api(:get, Api::Path::USERS, {}, nil, false
|
319
|
+
def get_user
|
320
|
+
call_api(:get, Api::Path::USERS, {}, nil, false) rescue nil
|
332
321
|
end
|
333
322
|
|
334
323
|
def get_user_credentials(options = {})
|
@@ -355,12 +344,13 @@ class Tddium < Thor
|
|
355
344
|
message.nil?
|
356
345
|
end
|
357
346
|
|
358
|
-
def login_user(options = {}
|
347
|
+
def login_user(options = {})
|
359
348
|
# POST (email, password) to /users/sign_in to retrieve an API key
|
360
|
-
|
349
|
+
begin
|
350
|
+
login_result = call_api(:post, Api::Path::SIGN_IN, {:user => options[:params]}, false, options[:show_error])
|
361
351
|
# On success, write the API key to "~/.tddium.<environment>"
|
362
|
-
write_api_key(
|
363
|
-
|
352
|
+
write_api_key(login_result["api_key"])
|
353
|
+
rescue TddiumClient::Error::Base
|
364
354
|
end
|
365
355
|
login_result
|
366
356
|
end
|
@@ -380,20 +370,21 @@ class Tddium < Thor
|
|
380
370
|
end
|
381
371
|
|
382
372
|
def show_session_details(params, no_session_prompt, all_session_prompt)
|
383
|
-
|
373
|
+
begin
|
374
|
+
current_sessions = call_api(:get, Api::Path::SESSIONS, params)
|
384
375
|
say Text::Status::SEPARATOR
|
385
|
-
if
|
376
|
+
if current_sessions["sessions"].size == 0
|
386
377
|
say no_session_prompt
|
387
378
|
else
|
388
379
|
say all_session_prompt
|
389
|
-
|
380
|
+
current_sessions["sessions"].each do |session|
|
390
381
|
session_id = session["id"]
|
391
382
|
say Text::Status::SESSION_TITLE % session_id
|
392
|
-
call_api(:get, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::TEST_EXECUTIONS}")
|
393
|
-
|
394
|
-
end
|
383
|
+
current_test_executions = call_api(:get, "#{Api::Path::SESSIONS}/#{session_id}/#{Api::Path::TEST_EXECUTIONS}")
|
384
|
+
display_attributes(DisplayedAttributes::TEST_EXECUTION, current_test_executions)
|
395
385
|
end
|
396
386
|
end
|
387
|
+
rescue TddiumClient::Error::Base
|
397
388
|
end
|
398
389
|
end
|
399
390
|
|
@@ -415,7 +406,7 @@ class Tddium < Thor
|
|
415
406
|
end
|
416
407
|
|
417
408
|
def tddium_client
|
418
|
-
@tddium_client ||= TddiumClient.new
|
409
|
+
@tddium_client ||= TddiumClient::Client.new
|
419
410
|
end
|
420
411
|
|
421
412
|
def tddium_file_name
|
@@ -439,9 +430,9 @@ class Tddium < Thor
|
|
439
430
|
@tddium_settings
|
440
431
|
end
|
441
432
|
|
442
|
-
def user_logged_in?(active = true
|
433
|
+
def user_logged_in?(active = true)
|
443
434
|
result = tddium_settings(:fail_with_message => false) && tddium_settings["api_key"]
|
444
|
-
(result && active) ? get_user
|
435
|
+
(result && active) ? get_user : result
|
445
436
|
end
|
446
437
|
|
447
438
|
def write_api_key(api_key)
|
@@ -458,5 +449,4 @@ class Tddium < Thor
|
|
458
449
|
file.write(tddium_settings.merge({"branches" => branches}).to_json)
|
459
450
|
end
|
460
451
|
end
|
461
|
-
|
462
452
|
end
|
data/lib/tddium/version.rb
CHANGED
data/spec/tddium_spec.rb
CHANGED
@@ -13,8 +13,6 @@ describe Tddium do
|
|
13
13
|
SAMPLE_APP_NAME = "tddelicious"
|
14
14
|
SAMPLE_BRANCH_NAME = "test"
|
15
15
|
SAMPLE_BUNDLER_VERSION = "1.10.10"
|
16
|
-
SAMPLE_CALL_API_RESPONSE = [0, 200, nil]
|
17
|
-
SAMPLE_CALL_API_ERROR = [1, 501, "an error"]
|
18
16
|
SAMPLE_DATE_TIME = "2011-03-11T08:43:02Z"
|
19
17
|
SAMPLE_EMAIL = "someone@example.com"
|
20
18
|
SAMPLE_INVITATION_TOKEN = "TZce3NueiXp2lMTmaeRr"
|
@@ -29,13 +27,14 @@ describe Tddium do
|
|
29
27
|
SAMPLE_SUITE_ID = 1
|
30
28
|
SAMPLE_SUITES_RESPONSE = {"suites" => [{"repo_name" => SAMPLE_APP_NAME, "branch" => SAMPLE_BRANCH_NAME, "id" => SAMPLE_SUITE_ID}]}
|
31
29
|
SAMPLE_TDDIUM_CONFIG_FILE = ".tddium.test"
|
30
|
+
SAMPLE_TEST_EXECUTION_STATS = "total 1, notstarted 0, started 1, passed 0, failed 0, pending 0, error 0", "start_time"
|
32
31
|
SAMPLE_TEST_PATTERN = "**/*_spec.rb"
|
33
32
|
SAMPLE_USER_RESPONSE = {"user"=> {"api_key" => SAMPLE_API_KEY, "email" => SAMPLE_EMAIL, "created_at" => SAMPLE_DATE_TIME, "recurly_url" => SAMPLE_RECURLY_URL}}
|
34
33
|
|
35
34
|
def call_api_should_receive(options = {})
|
36
35
|
params = [options[:method] || anything, options[:path] || anything, options[:params] || anything, (options[:api_key] || options[:api_key] == false) ? options[:api_key] : anything]
|
37
|
-
tddium_client.stub(:call_api).with(*params)
|
38
|
-
tddium_client.should_receive(:call_api).with(*params)
|
36
|
+
tddium_client.stub(:call_api).with(*params).and_raise(TddiumClient::Error::Base)
|
37
|
+
tddium_client.should_receive(:call_api).with(*params)
|
39
38
|
end
|
40
39
|
|
41
40
|
def extract_options!(array, *option_keys)
|
@@ -64,14 +63,24 @@ describe Tddium do
|
|
64
63
|
end
|
65
64
|
|
66
65
|
def stub_call_api_response(method, path, *response)
|
67
|
-
options = extract_options!(response, :and_return, :and_yield)
|
68
|
-
options[:and_yield] = true unless options[:and_yield] == false
|
69
66
|
result = tddium_client.stub(:call_api).with(method, path, anything, anything)
|
70
|
-
|
71
|
-
|
72
|
-
response.
|
73
|
-
|
67
|
+
response = [{}] if response.empty?
|
68
|
+
response_mocks = []
|
69
|
+
response.each do |current_response|
|
70
|
+
current_response["status"] ||= 0
|
71
|
+
status = current_response["status"]
|
72
|
+
if status == 0
|
73
|
+
tddium_client_result = mock(TddiumClient::Result::API)
|
74
|
+
response_mocks << tddium_client_result
|
75
|
+
else
|
76
|
+
tddium_client_result = mock(TddiumClient::Error::API, :body => current_response.to_json)
|
77
|
+
result.and_raise(TddiumClient::Error::API.new(tddium_client_result))
|
78
|
+
end
|
79
|
+
current_response.each do |k, v|
|
80
|
+
tddium_client_result.stub(:[]).with(k).and_return(v)
|
81
|
+
end
|
74
82
|
end
|
83
|
+
result.and_return(*response_mocks) unless response_mocks.empty?
|
75
84
|
end
|
76
85
|
|
77
86
|
def stub_cli_options(tddium, options = {})
|
@@ -118,15 +127,14 @@ describe Tddium do
|
|
118
127
|
end
|
119
128
|
|
120
129
|
def stub_tddium_client
|
121
|
-
TddiumClient.stub(:new).and_return(tddium_client)
|
122
|
-
tddium_client.stub(:environment).and_return(
|
123
|
-
tddium_client.stub(:call_api).
|
130
|
+
TddiumClient::Client.stub(:new).and_return(tddium_client)
|
131
|
+
tddium_client.stub(:environment).and_return("test")
|
132
|
+
tddium_client.stub(:call_api).and_raise(TddiumClient::Error::Base)
|
124
133
|
end
|
125
134
|
|
126
135
|
let(:tddium) { Tddium.new }
|
127
136
|
let(:tddium_client) { mock(TddiumClient).as_null_object }
|
128
137
|
|
129
|
-
|
130
138
|
shared_examples_for "a password prompt" do
|
131
139
|
context "--password was not passed in" do
|
132
140
|
it "should prompt for a password or confirmation" do
|
@@ -146,8 +154,8 @@ describe Tddium do
|
|
146
154
|
|
147
155
|
shared_examples_for "an unsuccessful api call" do
|
148
156
|
it "should show the error" do
|
149
|
-
tddium_client.stub(:call_api).
|
150
|
-
tddium.should_receive(:say).with(
|
157
|
+
tddium_client.stub(:call_api).and_raise(TddiumClient::Error::Base)
|
158
|
+
tddium.should_receive(:say).with(TddiumClient::Error::Base.new.message)
|
151
159
|
run(tddium)
|
152
160
|
end
|
153
161
|
end
|
@@ -172,49 +180,6 @@ describe Tddium do
|
|
172
180
|
end
|
173
181
|
end
|
174
182
|
|
175
|
-
shared_examples_for "logging in a user" do
|
176
|
-
context "there is a tddium config file with an api key" do
|
177
|
-
before {stub_config_file(:api_key => "some api key")}
|
178
|
-
|
179
|
-
it "should send a 'GET' request to '#{Tddium::Api::Path::USERS}'" do
|
180
|
-
call_api_should_receive(:method => :get, :path => /#{Tddium::Api::Path::USERS}$/)
|
181
|
-
run(tddium)
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
context "the tddium config file is missing or corrupt or the api key is invalid" do
|
186
|
-
context "--email was not passed in" do
|
187
|
-
it "should prompt for the user's email address" do
|
188
|
-
tddium.should_receive(:ask).with(Tddium::Text::Prompt::EMAIL)
|
189
|
-
run(tddium)
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
context "--email was passed in" do
|
194
|
-
it "should not prompt for the user's email address" do
|
195
|
-
tddium.should_not_receive(:ask).with(Tddium::Text::Prompt::EMAIL)
|
196
|
-
run(tddium, :email => SAMPLE_EMAIL)
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
it_should_behave_like "a password prompt" do
|
201
|
-
let(:password_prompt) {Tddium::Text::Prompt::PASSWORD}
|
202
|
-
end
|
203
|
-
|
204
|
-
it "should try to sign in the user with their email & password" do
|
205
|
-
tddium.stub(:ask).with(Tddium::Text::Prompt::EMAIL).and_return(SAMPLE_EMAIL)
|
206
|
-
HighLine.stub(:ask).with(Tddium::Text::Prompt::PASSWORD).and_return(SAMPLE_PASSWORD)
|
207
|
-
call_api_should_receive(:method => :post, :path => /#{Tddium::Api::Path::SIGN_IN}$/, :params => {:user => {:email => SAMPLE_EMAIL, :password => SAMPLE_PASSWORD}}, :api_key => false)
|
208
|
-
run(tddium)
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
context "the user logs in successfully with their email and password" do
|
213
|
-
before{stub_call_api_response(:post, Tddium::Api::Path::SIGN_IN, {"api_key" => SAMPLE_API_KEY})}
|
214
|
-
it_should_behave_like "writing the api key to the .tddium file"
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
183
|
shared_examples_for "sending the api key" do
|
219
184
|
it "should call the api with the api key" do
|
220
185
|
call_api_should_receive(:api_key => SAMPLE_API_KEY)
|
@@ -288,14 +253,37 @@ describe Tddium do
|
|
288
253
|
end
|
289
254
|
end
|
290
255
|
|
291
|
-
shared_examples_for "
|
292
|
-
it "should write the api key to the .tddium file" do
|
256
|
+
shared_examples_for "with the correct environment extension" do
|
257
|
+
it "should write the api key to the .tddium file with the relevent environment extension" do
|
293
258
|
run(tddium)
|
294
|
-
tddium_file = File.open(
|
259
|
+
tddium_file = File.open(".tddium#{environment_extension}") { |file| file.read }
|
295
260
|
JSON.parse(tddium_file)["api_key"].should == SAMPLE_API_KEY
|
296
261
|
end
|
297
262
|
end
|
298
263
|
|
264
|
+
shared_examples_for "writing the api key to the .tddium file" do
|
265
|
+
context "production environment" do
|
266
|
+
before { tddium_client.stub(:environment).and_return("production") }
|
267
|
+
it_should_behave_like "with the correct environment extension" do
|
268
|
+
let(:environment_extension) {""}
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
context "development environment" do
|
273
|
+
before { tddium_client.stub(:environment).and_return("development") }
|
274
|
+
it_should_behave_like "with the correct environment extension" do
|
275
|
+
let(:environment_extension) {".development"}
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
context "test environment" do
|
280
|
+
before { tddium_client.stub(:environment).and_return("test") }
|
281
|
+
it_should_behave_like "with the correct environment extension" do
|
282
|
+
let(:environment_extension) {".test"}
|
283
|
+
end
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
299
287
|
describe "#account" do
|
300
288
|
before do
|
301
289
|
stub_defaults
|
@@ -402,7 +390,7 @@ describe Tddium do
|
|
402
390
|
it_should_behave_like "an unsuccessful api call"
|
403
391
|
|
404
392
|
context "because the invitation is invalid" do
|
405
|
-
before { stub_call_api_response(:post, Tddium::Api::Path::USERS,
|
393
|
+
before { stub_call_api_response(:post, Tddium::Api::Path::USERS, {"status" => Tddium::Api::ErrorCode::INVALID_INVITATION}) }
|
406
394
|
it "should show the user: '#{Tddium::Text::Error::INVALID_INVITATION}'" do
|
407
395
|
tddium.should_receive(:say).with(Tddium::Text::Error::INVALID_INVITATION)
|
408
396
|
run_account(tddium)
|
@@ -422,12 +410,52 @@ describe Tddium do
|
|
422
410
|
end
|
423
411
|
|
424
412
|
it_should_behave_like "set the default environment"
|
425
|
-
|
413
|
+
|
414
|
+
context "there is a tddium config file with an api key" do
|
415
|
+
before {stub_config_file(:api_key => "some api key")}
|
416
|
+
|
417
|
+
it "should send a 'GET' request to '#{Tddium::Api::Path::USERS}'" do
|
418
|
+
call_api_should_receive(:method => :get, :path => /#{Tddium::Api::Path::USERS}$/)
|
419
|
+
run(tddium)
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
context "the tddium config file is missing or corrupt or the api key is invalid" do
|
424
|
+
context "--email was not passed in" do
|
425
|
+
it "should prompt for the user's email address" do
|
426
|
+
tddium.should_receive(:ask).with(Tddium::Text::Prompt::EMAIL)
|
427
|
+
run(tddium)
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
431
|
+
context "--email was passed in" do
|
432
|
+
it "should not prompt for the user's email address" do
|
433
|
+
tddium.should_not_receive(:ask).with(Tddium::Text::Prompt::EMAIL)
|
434
|
+
run(tddium, :email => SAMPLE_EMAIL)
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
it_should_behave_like "a password prompt" do
|
439
|
+
let(:password_prompt) {Tddium::Text::Prompt::PASSWORD}
|
440
|
+
end
|
441
|
+
|
442
|
+
it "should try to sign in the user with their email & password" do
|
443
|
+
tddium.stub(:ask).with(Tddium::Text::Prompt::EMAIL).and_return(SAMPLE_EMAIL)
|
444
|
+
HighLine.stub(:ask).with(Tddium::Text::Prompt::PASSWORD).and_return(SAMPLE_PASSWORD)
|
445
|
+
call_api_should_receive(:method => :post, :path => /#{Tddium::Api::Path::SIGN_IN}$/, :params => {:user => {:email => SAMPLE_EMAIL, :password => SAMPLE_PASSWORD}}, :api_key => false)
|
446
|
+
run(tddium)
|
447
|
+
end
|
448
|
+
|
449
|
+
context "the user logs in successfully with their email and password" do
|
450
|
+
before{stub_call_api_response(:post, Tddium::Api::Path::SIGN_IN, {"api_key" => SAMPLE_API_KEY})}
|
451
|
+
it_should_behave_like "writing the api key to the .tddium file"
|
452
|
+
end
|
453
|
+
end
|
426
454
|
|
427
455
|
context "user is already logged in" do
|
428
456
|
before do
|
429
457
|
stub_config_file(:api_key => SAMPLE_API_KEY)
|
430
|
-
stub_call_api_response(:get, Tddium::Api::Path::USERS
|
458
|
+
stub_call_api_response(:get, Tddium::Api::Path::USERS)
|
431
459
|
end
|
432
460
|
|
433
461
|
it "should show the user: '#{Tddium::Text::Process::ALREADY_LOGGED_IN}'" do
|
@@ -437,7 +465,7 @@ describe Tddium do
|
|
437
465
|
end
|
438
466
|
|
439
467
|
context "the user logs in successfully" do
|
440
|
-
before{stub_call_api_response(:post, Tddium::Api::Path::SIGN_IN, {})}
|
468
|
+
before{ stub_call_api_response(:post, Tddium::Api::Path::SIGN_IN, {"api_key" => SAMPLE_API_KEY})}
|
441
469
|
it "should show the user: '#{Tddium::Text::Process::LOGGED_IN_SUCCESSFULLY}'" do
|
442
470
|
tddium.should_receive(:say).with(Tddium::Text::Process::LOGGED_IN_SUCCESSFULLY)
|
443
471
|
run_login(tddium)
|
@@ -450,7 +478,7 @@ describe Tddium do
|
|
450
478
|
end
|
451
479
|
|
452
480
|
describe "#logout" do
|
453
|
-
before {
|
481
|
+
before { stub_defaults }
|
454
482
|
|
455
483
|
context ".tddium file exists" do
|
456
484
|
before { stub_config_file }
|
@@ -554,9 +582,11 @@ describe Tddium do
|
|
554
582
|
|
555
583
|
context "'POST #{Tddium::Api::Path::START_TEST_EXECUTIONS}' is successful" do
|
556
584
|
let(:get_test_executions_response) { {"report"=>SAMPLE_REPORT_URL, "tests"=>{"spec/mouse_spec.rb"=>{"end_time"=>SAMPLE_DATE_TIME, "status"=>"pending"}, "spec/pig_spec.rb"=>{"end_time"=>nil, "status"=>"started"}, "spec/dog_spec.rb"=>{"end_time"=>SAMPLE_DATE_TIME, "status"=>"failed"}, "spec/cat_spec.rb"=>{"end_time"=>SAMPLE_DATE_TIME, "status"=>"passed"}}} }
|
557
|
-
before
|
558
|
-
|
559
|
-
|
585
|
+
before {stub_call_api_response(:post, "#{Tddium::Api::Path::SESSIONS}/#{SAMPLE_SESSION_ID}/#{Tddium::Api::Path::START_TEST_EXECUTIONS}", {"started"=>1, "status"=>0, "report" => SAMPLE_REPORT_URL})}
|
586
|
+
|
587
|
+
it "should show the user: '#{Tddium::Text::Process::CHECK_TEST_REPORT % SAMPLE_REPORT_URL}'" do
|
588
|
+
tddium.should_receive(:say).with(Tddium::Text::Process::CHECK_TEST_REPORT % SAMPLE_REPORT_URL)
|
589
|
+
run_spec(tddium)
|
560
590
|
end
|
561
591
|
|
562
592
|
it "should tell the user to '#{Tddium::Text::Process::TERMINATE_INSTRUCTION}'" do
|
@@ -577,8 +607,8 @@ describe Tddium do
|
|
577
607
|
it_should_behave_like "sending the api key"
|
578
608
|
|
579
609
|
shared_examples_for("test output summary") do
|
580
|
-
it "should
|
581
|
-
tddium.should_receive(:say).with(
|
610
|
+
it "should put a new line before displaying the summary" do
|
611
|
+
tddium.should_receive(:say).with(" ")
|
582
612
|
run_spec(tddium)
|
583
613
|
end
|
584
614
|
|
@@ -679,8 +709,13 @@ describe Tddium do
|
|
679
709
|
it_should_behave_like ".tddium file is missing or corrupt"
|
680
710
|
it_should_behave_like "suite has not been initialized"
|
681
711
|
|
712
|
+
it "should send a 'GET' request to '#{Tddium::Api::Path::SUITES}'" do
|
713
|
+
call_api_should_receive(:method => :get, :path => Tddium::Api::Path::SUITES)
|
714
|
+
run_status(tddium)
|
715
|
+
end
|
716
|
+
|
682
717
|
context "'GET #{Tddium::Api::Path::SUITES}' is successful" do
|
683
|
-
context "returns no suites" do
|
718
|
+
context "but returns no suites" do
|
684
719
|
before { stub_call_api_response(:get, Tddium::Api::Path::SUITES, {"suites" => []}) }
|
685
720
|
|
686
721
|
it "should show the user '#{Tddium::Text::Status::NO_SUITE}'" do
|
@@ -689,11 +724,10 @@ describe Tddium do
|
|
689
724
|
end
|
690
725
|
end
|
691
726
|
|
692
|
-
context "returns some suites" do
|
727
|
+
context "and returns some suites" do
|
693
728
|
let(:suite_attributes) { {"id"=>SAMPLE_SUITE_ID, "repo_name"=>SAMPLE_APP_NAME, "ruby_version"=>SAMPLE_RUBY_VERSION, "branch" => SAMPLE_BRANCH_NAME, "test_pattern" => SAMPLE_TEST_PATTERN, "bundler_version" => SAMPLE_BUNDLER_VERSION, "rubygems_version" => SAMPLE_RUBYGEMS_VERSION}}
|
694
729
|
before do
|
695
|
-
|
696
|
-
stub_call_api_response(:get, Tddium::Api::Path::SUITES, suites_response)
|
730
|
+
stub_call_api_response(:get, Tddium::Api::Path::SUITES, {"suites"=>[suite_attributes]})
|
697
731
|
end
|
698
732
|
|
699
733
|
it "should show all suites" do
|
@@ -749,8 +783,7 @@ describe Tddium do
|
|
749
783
|
context "show active sessions" do
|
750
784
|
context "without any session" do
|
751
785
|
before do
|
752
|
-
|
753
|
-
stub_call_api_response(:get, Tddium::Api::Path::SESSIONS, sessions_response)
|
786
|
+
stub_call_api_response(:get, Tddium::Api::Path::SESSIONS, {"sessions"=>[]})
|
754
787
|
end
|
755
788
|
|
756
789
|
it "should display no active session message" do
|
@@ -762,26 +795,33 @@ describe Tddium do
|
|
762
795
|
context "with some sessions" do
|
763
796
|
let(:session_attributes) { {"id"=>SAMPLE_SESSION_ID, "user_id"=>3} }
|
764
797
|
before do
|
765
|
-
|
766
|
-
stub_call_api_response(:get, Tddium::Api::Path::SESSIONS, sessions_response)
|
798
|
+
stub_call_api_response(:get, Tddium::Api::Path::SESSIONS, {"sessions"=>[session_attributes]})
|
767
799
|
end
|
768
800
|
|
769
|
-
it "should
|
801
|
+
it "should show the user: '#{Tddium::Text::Status::ACTIVE_SESSIONS}'" do
|
770
802
|
tddium.should_receive(:say).with(Tddium::Text::Status::ACTIVE_SESSIONS)
|
771
803
|
run_status(tddium)
|
772
804
|
end
|
773
805
|
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
806
|
+
it "should send a 'GET' request to '#{Tddium::Api::Path::TEST_EXECUTIONS}'" do
|
807
|
+
call_api_should_receive(:method => :get, :path => /#{Tddium::Api::Path::TEST_EXECUTIONS}$/)
|
808
|
+
run_status(tddium)
|
809
|
+
end
|
810
|
+
|
811
|
+
context "'GET #{Tddium::Api::Path::TEST_EXECUTIONS}' is successful" do
|
812
|
+
let(:test_execution_attributes) { {"report" => SAMPLE_REPORT_URL, "test_execution_stats" => SAMPLE_TEST_EXECUTION_STATS, "start_time" => SAMPLE_DATE_TIME, "end_time" => SAMPLE_DATE_TIME} }
|
813
|
+
before { stub_call_api_response(:get, /#{Tddium::Api::Path::TEST_EXECUTIONS}$/, test_execution_attributes) }
|
814
|
+
it_should_behave_like "attribute details" do
|
815
|
+
let(:attributes_to_display) {Tddium::DisplayedAttributes::TEST_EXECUTION}
|
816
|
+
let(:attributes_to_hide) { [] }
|
817
|
+
let(:attributes) { test_execution_attributes }
|
818
|
+
end
|
778
819
|
end
|
779
820
|
end
|
780
821
|
end
|
781
822
|
end
|
782
823
|
end
|
783
824
|
end
|
784
|
-
|
785
825
|
it_should_behave_like "an unsuccessful api call"
|
786
826
|
end
|
787
827
|
|
@@ -803,7 +843,7 @@ describe Tddium do
|
|
803
843
|
context ".tddium file contains no suites" do
|
804
844
|
before do
|
805
845
|
stub_default_suite_name
|
806
|
-
stub_call_api_response(:get, Tddium::Api::Path::SUITES, {"suites" => []}
|
846
|
+
stub_call_api_response(:get, Tddium::Api::Path::SUITES, {"suites" => []})
|
807
847
|
end
|
808
848
|
|
809
849
|
context "using defaults" do
|
@@ -850,7 +890,7 @@ describe Tddium do
|
|
850
890
|
|
851
891
|
context "but this user has already registered some suites" do
|
852
892
|
before do
|
853
|
-
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE, {"suites" => []}
|
893
|
+
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE, {"suites" => []})
|
854
894
|
tddium.stub(:ask).with(Tddium::Text::Prompt::USE_EXISTING_SUITE % SAMPLE_APP_NAME).and_return(Tddium::Text::Prompt::Response::YES)
|
855
895
|
end
|
856
896
|
|
@@ -871,7 +911,7 @@ describe Tddium do
|
|
871
911
|
|
872
912
|
context "passing --name=my_suite" do
|
873
913
|
before do
|
874
|
-
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE
|
914
|
+
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE)
|
875
915
|
end
|
876
916
|
|
877
917
|
it "should not ask the user if they want to use the existing suite" do
|
@@ -890,7 +930,7 @@ describe Tddium do
|
|
890
930
|
|
891
931
|
context "the user wants to use the existing suite" do
|
892
932
|
before do
|
893
|
-
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE
|
933
|
+
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE)
|
894
934
|
end
|
895
935
|
|
896
936
|
it "should not send a 'POST' request to '#{Tddium::Api::Path::SUITES}'" do
|
data/tddium.gemspec
CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.authors = ["Jay Moorthi"]
|
14
14
|
s.email = ["info@tddium.com"]
|
15
15
|
s.homepage = "http://www.tddium.com/"
|
16
|
-
s.summary = %q{tddium
|
17
|
-
s.description = %q{tddium
|
16
|
+
s.summary = %q{tddium Hosted Testing}
|
17
|
+
s.description = %q{tddium runs your rspec (and Selenium) tests in the cloud, in parallel!}
|
18
18
|
|
19
19
|
s.rubyforge_project = "tddium"
|
20
20
|
|
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
s.add_runtime_dependency("thor")
|
27
27
|
s.add_runtime_dependency("highline")
|
28
28
|
s.add_runtime_dependency("json")
|
29
|
-
s.add_runtime_dependency("tddium_client", "
|
29
|
+
s.add_runtime_dependency("tddium_client", ">=0.0.6")
|
30
30
|
|
31
31
|
s.add_development_dependency("rspec")
|
32
32
|
s.add_development_dependency("fakefs")
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tddium-preview
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
4
|
+
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
8
|
+
- 5
|
9
|
+
version: 0.0.5
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Jay Moorthi
|
@@ -15,7 +14,7 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2011-
|
17
|
+
date: 2011-04-04 00:00:00 -07:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
@@ -26,7 +25,6 @@ dependencies:
|
|
26
25
|
requirements:
|
27
26
|
- - ">="
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 3
|
30
28
|
segments:
|
31
29
|
- 0
|
32
30
|
version: "0"
|
@@ -40,7 +38,6 @@ dependencies:
|
|
40
38
|
requirements:
|
41
39
|
- - ">="
|
42
40
|
- !ruby/object:Gem::Version
|
43
|
-
hash: 3
|
44
41
|
segments:
|
45
42
|
- 0
|
46
43
|
version: "0"
|
@@ -54,7 +51,6 @@ dependencies:
|
|
54
51
|
requirements:
|
55
52
|
- - ">="
|
56
53
|
- !ruby/object:Gem::Version
|
57
|
-
hash: 3
|
58
54
|
segments:
|
59
55
|
- 0
|
60
56
|
version: "0"
|
@@ -66,14 +62,13 @@ dependencies:
|
|
66
62
|
requirement: &id004 !ruby/object:Gem::Requirement
|
67
63
|
none: false
|
68
64
|
requirements:
|
69
|
-
- - "
|
65
|
+
- - ">="
|
70
66
|
- !ruby/object:Gem::Version
|
71
|
-
hash: 25
|
72
67
|
segments:
|
73
68
|
- 0
|
74
69
|
- 0
|
75
|
-
-
|
76
|
-
version: 0.0.
|
70
|
+
- 6
|
71
|
+
version: 0.0.6
|
77
72
|
type: :runtime
|
78
73
|
version_requirements: *id004
|
79
74
|
- !ruby/object:Gem::Dependency
|
@@ -84,7 +79,6 @@ dependencies:
|
|
84
79
|
requirements:
|
85
80
|
- - ">="
|
86
81
|
- !ruby/object:Gem::Version
|
87
|
-
hash: 3
|
88
82
|
segments:
|
89
83
|
- 0
|
90
84
|
version: "0"
|
@@ -98,7 +92,6 @@ dependencies:
|
|
98
92
|
requirements:
|
99
93
|
- - ">="
|
100
94
|
- !ruby/object:Gem::Version
|
101
|
-
hash: 3
|
102
95
|
segments:
|
103
96
|
- 0
|
104
97
|
version: "0"
|
@@ -112,7 +105,6 @@ dependencies:
|
|
112
105
|
requirements:
|
113
106
|
- - ">="
|
114
107
|
- !ruby/object:Gem::Version
|
115
|
-
hash: 3
|
116
108
|
segments:
|
117
109
|
- 0
|
118
110
|
version: "0"
|
@@ -126,13 +118,12 @@ dependencies:
|
|
126
118
|
requirements:
|
127
119
|
- - ">="
|
128
120
|
- !ruby/object:Gem::Version
|
129
|
-
hash: 3
|
130
121
|
segments:
|
131
122
|
- 0
|
132
123
|
version: "0"
|
133
124
|
type: :development
|
134
125
|
version_requirements: *id008
|
135
|
-
description: tddium
|
126
|
+
description: tddium runs your rspec (and Selenium) tests in the cloud, in parallel!
|
136
127
|
email:
|
137
128
|
- info@tddium.com
|
138
129
|
executables:
|
@@ -171,7 +162,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
171
162
|
requirements:
|
172
163
|
- - ">="
|
173
164
|
- !ruby/object:Gem::Version
|
174
|
-
hash: 3
|
175
165
|
segments:
|
176
166
|
- 0
|
177
167
|
version: "0"
|
@@ -180,17 +170,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
170
|
requirements:
|
181
171
|
- - ">="
|
182
172
|
- !ruby/object:Gem::Version
|
183
|
-
hash: 3
|
184
173
|
segments:
|
185
174
|
- 0
|
186
175
|
version: "0"
|
187
176
|
requirements: []
|
188
177
|
|
189
178
|
rubyforge_project: tddium
|
190
|
-
rubygems_version: 1.
|
179
|
+
rubygems_version: 1.3.7
|
191
180
|
signing_key:
|
192
181
|
specification_version: 3
|
193
|
-
summary: tddium
|
182
|
+
summary: tddium Hosted Testing
|
194
183
|
test_files:
|
195
184
|
- spec/spec_helper.rb
|
196
185
|
- spec/tddium_spec.rb
|