tddium-preview 0.6.8 → 0.6.10
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/lib/tddium.rb +30 -17
- data/lib/tddium/constant.rb +54 -5
- data/lib/tddium/version.rb +1 -1
- data/spec/tddium_spec.rb +33 -29
- metadata +2 -2
data/Gemfile.lock
CHANGED
data/lib/tddium.rb
CHANGED
@@ -13,7 +13,7 @@ require File.expand_path("../tddium/constant", __FILE__)
|
|
13
13
|
require File.expand_path("../tddium/heroku", __FILE__)
|
14
14
|
|
15
15
|
# Usage:
|
16
|
-
|
16
|
+
|
17
17
|
# tddium suite # Register the suite for this rails app, or manage its settings
|
18
18
|
# tddium spec # Run the test suite
|
19
19
|
# tddium status # Display information about this suite, and any open dev sessions
|
@@ -22,7 +22,7 @@ require File.expand_path("../tddium/heroku", __FILE__)
|
|
22
22
|
# tddium logout # Log out
|
23
23
|
#
|
24
24
|
# tddium account # View/Manage account information
|
25
|
-
# tddium
|
25
|
+
# tddium password # Change password
|
26
26
|
#
|
27
27
|
# tddium help # Print this usage message
|
28
28
|
|
@@ -291,7 +291,7 @@ class Tddium < Thor
|
|
291
291
|
end
|
292
292
|
end
|
293
293
|
|
294
|
-
desc "suite", "Register the suite for this project, or
|
294
|
+
desc "suite", "Register the suite for this project, or edit its settings"
|
295
295
|
method_option :name, :type => :string, :default => nil
|
296
296
|
method_option :pull_url, :type => :string, :default => nil
|
297
297
|
method_option :push_url, :type => :string, :default => nil
|
@@ -435,13 +435,22 @@ class Tddium < Thor
|
|
435
435
|
end
|
436
436
|
|
437
437
|
def git_repo?
|
438
|
-
unless
|
438
|
+
unless system("git status --porcelain > /dev/null 2>&1")
|
439
439
|
message = Text::Error::GIT_NOT_INITIALIZED
|
440
440
|
say message
|
441
441
|
end
|
442
442
|
message.nil?
|
443
443
|
end
|
444
444
|
|
445
|
+
def git_origin_url
|
446
|
+
result = `git config --get remote.origin.url`
|
447
|
+
if $? == 0
|
448
|
+
result
|
449
|
+
else
|
450
|
+
nil
|
451
|
+
end
|
452
|
+
end
|
453
|
+
|
445
454
|
def handle_heroku_user(options, heroku_config)
|
446
455
|
api_key = heroku_config['TDDIUM_API_KEY']
|
447
456
|
user = tddium_client.call_api(:get, Api::Path::USERS, {}, api_key) rescue nil
|
@@ -481,7 +490,7 @@ class Tddium < Thor
|
|
481
490
|
end
|
482
491
|
|
483
492
|
def prompt(text, current_value, default_value)
|
484
|
-
value = current_value || ask(text % default_value)
|
493
|
+
value = current_value || ask(text % default_value, :bold)
|
485
494
|
value.empty? ? default_value : value
|
486
495
|
end
|
487
496
|
|
@@ -501,22 +510,26 @@ class Tddium < Thor
|
|
501
510
|
params[key] = prompt(text, options[key], current.fetch(key.to_s, default))
|
502
511
|
end
|
503
512
|
|
504
|
-
|
505
|
-
|
506
|
-
|
513
|
+
ask_or_update.call(:test_pattern, Text::Prompt::TEST_PATTERN, Default::SUITE_TEST_PATTERN)
|
514
|
+
|
515
|
+
if current.size > 0 && current['ci_pull_url']
|
516
|
+
say(Text::Process::SETUP_CI_EDIT)
|
517
|
+
else
|
518
|
+
say(Text::Process::SETUP_CI_FIRST_TIME % params[:test_pattern])
|
507
519
|
end
|
508
520
|
|
509
|
-
ask_or_update.call(:
|
521
|
+
ask_or_update.call(:ci_pull_url, Text::Prompt::CI_PULL_URL, git_origin_url)
|
522
|
+
ask_or_update.call(:ci_push_url, Text::Prompt::CI_PUSH_URL, nil)
|
510
523
|
|
511
|
-
if
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
ask_or_update.call(:campfire_subdomain, Text::Prompt::CAMPFIRE_SUBDOMAIN, nil)
|
516
|
-
ask_or_update.call(:campfire_token, Text::Prompt::CAMPFIRE_TOKEN, nil)
|
517
|
-
ask_or_update.call(:campfire_room, Text::Prompt::CAMPFIRE_ROOM, nil)
|
518
|
-
end
|
524
|
+
if current.size > 0 && current['campfire_room']
|
525
|
+
say(Text::Process::SETUP_CAMPFIRE_EDIT)
|
526
|
+
else
|
527
|
+
say(Text::Process::SETUP_CAMPFIRE_FIRST_TIME)
|
519
528
|
end
|
529
|
+
|
530
|
+
ask_or_update.call(:campfire_subdomain, Text::Prompt::CAMPFIRE_SUBDOMAIN, nil)
|
531
|
+
ask_or_update.call(:campfire_token, Text::Prompt::CAMPFIRE_TOKEN, nil)
|
532
|
+
ask_or_update.call(:campfire_room, Text::Prompt::CAMPFIRE_ROOM, nil)
|
520
533
|
end
|
521
534
|
|
522
535
|
def prompt_update_suite(suite, options)
|
data/lib/tddium/constant.rb
CHANGED
@@ -46,6 +46,7 @@ module TddiumConstant
|
|
46
46
|
module Response
|
47
47
|
AGREE_TO_LICENSE = "I AGREE"
|
48
48
|
YES = "y"
|
49
|
+
DISABLE = 'disable'
|
49
50
|
end
|
50
51
|
SSH_KEY = "Enter your ssh key or press 'Return'. Using '%s' by default:"
|
51
52
|
SUITE_NAME = "Enter a suite name or press 'Return'. Using '%s' by default:"
|
@@ -58,11 +59,9 @@ module TddiumConstant
|
|
58
59
|
INVITATION_TOKEN = "Enter your invitation token:"
|
59
60
|
USE_EXISTING_SUITE = "A suite exists '%%s' (branch %s). Enter '#{Response::YES}' to use it, or enter a new repo name:"
|
60
61
|
TEST_PATTERN = "Enter a test pattern or press 'Return'. Using '%s' by default:"
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
CI_PUSH_URL = "Push to git URL on tests pass (unset=disable) (default '%s'):"
|
65
|
-
ENABLE_CAMPFIRE = "Setup Campfire CI notifications?"
|
62
|
+
UPDATE_SUITE = "Do you want to edit settings for this suite? (y/n)"
|
63
|
+
CI_PULL_URL = "Enter git URL to pull from (default '%s'):"
|
64
|
+
CI_PUSH_URL = "Enter git URL to push to (default '%s'):"
|
66
65
|
CAMPFIRE_SUBDOMAIN = "Enter your Campfire subdomain (default '%s'):"
|
67
66
|
CAMPFIRE_ROOM = "Enter the Campfire room name (default '%s'):"
|
68
67
|
CAMPFIRE_TOKEN = "Enter your Campfire API Token (default '%s'):"
|
@@ -115,6 +114,54 @@ with Tddium.
|
|
115
114
|
"
|
116
115
|
UPDATED_SUITE = "Updated suite successfully."
|
117
116
|
DEPENDENCY_VERSION = "Detected %s %s"
|
117
|
+
SETUP_CI_FIRST_TIME =<<EOF;
|
118
|
+
|
119
|
+
Tddium Hosted CI will wait for a POST from a git post-receive hook.
|
120
|
+
|
121
|
+
When the hook runs, Tddium will:
|
122
|
+
|
123
|
+
1) Pull your integration branch from your git server (pull from URL)
|
124
|
+
2) Run all the tests that match the test pattern for this suite:
|
125
|
+
%s
|
126
|
+
3) Notify you by email and/or campfire
|
127
|
+
4) If you want, when tests pass, Tddium CI will then push to a git
|
128
|
+
server (push to URL). For example, enter the git URL to your
|
129
|
+
Heroku staging app.
|
130
|
+
|
131
|
+
Enter a git URL to pull from to enable hosted CI.
|
132
|
+
|
133
|
+
When everything's been set up, you'll receive an SSH public key to authorize in
|
134
|
+
git for pulls and pushes, and a Hook URL to configure in a post-commit hook.
|
135
|
+
|
136
|
+
Leave both the pull and push URL settings blank to disable hosted CI.
|
137
|
+
EOF
|
138
|
+
SETUP_CAMPFIRE_FIRST_TIME =<<EOF;
|
139
|
+
|
140
|
+
To enable Campfire notifications, enter your Campfire subdomain, API token,
|
141
|
+
and the room name to post for this suite's builds.
|
142
|
+
|
143
|
+
Subdomain and API token are shared by all suites that belong to you (%s).
|
144
|
+
|
145
|
+
Leave the Campfire room name blank to disable Campfire for this suite.
|
146
|
+
|
147
|
+
EOF
|
148
|
+
|
149
|
+
SETUP_CI_EDIT =<<EOF;
|
150
|
+
|
151
|
+
Tddium Hosted CI is enabled for this suite.
|
152
|
+
|
153
|
+
Set the "git URL to pull from" to 'disable' to disable CI completely.
|
154
|
+
Set the "git URL to push to" to 'disable' to disable CI completely.
|
155
|
+
|
156
|
+
EOF
|
157
|
+
SETUP_CAMPFIRE_EDIT =<<EOF;
|
158
|
+
|
159
|
+
Campfire notifications are enabled for this suite.
|
160
|
+
Subdomain and API token are shared by all suites that belong to you (%s).
|
161
|
+
|
162
|
+
Set the "Campfire room name" to 'disable' to disable Campfire notifications
|
163
|
+
for this suite.
|
164
|
+
EOF
|
118
165
|
end
|
119
166
|
|
120
167
|
module Status
|
@@ -174,6 +221,8 @@ Authorize the following SSH key to let Tddium's pulls and pushes through:
|
|
174
221
|
To trigger CI builds, POST to the following URL from a post-commit hook:
|
175
222
|
|
176
223
|
<%=suite["hook_uri"]%>
|
224
|
+
|
225
|
+
See www.tddium.com/support for more information.
|
177
226
|
<% end %>
|
178
227
|
EOF
|
179
228
|
end
|
data/lib/tddium/version.rb
CHANGED
data/spec/tddium_spec.rb
CHANGED
@@ -174,6 +174,8 @@ describe Tddium do
|
|
174
174
|
tddium.stub(:say)
|
175
175
|
stub_git_branch(tddium)
|
176
176
|
stub_tddium_client
|
177
|
+
stub_git_status(tddium)
|
178
|
+
stub_git_config(tddium)
|
177
179
|
create_file(File.join(".git", "something"), "something")
|
178
180
|
create_file(Tddium::Git::GITIGNORE, "something")
|
179
181
|
end
|
@@ -182,6 +184,14 @@ describe Tddium do
|
|
182
184
|
tddium.stub(:`).with("git symbolic-ref HEAD").and_return(default_branch_name)
|
183
185
|
end
|
184
186
|
|
187
|
+
def stub_git_status(tddium, result=true)
|
188
|
+
tddium.stub(:system).with(/git status/).and_return(result)
|
189
|
+
end
|
190
|
+
|
191
|
+
def stub_git_config(tddium)
|
192
|
+
tddium.stub(:`).with(/git config/).and_return(SAMPLE_GIT_REPO_URI)
|
193
|
+
end
|
194
|
+
|
185
195
|
def stub_git_push(tddium, success = true)
|
186
196
|
tddium.stub(:system).with(/^git push/).and_return(success)
|
187
197
|
end
|
@@ -247,6 +257,7 @@ describe Tddium do
|
|
247
257
|
context "git repo has not been initialized" do
|
248
258
|
before do
|
249
259
|
FileUtils.rm_rf(".git")
|
260
|
+
stub_git_status(tddium, false)
|
250
261
|
end
|
251
262
|
|
252
263
|
it "should return git is uninitialized" do
|
@@ -492,14 +503,14 @@ describe Tddium do
|
|
492
503
|
shared_examples_for "prompt for ssh key" do
|
493
504
|
context "--ssh-key-file is not supplied" do
|
494
505
|
it "should prompt the user for their ssh key file" do
|
495
|
-
tddium.should_receive(:ask).with(Tddium::Text::Prompt::SSH_KEY % Tddium::Default::SSH_FILE)
|
506
|
+
tddium.should_receive(:ask).with(Tddium::Text::Prompt::SSH_KEY % Tddium::Default::SSH_FILE, anything)
|
496
507
|
run(tddium)
|
497
508
|
end
|
498
509
|
end
|
499
510
|
|
500
511
|
context "--ssh-key-file is supplied" do
|
501
512
|
it "should not prompt the user for their ssh key file" do
|
502
|
-
tddium.should_not_receive(:ask).with(Tddium::Text::Prompt::SSH_KEY % Tddium::Default::SSH_FILE)
|
513
|
+
tddium.should_not_receive(:ask).with(Tddium::Text::Prompt::SSH_KEY % Tddium::Default::SSH_FILE, anything)
|
503
514
|
run(tddium, :ssh_key_file => Tddium::Default::SSH_FILE)
|
504
515
|
end
|
505
516
|
end
|
@@ -1327,24 +1338,17 @@ describe Tddium do
|
|
1327
1338
|
end
|
1328
1339
|
|
1329
1340
|
shared_examples_for "prompting for suite configuration" do
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
it "should prompt for URLs" do
|
1337
|
-
tddium.should_receive(:ask).with(Tddium::Text::Prompt::CI_PULL_URL % current['ci_pull_url'])
|
1338
|
-
tddium.should_receive(:ask).with(Tddium::Text::Prompt::CI_PUSH_URL % current['ci_push_url'])
|
1339
|
-
run_suite(tddium)
|
1340
|
-
end
|
1341
|
+
it "should prompt for URLs" do
|
1342
|
+
tddium.should_receive(:ask).with(Tddium::Text::Prompt::CI_PULL_URL % current.fetch('ci_pull_url', SAMPLE_GIT_REPO_URI), anything)
|
1343
|
+
tddium.should_receive(:ask).with(Tddium::Text::Prompt::CI_PUSH_URL % current['ci_push_url'], anything)
|
1344
|
+
run_suite(tddium)
|
1345
|
+
end
|
1341
1346
|
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
end
|
1347
|
+
it "should prompt for campfire" do
|
1348
|
+
tddium.should_receive(:ask).with(Tddium::Text::Prompt::CAMPFIRE_SUBDOMAIN % current['campfire_subdomain'], anything)
|
1349
|
+
tddium.should_receive(:ask).with(Tddium::Text::Prompt::CAMPFIRE_TOKEN % current['campfire_token'], anything)
|
1350
|
+
tddium.should_receive(:ask).with(Tddium::Text::Prompt::CAMPFIRE_ROOM % current['campfire_room'], anything)
|
1351
|
+
run_suite(tddium)
|
1348
1352
|
end
|
1349
1353
|
end
|
1350
1354
|
|
@@ -1381,10 +1385,10 @@ describe Tddium do
|
|
1381
1385
|
end
|
1382
1386
|
|
1383
1387
|
context "interactive mode" do
|
1384
|
-
before { tddium.stub(:ask).with(Tddium::Text::Prompt::SUITE_NAME % SAMPLE_APP_NAME).and_return("some_other_suite") }
|
1388
|
+
before { tddium.stub(:ask).with(Tddium::Text::Prompt::SUITE_NAME % SAMPLE_APP_NAME, anything).and_return("some_other_suite") }
|
1385
1389
|
|
1386
1390
|
it "should ask for a suite name" do
|
1387
|
-
tddium.should_receive(:ask).with(Tddium::Text::Prompt::SUITE_NAME % SAMPLE_APP_NAME)
|
1391
|
+
tddium.should_receive(:ask).with(Tddium::Text::Prompt::SUITE_NAME % SAMPLE_APP_NAME, anything)
|
1388
1392
|
run_suite(tddium)
|
1389
1393
|
end
|
1390
1394
|
|
@@ -1404,7 +1408,7 @@ describe Tddium do
|
|
1404
1408
|
context "but this user has already registered some suites" do
|
1405
1409
|
before do
|
1406
1410
|
stub_call_api_response(:get, Tddium::Api::Path::SUITES, SAMPLE_SUITES_RESPONSE, {"suites" => []})
|
1407
|
-
tddium.stub(:ask).with(Tddium::Text::Prompt::USE_EXISTING_SUITE % SAMPLE_BRANCH_NAME % SAMPLE_APP_NAME).and_return(Tddium::Text::Prompt::Response::YES)
|
1411
|
+
tddium.stub(:ask).with(Tddium::Text::Prompt::USE_EXISTING_SUITE % SAMPLE_BRANCH_NAME % SAMPLE_APP_NAME, anything).and_return(Tddium::Text::Prompt::Response::YES)
|
1408
1412
|
end
|
1409
1413
|
|
1410
1414
|
shared_examples_for "writing the suite to file" do
|
@@ -1431,7 +1435,7 @@ describe Tddium do
|
|
1431
1435
|
|
1432
1436
|
context "passing no cli options" do
|
1433
1437
|
it "should ask the user: '#{Tddium::Text::Prompt::USE_EXISTING_SUITE % SAMPLE_BRANCH_NAME % SAMPLE_APP_NAME}' " do
|
1434
|
-
tddium.should_receive(:ask).with(Tddium::Text::Prompt::USE_EXISTING_SUITE % SAMPLE_BRANCH_NAME % SAMPLE_APP_NAME).and_return("something")
|
1438
|
+
tddium.should_receive(:ask).with(Tddium::Text::Prompt::USE_EXISTING_SUITE % SAMPLE_BRANCH_NAME % SAMPLE_APP_NAME, anything).and_return("something")
|
1435
1439
|
run_suite(tddium)
|
1436
1440
|
end
|
1437
1441
|
end
|
@@ -1442,7 +1446,7 @@ describe Tddium do
|
|
1442
1446
|
end
|
1443
1447
|
|
1444
1448
|
it "should not ask the user if they want to use the existing suite" do
|
1445
|
-
tddium_client.should_not_receive(:ask).with(Tddium::Text::Prompt::USE_EXISTING_SUITE % "my_suite")
|
1449
|
+
tddium_client.should_not_receive(:ask).with(Tddium::Text::Prompt::USE_EXISTING_SUITE % "my_suite", anything)
|
1446
1450
|
run_suite(tddium, :name => "my_suite")
|
1447
1451
|
end
|
1448
1452
|
|
@@ -1474,7 +1478,7 @@ describe Tddium do
|
|
1474
1478
|
end
|
1475
1479
|
|
1476
1480
|
context "the user does not want to use the existing suite" do
|
1477
|
-
before{ tddium.stub(:ask).with(Tddium::Text::Prompt::USE_EXISTING_SUITE % SAMPLE_BRANCH_NAME % SAMPLE_APP_NAME).and_return("some_other_suite") }
|
1481
|
+
before{ tddium.stub(:ask).with(Tddium::Text::Prompt::USE_EXISTING_SUITE % SAMPLE_BRANCH_NAME % SAMPLE_APP_NAME, anything).and_return("some_other_suite") }
|
1478
1482
|
|
1479
1483
|
|
1480
1484
|
it "should send a 'POST' request to '#{Tddium::Api::Path::SUITES}'" do
|
@@ -1508,8 +1512,8 @@ describe Tddium do
|
|
1508
1512
|
|
1509
1513
|
context "interactive mode" do
|
1510
1514
|
before do
|
1511
|
-
tddium.stub(:ask).with(Tddium::Text::Prompt::USE_EXISTING_SUITE % SAMPLE_BRANCH_NAME % SAMPLE_APP_NAME).and_return("foobar")
|
1512
|
-
tddium.stub(:ask).with(Tddium::Text::Prompt::TEST_PATTERN % Tddium::Default::SUITE_TEST_PATTERN).and_return(SAMPLE_SUITE_PATTERN)
|
1515
|
+
tddium.stub(:ask).with(Tddium::Text::Prompt::USE_EXISTING_SUITE % SAMPLE_BRANCH_NAME % SAMPLE_APP_NAME, anything).and_return("foobar")
|
1516
|
+
tddium.stub(:ask).with(Tddium::Text::Prompt::TEST_PATTERN % Tddium::Default::SUITE_TEST_PATTERN, anything).and_return(SAMPLE_SUITE_PATTERN)
|
1513
1517
|
stub_default_suite_name
|
1514
1518
|
end
|
1515
1519
|
|
@@ -1569,13 +1573,13 @@ describe Tddium do
|
|
1569
1573
|
end
|
1570
1574
|
|
1571
1575
|
it "should check if the user wants to update the suite" do
|
1572
|
-
tddium.should_receive(:ask).with(Tddium::Text::Prompt::UPDATE_SUITE)
|
1576
|
+
tddium.should_receive(:ask).with(Tddium::Text::Prompt::UPDATE_SUITE, anything)
|
1573
1577
|
run_suite(tddium)
|
1574
1578
|
end
|
1575
1579
|
|
1576
1580
|
context "user wants to update the suite" do
|
1577
1581
|
before(:each) do
|
1578
|
-
tddium.stub(:ask).with(Tddium::Text::Prompt::UPDATE_SUITE).and_return(Tddium::Text::Prompt::Response::YES)
|
1582
|
+
tddium.stub(:ask).with(Tddium::Text::Prompt::UPDATE_SUITE, anything).and_return(Tddium::Text::Prompt::Response::YES)
|
1579
1583
|
end
|
1580
1584
|
it_behaves_like "prompting for suite configuration" do
|
1581
1585
|
let(:current) { SAMPLE_SUITE_RESPONSE }
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: tddium-preview
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.6.
|
5
|
+
version: 0.6.10
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Solano Labs
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-06-
|
13
|
+
date: 2011-06-21 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|