codefumes 0.1.10 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +19 -0
- data/Gemfile.lock +135 -0
- data/History.txt +12 -0
- data/LICENSE +20 -0
- data/Manifest.txt +40 -19
- data/README.txt +11 -29
- data/Rakefile +15 -10
- data/bin/fumes +214 -0
- data/config/website.yml +2 -0
- data/cucumber.yml +2 -0
- data/features/claiming_a_project.feature +46 -0
- data/features/deleting_a_project.feature +32 -0
- data/features/releasing_a_project.feature +50 -0
- data/features/step_definitions/cli_steps.rb +98 -0
- data/features/step_definitions/common_steps.rb +168 -0
- data/features/step_definitions/filesystem_steps.rb +19 -0
- data/features/storing_user_api_key.feature +41 -0
- data/features/support/common.rb +29 -0
- data/features/support/env.rb +24 -0
- data/features/support/matchers.rb +11 -0
- data/features/synchronizing_repository_with_project.feature +33 -0
- data/lib/codefumes.rb +10 -8
- data/lib/codefumes/api.rb +20 -11
- data/lib/codefumes/api/build.rb +139 -0
- data/lib/codefumes/api/claim.rb +74 -0
- data/lib/codefumes/api/commit.rb +150 -0
- data/lib/codefumes/api/payload.rb +93 -0
- data/lib/codefumes/api/project.rb +158 -0
- data/lib/codefumes/cli_helpers.rb +54 -0
- data/lib/codefumes/config_file.rb +3 -2
- data/lib/codefumes/errors.rb +21 -0
- data/lib/codefumes/exit_codes.rb +10 -0
- data/lib/codefumes/harvester.rb +113 -0
- data/lib/codefumes/quick_build.rb +43 -0
- data/lib/codefumes/quick_metric.rb +20 -0
- data/lib/codefumes/source_control.rb +137 -0
- data/lib/integrity_notifier/codefumes.haml +11 -0
- data/lib/integrity_notifier/codefumes.rb +62 -0
- data/spec/codefumes/{build_spec.rb → api/build_spec.rb} +14 -24
- data/spec/codefumes/{claim_spec.rb → api/claim_spec.rb} +42 -3
- data/spec/codefumes/{commit_spec.rb → api/commit_spec.rb} +34 -24
- data/spec/codefumes/api/payload_spec.rb +148 -0
- data/spec/codefumes/api/project_spec.rb +286 -0
- data/spec/codefumes/api_spec.rb +38 -15
- data/spec/codefumes/config_file_spec.rb +69 -13
- data/spec/codefumes/harvester_spec.rb +118 -0
- data/spec/codefumes/source_control_spec.rb +199 -0
- data/spec/codefumes_service_helpers.rb +23 -19
- data/spec/fixtures/sample_project_dirs/no_scm/description +4 -0
- data/spec/spec_helper.rb +1 -0
- data/tasks/cucumber.rake +11 -0
- metadata +145 -60
- data/bin/cf_claim_project +0 -9
- data/bin/cf_release_project +0 -10
- data/bin/cf_store_credentials +0 -10
- data/lib/cf_claim_project/cli.rb +0 -95
- data/lib/cf_release_project/cli.rb +0 -76
- data/lib/cf_store_credentials/cli.rb +0 -50
- data/lib/codefumes/build.rb +0 -131
- data/lib/codefumes/claim.rb +0 -57
- data/lib/codefumes/commit.rb +0 -144
- data/lib/codefumes/payload.rb +0 -103
- data/lib/codefumes/project.rb +0 -129
- data/spec/cf_claim_project/cli_spec.rb +0 -17
- data/spec/cf_release_project/cli_spec.rb +0 -41
- data/spec/cf_store_credentials/cli_spec.rb +0 -28
- data/spec/codefumes/payload_spec.rb +0 -155
- data/spec/codefumes/project_spec.rb +0 -274
data/config/website.yml
ADDED
data/cucumber.yml
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
Feature: Claiming a project
|
2
|
+
As the owner of a project, if I have decided I want to use the CodeFumes
|
3
|
+
service, I don't want to have to remember the public key for my project(s).
|
4
|
+
The gem must provide a simple method of "claiming" a project and associating
|
5
|
+
it with an account.
|
6
|
+
|
7
|
+
|
8
|
+
Scenario: Specified project does not exist on CodeFumes.com
|
9
|
+
Given valid user credentials have been stored in the CodeFumes config file
|
10
|
+
When I run "#{@bin_path}/fumes claim -p bad-public-key"
|
11
|
+
Then the output should contain "Not Found"
|
12
|
+
And the exit status should be 0
|
13
|
+
|
14
|
+
Scenario: Attempting to claim a project without having an API key entry in the CodeFumes config file
|
15
|
+
Given I have cloned and synchronized 1 project
|
16
|
+
When I claim the project
|
17
|
+
Then the output should contain instructions about storing your API key
|
18
|
+
And the exit status should be 3
|
19
|
+
|
20
|
+
Scenario: Attempting to claim a project with an invalid API key entry in the user's CodeFumes config file
|
21
|
+
Given invalid user credentials have been stored in the CodeFumes config file
|
22
|
+
And I have cloned and synchronized 1 project
|
23
|
+
When I claim the project
|
24
|
+
Then the output should contain "Denied"
|
25
|
+
And the exit status should be 0
|
26
|
+
|
27
|
+
Scenario: Claim a project using the key stored in a CodeFumes project directory
|
28
|
+
Given valid user credentials have been stored in the CodeFumes config file
|
29
|
+
And I have cloned and synchronized 1 project
|
30
|
+
When I claim the project
|
31
|
+
Then the output should contain "Success"
|
32
|
+
And the exit status should be 0
|
33
|
+
|
34
|
+
Scenario: Claiming one of multiple projects in your CodeFumes config file
|
35
|
+
Given valid user credentials have been stored in the CodeFumes config file
|
36
|
+
And I have cloned and synchronized 2 projects
|
37
|
+
When I claim the 1st project
|
38
|
+
Then the output should contain 1 successful claim message
|
39
|
+
And the exit status should be 0
|
40
|
+
|
41
|
+
Scenario: Claim all projects in your CodeFumes config file
|
42
|
+
Given valid user credentials have been stored in the CodeFumes config file
|
43
|
+
And I have cloned and synchronized 2 projects
|
44
|
+
And I run "#{@bin_path}/fumes claim -a"
|
45
|
+
Then the output should contain 2 successful claim messages
|
46
|
+
And the exit status should be 0
|
@@ -0,0 +1,32 @@
|
|
1
|
+
Feature: Deleting a project
|
2
|
+
The process of deleting a project must be both
|
3
|
+
available and simple in order to reduce the number
|
4
|
+
of barriers to testing out the service.
|
5
|
+
|
6
|
+
|
7
|
+
Scenario: The specified project does not exist on CodeFumes.com
|
8
|
+
When I run "#{@bin_path}/fumes delete -p bad-public-key"
|
9
|
+
Then the output should contain "Not Found"
|
10
|
+
And the exit status should be 0
|
11
|
+
|
12
|
+
Scenario: Attempting to delete a project without having an API key entry in the CodeFumes config file
|
13
|
+
Given I have cloned and synchronized 1 project
|
14
|
+
And I have claimed the project
|
15
|
+
When I delete the project
|
16
|
+
Then the output should contain 1 successful delete messages
|
17
|
+
And the exit status should be 0
|
18
|
+
|
19
|
+
Scenario: Deleting one of multiple projects in your CodeFumes config file
|
20
|
+
Given I have cloned and synchronized 2 projects
|
21
|
+
And I have claimed the 1st project
|
22
|
+
When I delete the 1st project
|
23
|
+
Then the output should contain 1 successful delete messages
|
24
|
+
And the exit status should be 0
|
25
|
+
|
26
|
+
Scenario: Releasing all projects in your CodeFumes config file
|
27
|
+
Given valid user credentials have been stored in the CodeFumes config file
|
28
|
+
And I have cloned and synchronized 2 projects
|
29
|
+
And I run "#{@bin_path}/fumes claim -a"
|
30
|
+
When I run "#{@bin_path}/fumes delete -a"
|
31
|
+
Then the output should contain 2 successful delete messages
|
32
|
+
And the exit status should be 0
|
@@ -0,0 +1,50 @@
|
|
1
|
+
Feature: Claiming a project
|
2
|
+
As the owner of a project, the process of relinquishing ownership
|
3
|
+
of a project must be both available and simple.
|
4
|
+
|
5
|
+
|
6
|
+
Scenario: Specified project does not exist on CodeFumes.com
|
7
|
+
Given valid user credentials have been stored in the CodeFumes config file
|
8
|
+
When I run "#{@bin_path}/fumes release -p bad-public-key"
|
9
|
+
Then the output should contain "Not Found"
|
10
|
+
And the exit status should be 0
|
11
|
+
|
12
|
+
Scenario: Attempting to claim a project without having an API key entry in the CodeFumes config file
|
13
|
+
And I have cloned and synchronized 1 project
|
14
|
+
And I have claimed the project
|
15
|
+
When I release the project
|
16
|
+
Then the output should contain instructions about storing your API key
|
17
|
+
And the exit status should be 3
|
18
|
+
|
19
|
+
Scenario: Attempting to release a project with an invalid API key entry in the user's CodeFumes config file
|
20
|
+
Given invalid user credentials have been stored in the CodeFumes config file
|
21
|
+
And I have cloned and synchronized 1 project
|
22
|
+
And I have claimed the project
|
23
|
+
And invalid user credentials have been stored in the CodeFumes config file
|
24
|
+
When I release the project
|
25
|
+
Then the output should contain "Denied"
|
26
|
+
And the exit status should be 0
|
27
|
+
|
28
|
+
Scenario: Releasing a project using the key stored in a CodeFumes project directory
|
29
|
+
Given valid user credentials have been stored in the CodeFumes config file
|
30
|
+
And I have cloned and synchronized 1 project
|
31
|
+
And I have claimed the project
|
32
|
+
When I release the project
|
33
|
+
Then the output should contain "Success"
|
34
|
+
And the exit status should be 0
|
35
|
+
|
36
|
+
Scenario: Releasing one of multiple projects in your CodeFumes config file
|
37
|
+
Given valid user credentials have been stored in the CodeFumes config file
|
38
|
+
And I have cloned and synchronized 2 projects
|
39
|
+
And I have claimed the 1st project
|
40
|
+
When I release the 1st project
|
41
|
+
Then the output should contain 1 successful release message
|
42
|
+
And the exit status should be 0
|
43
|
+
|
44
|
+
Scenario: Releasing all projects in your CodeFumes config file
|
45
|
+
Given valid user credentials have been stored in the CodeFumes config file
|
46
|
+
And I have cloned and synchronized 2 projects
|
47
|
+
And I run "#{@bin_path}/fumes claim -a"
|
48
|
+
When I run "#{@bin_path}/fumes release -a"
|
49
|
+
Then the output should contain 2 successful release messages
|
50
|
+
And the exit status should be 0
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# still a super-hack...but at least it's not duplicated, right?
|
2
|
+
# ...
|
3
|
+
# ...right?
|
4
|
+
def output_message_qty(action)
|
5
|
+
combined_output.scan(/#{action}\.\.\.'.*': Success/).count
|
6
|
+
end
|
7
|
+
|
8
|
+
def clone_fixture_repo_into(dir_name)
|
9
|
+
Given "I run \"git clone git@github.com:cosyn/git_fixture_repository.git #{dir_name}\""
|
10
|
+
end
|
11
|
+
|
12
|
+
# TODO: Get a better way of testing this...output is horrible
|
13
|
+
Then /^the output should contain (\d+) successful claim message[s]?$/ do |count|
|
14
|
+
output_message_qty("Claiming").should == count.to_i
|
15
|
+
end
|
16
|
+
|
17
|
+
# TODO: Get a better way of testing this...output is horrible
|
18
|
+
Then /^the output should contain (\d+) successful release message[s]?$/ do |count|
|
19
|
+
output_message_qty("Releasing").should == count.to_i
|
20
|
+
end
|
21
|
+
|
22
|
+
# TODO: Get a better way of testing this...output is horrible
|
23
|
+
Then /^the output should contain (\d+) successful delete message[s]?$/ do |count|
|
24
|
+
output_message_qty("Deleting").should == count.to_i
|
25
|
+
end
|
26
|
+
|
27
|
+
Then /^the output should contain instructions about storing your API key$/ do
|
28
|
+
Then "the output should contain \"fumes setup\""
|
29
|
+
end
|
30
|
+
|
31
|
+
Given /^I have cloned and synchronized (\d+) project[s]?$/ do |qty|
|
32
|
+
(1..qty.to_i).each do |index|
|
33
|
+
dir_name = "project_#{index}"
|
34
|
+
clone_fixture_repo_into(dir_name)
|
35
|
+
And "I synchronize project #{index}"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
Given /^I have cloned (\d+) project[s]?$/ do |qty|
|
40
|
+
(1..qty.to_i).each do |index|
|
41
|
+
dir_name = "project_#{index}"
|
42
|
+
clone_fixture_repo_into(dir_name)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
When /^I (?:have )?synchronize[d]? project (\d+)$/ do |index|
|
47
|
+
When "I cd to \"project_#{index}/\""
|
48
|
+
And "I run \"#{@bin_path}/fumes sync\""
|
49
|
+
And "I cd to \"../\""
|
50
|
+
end
|
51
|
+
|
52
|
+
# convenience step...assumes only one project
|
53
|
+
When /^I (?:have)?synchronize[d]? the project$/ do
|
54
|
+
When "I synchronize project 1"
|
55
|
+
end
|
56
|
+
|
57
|
+
Given /^I (?:have )?claim(?:ed)? the (\d+)st project$/ do |index|
|
58
|
+
dir_name = "project_#{index}"
|
59
|
+
And "I cd to \"#{dir_name}/\""
|
60
|
+
And "I run \"#{@bin_path}/fumes claim\""
|
61
|
+
And "I cd to \"../\""
|
62
|
+
end
|
63
|
+
|
64
|
+
# convenience step...assumes only one project
|
65
|
+
Given /^I (?:have )?claim(?:ed)? the project$/ do
|
66
|
+
Given "I have claimed the 1st project"
|
67
|
+
end
|
68
|
+
|
69
|
+
Given /^I (?:have )?release[d]? the (\d+)(?:st|nd|rd|th) project$/ do |index|
|
70
|
+
dir_name = "project_#{index}"
|
71
|
+
And "I cd to \"#{dir_name}/\""
|
72
|
+
And "I run \"#{@bin_path}/fumes release\""
|
73
|
+
And "I cd to \"../\""
|
74
|
+
end
|
75
|
+
|
76
|
+
# TODO: Refactor w/ other actions
|
77
|
+
Given /^I (?:have )?delete[d]? the (\d+)(?:st|nd|rd|th) project$/ do |index|
|
78
|
+
dir_name = "project_#{index}"
|
79
|
+
And "I cd to \"#{dir_name}/\""
|
80
|
+
And "I run \"#{@bin_path}/fumes delete\""
|
81
|
+
And "I cd to \"../\""
|
82
|
+
end
|
83
|
+
|
84
|
+
# convenience step...assumes only one project
|
85
|
+
Given /^I (?:have )?delete(?:ed)? the project$/ do
|
86
|
+
Given "I have deleted the 1st project"
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
# convenience step...assumes only one project
|
91
|
+
Given /^I (?:have )?release[d]? the project$/ do
|
92
|
+
Given "I have released the 1st project"
|
93
|
+
end
|
94
|
+
|
95
|
+
Then /^the API key in the config file should be ("[^"]*"|cleared)$/ do |api_key_value|
|
96
|
+
expected_value = api_key_value == 'cleared' ? nil : api_key_value.gsub(/"/,'')
|
97
|
+
ConfigFile.api_key.should == expected_value
|
98
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
Given /^this project is active project folder/ do
|
2
|
+
@active_project_folder = File.expand_path(File.dirname(__FILE__) + "/../..")
|
3
|
+
end
|
4
|
+
|
5
|
+
Given /^env variable \$([\w_]+) set to "(.*)"/ do |env_var, value|
|
6
|
+
ENV[env_var] = value
|
7
|
+
end
|
8
|
+
|
9
|
+
Given /"(.*)" folder is deleted/ do |folder|
|
10
|
+
in_project_folder { FileUtils.rm_rf folder }
|
11
|
+
end
|
12
|
+
|
13
|
+
When /^I invoke "(.*)" generator with arguments "(.*)"$/ do |generator, arguments|
|
14
|
+
@stdout = StringIO.new
|
15
|
+
in_project_folder do
|
16
|
+
if Object.const_defined?("APP_ROOT")
|
17
|
+
APP_ROOT.replace(FileUtils.pwd)
|
18
|
+
else
|
19
|
+
APP_ROOT = FileUtils.pwd
|
20
|
+
end
|
21
|
+
run_generator(generator, arguments.split(' '), SOURCES, :stdout => @stdout)
|
22
|
+
end
|
23
|
+
File.open(File.join(@tmp_root, "generator.out"), "w") do |f|
|
24
|
+
@stdout.rewind
|
25
|
+
f << @stdout.read
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
When /^I run executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
30
|
+
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
31
|
+
in_project_folder do
|
32
|
+
system "#{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
When /^I run project executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
37
|
+
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
38
|
+
in_project_folder do
|
39
|
+
system "ruby #{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
When /^I run local executable "(.*)" with arguments "(.*)"/ do |executable, arguments|
|
44
|
+
@stdout = File.expand_path(File.join(@tmp_root, "executable.out"))
|
45
|
+
executable = File.expand_path(File.join(File.dirname(__FILE__), "/../../bin", executable))
|
46
|
+
in_project_folder do
|
47
|
+
system "ruby #{executable} #{arguments} > #{@stdout} 2> #{@stdout}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
When /^I invoke task "rake (.*)"/ do |task|
|
52
|
+
@stdout = File.expand_path(File.join(@tmp_root, "tests.out"))
|
53
|
+
in_project_folder do
|
54
|
+
system "rake #{task} --trace > #{@stdout} 2> #{@stdout}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
Then /^folder "(.*)" (is|is not) created/ do |folder, is|
|
59
|
+
in_project_folder do
|
60
|
+
File.exists?(folder).should(is == 'is' ? be_true : be_false)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
Then /^file "(.*)" (is|is not) created/ do |file, is|
|
65
|
+
in_project_folder do
|
66
|
+
File.exists?(file).should(is == 'is' ? be_true : be_false)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
Then /^file with name matching "(.*)" is created/ do |pattern|
|
71
|
+
in_project_folder do
|
72
|
+
Dir[pattern].should_not be_empty
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
Then /^file "(.*)" contents (does|does not) match \/(.*)\// do |file, does, regex|
|
77
|
+
in_project_folder do
|
78
|
+
actual_output = File.read(file)
|
79
|
+
(does == 'does') ?
|
80
|
+
actual_output.should(match(/#{regex}/)) :
|
81
|
+
actual_output.should_not(match(/#{regex}/))
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
Then /gem file "(.*)" and generated file "(.*)" should be the same/ do |gem_file, project_file|
|
86
|
+
File.exists?(gem_file).should be_true
|
87
|
+
File.exists?(project_file).should be_true
|
88
|
+
gem_file_contents = File.read(File.dirname(__FILE__) + "/../../#{gem_file}")
|
89
|
+
project_file_contents = File.read(File.join(@active_project_folder, project_file))
|
90
|
+
project_file_contents.should == gem_file_contents
|
91
|
+
end
|
92
|
+
|
93
|
+
Then /^(does|does not) invoke generator "(.*)"$/ do |does_invoke, generator|
|
94
|
+
actual_output = File.read(@stdout)
|
95
|
+
does_invoke == "does" ?
|
96
|
+
actual_output.should(match(/dependency\s+#{generator}/)) :
|
97
|
+
actual_output.should_not(match(/dependency\s+#{generator}/))
|
98
|
+
end
|
99
|
+
|
100
|
+
Then /help options "(.*)" and "(.*)" are displayed/ do |opt1, opt2|
|
101
|
+
actual_output = File.read(@stdout)
|
102
|
+
actual_output.should match(/#{opt1}/)
|
103
|
+
actual_output.should match(/#{opt2}/)
|
104
|
+
end
|
105
|
+
|
106
|
+
Then /^I should see "([^\"]*)"$/ do |text|
|
107
|
+
actual_output = File.read(@stdout)
|
108
|
+
actual_output.should contain(text)
|
109
|
+
end
|
110
|
+
|
111
|
+
Then /^I should see$/ do |text|
|
112
|
+
actual_output = File.read(@stdout)
|
113
|
+
actual_output.should contain(text)
|
114
|
+
end
|
115
|
+
|
116
|
+
Then /^I should not see$/ do |text|
|
117
|
+
actual_output = File.read(@stdout)
|
118
|
+
actual_output.should_not contain(text)
|
119
|
+
end
|
120
|
+
|
121
|
+
Then /^I should see exactly$/ do |text|
|
122
|
+
actual_output = File.read(@stdout)
|
123
|
+
actual_output.should == text
|
124
|
+
end
|
125
|
+
|
126
|
+
Then /^I should see all (\d+) tests pass/ do |expected_test_count|
|
127
|
+
expected = %r{^#{expected_test_count} tests, \d+ assertions, 0 failures, 0 errors}
|
128
|
+
actual_output = File.read(@stdout)
|
129
|
+
actual_output.should match(expected)
|
130
|
+
end
|
131
|
+
|
132
|
+
Then /^I should see all (\d+) examples pass/ do |expected_test_count|
|
133
|
+
expected = %r{^#{expected_test_count} examples?, 0 failures}
|
134
|
+
actual_output = File.read(@stdout)
|
135
|
+
actual_output.should match(expected)
|
136
|
+
end
|
137
|
+
|
138
|
+
Then /^yaml file "(.*)" contains (\{.*\})/ do |file, yaml|
|
139
|
+
in_project_folder do
|
140
|
+
yaml = eval yaml
|
141
|
+
YAML.load(File.read(file)).should == yaml
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
Then /^Rakefile can display tasks successfully/ do
|
146
|
+
@stdout = File.expand_path(File.join(@tmp_root, "rakefile.out"))
|
147
|
+
in_project_folder do
|
148
|
+
system "rake -T > #{@stdout} 2> #{@stdout}"
|
149
|
+
end
|
150
|
+
actual_output = File.read(@stdout)
|
151
|
+
actual_output.should match(/^rake\s+\w+\s+#\s.*/)
|
152
|
+
end
|
153
|
+
|
154
|
+
Then /^task "rake (.*)" is executed successfully/ do |task|
|
155
|
+
@stdout.should_not be_nil
|
156
|
+
actual_output = File.read(@stdout)
|
157
|
+
actual_output.should_not match(/^Don't know how to build task '#{task}'/)
|
158
|
+
actual_output.should_not match(/Error/i)
|
159
|
+
end
|
160
|
+
|
161
|
+
Then /^gem spec key "(.*)" contains \/(.*)\// do |key, regex|
|
162
|
+
in_project_folder do
|
163
|
+
gem_file = Dir["pkg/*.gem"].first
|
164
|
+
gem_spec = Gem::Specification.from_yaml(`gem spec #{gem_file}`)
|
165
|
+
spec_value = gem_spec.send(key.to_sym)
|
166
|
+
spec_value.to_s.should match(/#{regex}/)
|
167
|
+
end
|
168
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Given /^I am in the CodeFumes gem's root directory$/ do
|
2
|
+
cd("/" + File.expand_path(__FILE__) + "/../")
|
3
|
+
end
|
4
|
+
|
5
|
+
Given /^(in)?valid user credentials have been stored in the CodeFumes config file$/ do |invalid_text|
|
6
|
+
# Fragile, as this user is not set up to be re-added after wiping test db on CodeFumes.com
|
7
|
+
# TODO: update deployment for test site to reload this information:
|
8
|
+
# login: test-user
|
9
|
+
# password: password
|
10
|
+
# email: test.user@codefumes.com
|
11
|
+
# api_key: eX2Kue_6YoEIWAvV1VCx
|
12
|
+
|
13
|
+
unless ConfigFile.path.match(/#{File.expand_path(@tmp_root)}/)
|
14
|
+
raise "###NOTE### ConfigFile path not set to use temp file. Check CODEFUMES_CONFIG_FILE settings!"
|
15
|
+
end
|
16
|
+
|
17
|
+
api_key = invalid_text.blank? ? 'eX2Kue_6YoEIWAvV1VCx' : 'invalid-key-here'
|
18
|
+
ConfigFile.save_credentials(api_key)
|
19
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
Feature: Storing a User's API key
|
2
|
+
Adding an API key to a user's CodeFumes config file allows
|
3
|
+
them to perform actions which require user-authentication,
|
4
|
+
such as associating a project with an account.
|
5
|
+
|
6
|
+
|
7
|
+
Scenario: Issuing 'api-key' without an argument
|
8
|
+
When I run "#{@bin_path}/fumes api-key"
|
9
|
+
Then it should fail with:
|
10
|
+
"""
|
11
|
+
No API key specified
|
12
|
+
"""
|
13
|
+
And the exit status should be 5
|
14
|
+
|
15
|
+
Scenario: Issuing 'api-key' with an argument
|
16
|
+
When I run "#{@bin_path}/fumes api-key userkey"
|
17
|
+
Then it should pass with:
|
18
|
+
"""
|
19
|
+
Your API key has been saved to your CodeFumes config file
|
20
|
+
"""
|
21
|
+
And the API key in the config file should be "userkey"
|
22
|
+
And the exit status should be 0
|
23
|
+
|
24
|
+
Scenario: Issuing 'api-key' with the --clear flag
|
25
|
+
When I run "#{@bin_path}/fumes api-key --clear"
|
26
|
+
Then it should pass with:
|
27
|
+
"""
|
28
|
+
Your API key has been removed from your CodeFumes config file
|
29
|
+
"""
|
30
|
+
And the API key in the config file should be cleared
|
31
|
+
And the exit status should be 0
|
32
|
+
|
33
|
+
Scenario: Issuing 'api-key' with the --clear flag and an argument
|
34
|
+
When I run "#{@bin_path}/fumes api-key userkey1"
|
35
|
+
And I run "#{@bin_path}/fumes api-key --clear userkey2"
|
36
|
+
Then it should pass with:
|
37
|
+
"""
|
38
|
+
Your API key has been removed from your CodeFumes config file
|
39
|
+
"""
|
40
|
+
And the API key in the config file should be cleared
|
41
|
+
And the exit status should be 0
|