codefumes 0.1.10 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. data/Gemfile +19 -0
  2. data/Gemfile.lock +135 -0
  3. data/History.txt +12 -0
  4. data/LICENSE +20 -0
  5. data/Manifest.txt +40 -19
  6. data/README.txt +11 -29
  7. data/Rakefile +15 -10
  8. data/bin/fumes +214 -0
  9. data/config/website.yml +2 -0
  10. data/cucumber.yml +2 -0
  11. data/features/claiming_a_project.feature +46 -0
  12. data/features/deleting_a_project.feature +32 -0
  13. data/features/releasing_a_project.feature +50 -0
  14. data/features/step_definitions/cli_steps.rb +98 -0
  15. data/features/step_definitions/common_steps.rb +168 -0
  16. data/features/step_definitions/filesystem_steps.rb +19 -0
  17. data/features/storing_user_api_key.feature +41 -0
  18. data/features/support/common.rb +29 -0
  19. data/features/support/env.rb +24 -0
  20. data/features/support/matchers.rb +11 -0
  21. data/features/synchronizing_repository_with_project.feature +33 -0
  22. data/lib/codefumes.rb +10 -8
  23. data/lib/codefumes/api.rb +20 -11
  24. data/lib/codefumes/api/build.rb +139 -0
  25. data/lib/codefumes/api/claim.rb +74 -0
  26. data/lib/codefumes/api/commit.rb +150 -0
  27. data/lib/codefumes/api/payload.rb +93 -0
  28. data/lib/codefumes/api/project.rb +158 -0
  29. data/lib/codefumes/cli_helpers.rb +54 -0
  30. data/lib/codefumes/config_file.rb +3 -2
  31. data/lib/codefumes/errors.rb +21 -0
  32. data/lib/codefumes/exit_codes.rb +10 -0
  33. data/lib/codefumes/harvester.rb +113 -0
  34. data/lib/codefumes/quick_build.rb +43 -0
  35. data/lib/codefumes/quick_metric.rb +20 -0
  36. data/lib/codefumes/source_control.rb +137 -0
  37. data/lib/integrity_notifier/codefumes.haml +11 -0
  38. data/lib/integrity_notifier/codefumes.rb +62 -0
  39. data/spec/codefumes/{build_spec.rb → api/build_spec.rb} +14 -24
  40. data/spec/codefumes/{claim_spec.rb → api/claim_spec.rb} +42 -3
  41. data/spec/codefumes/{commit_spec.rb → api/commit_spec.rb} +34 -24
  42. data/spec/codefumes/api/payload_spec.rb +148 -0
  43. data/spec/codefumes/api/project_spec.rb +286 -0
  44. data/spec/codefumes/api_spec.rb +38 -15
  45. data/spec/codefumes/config_file_spec.rb +69 -13
  46. data/spec/codefumes/harvester_spec.rb +118 -0
  47. data/spec/codefumes/source_control_spec.rb +199 -0
  48. data/spec/codefumes_service_helpers.rb +23 -19
  49. data/spec/fixtures/sample_project_dirs/no_scm/description +4 -0
  50. data/spec/spec_helper.rb +1 -0
  51. data/tasks/cucumber.rake +11 -0
  52. metadata +145 -60
  53. data/bin/cf_claim_project +0 -9
  54. data/bin/cf_release_project +0 -10
  55. data/bin/cf_store_credentials +0 -10
  56. data/lib/cf_claim_project/cli.rb +0 -95
  57. data/lib/cf_release_project/cli.rb +0 -76
  58. data/lib/cf_store_credentials/cli.rb +0 -50
  59. data/lib/codefumes/build.rb +0 -131
  60. data/lib/codefumes/claim.rb +0 -57
  61. data/lib/codefumes/commit.rb +0 -144
  62. data/lib/codefumes/payload.rb +0 -103
  63. data/lib/codefumes/project.rb +0 -129
  64. data/spec/cf_claim_project/cli_spec.rb +0 -17
  65. data/spec/cf_release_project/cli_spec.rb +0 -41
  66. data/spec/cf_store_credentials/cli_spec.rb +0 -28
  67. data/spec/codefumes/payload_spec.rb +0 -155
  68. data/spec/codefumes/project_spec.rb +0 -274
@@ -1,155 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
2
-
3
- module PayloadSpecHelper
4
- end
5
-
6
- describe "Payload" do
7
- include CodeFumesServiceHelpers::Payload
8
-
9
- after(:all) do
10
- FakeWeb.allow_net_connect = false
11
- FakeWeb.clean_registry
12
- end
13
-
14
- before(:each) do
15
- setup_fixture_base
16
- @payload = Payload.new(:public_key => @pub_key, :private_key => @priv_key, :content => {:commits => @commit_data})
17
- @payload_query = {:payload => {:commits => @commit_data}}
18
- @basic_auth_params = {:username => @pub_key, :password => @priv_key}
19
- end
20
-
21
- describe "save" do
22
- it "sets basic auth with the public and private key" do
23
- register_create_uri(["401", "Unauthorized"], "")
24
- Payload.should_receive(:post).with("/projects/#{@project.public_key}/payloads", :query => @payload_query, :basic_auth => @basic_auth_params).and_return(mock("response", :code => 401))
25
- @payload.save
26
- end
27
-
28
- context "with valid parameters" do
29
- before(:each) do
30
- register_create_uri(["201", "Created"])
31
- end
32
-
33
- it "sets a value for 'created_at'" do
34
- @payload.created_at.should == nil
35
- @payload.save.should == true
36
- @payload.created_at.should_not == nil
37
- end
38
- end
39
-
40
- context "with Unauthorized response" do
41
- before(:each) do
42
- register_create_uri(["401", "Unauthorized"], "")
43
- end
44
-
45
- it "does not set 'created_at'" do
46
- @payload.created_at.should == nil
47
- @payload.save.should == false
48
- @payload.created_at.should == nil
49
- end
50
- end
51
-
52
- context "when the payload does not have any content" do
53
- before(:each) do
54
- @payload = Payload.new(:public_key => @project.public_key, :content => {:commits => ""})
55
- end
56
-
57
- it "returns true without attempting to save to the site" do
58
- Payload.should_not_receive(:post)
59
- @payload.save.should == true
60
- end
61
-
62
- it "does not set the value of created_at" do
63
- @payload.save
64
- @payload.created_at.should == nil
65
- end
66
- end
67
-
68
- context "with invalid parameters" do
69
- before(:each) do
70
- register_create_uri
71
- end
72
-
73
- it "does not set a value for 'created_at'" do
74
- @payload.save.should == false
75
- @payload.created_at.should == nil
76
- end
77
- end
78
- end
79
-
80
- describe "calling the class method" do
81
- describe "'prepare'" do
82
- context "when supplying nil content" do
83
- it "returns an empty array" do
84
- Payload.prepare(nil).should == []
85
- end
86
- end
87
-
88
- context "when supplying an empty Hash" do
89
- it "returns an empty array" do
90
- Payload.prepare({}).should == []
91
- end
92
- end
93
-
94
- context "when supplying hash does not contain a :public_key key" do
95
- it "raises an ArgumentError exception" do
96
- lambda {Payload.prepare({:commits => []})}.should raise_error(ArgumentError)
97
- end
98
- end
99
-
100
- context "when supplying hash does not contain a :commits key" do
101
- it "raises an ArgumentError exception" do
102
- lambda {Payload.prepare({:public_key => "pub_key1"})}.should raise_error(ArgumentError)
103
- end
104
- end
105
-
106
- context "when supplying a hash with less than 4,000 characters" do
107
- before(:each) do
108
- single_commit_ex = {:identifier => "92dd08477f0ca144ee0f12ba083760dd810760a2_000"}
109
- commit_count = 4000 / single_commit_ex.to_s.length
110
- commits = commit_count.times.map do |index|
111
- {:identifier => "92dd08477f0ca144ee0f12ba083760dd810760a2_#{index}"}
112
- end
113
- @prepared = Payload.prepare({:public_key => 'fjsk', :private_key => 'something_super_secret', :content => {:commits => commits}})
114
- end
115
-
116
- it "returns an Array with a single payload element" do
117
- @prepared.should be_instance_of(Array)
118
- @prepared.size.should == 1
119
- @prepared.first.should be_instance_of(Payload)
120
- end
121
-
122
- it "sets the private_key on all payloads" do
123
- @prepared.each do |payload|
124
- payload.project_private_key.should == 'something_super_secret'
125
- end
126
- end
127
- end
128
-
129
- context "when supplying a hash with approximately 15,000 characters" do
130
- before(:each) do
131
- single_commit_ex = {:identifier => "92dd08477f0ca144ee0f12ba083760dd810760a2_000"}
132
- commit_count = 15000 / single_commit_ex.to_s.length + 1
133
- commits = commit_count.times.map do |index|
134
- {:identifier => "92dd08477f0ca144ee0f12ba083760dd810760a2_#{index}"}
135
- end
136
- raw_payload = {:public_key => 'fjsk', :private_key => 'something_super_secret', :content => {:commits => commits}}
137
- @prepared = Payload.prepare(raw_payload)
138
- end
139
-
140
- it "returns an Array with a four payload elements" do
141
- @prepared.should be_instance_of(Array)
142
- @prepared.size.should == 4
143
- all_are_payloads = @prepared.all? {|chunk| chunk.instance_of?(Payload)}
144
- all_are_payloads.should == true
145
- end
146
-
147
- it "sets the private_key on all payloads" do
148
- @prepared.each do |payload|
149
- payload.project_private_key.should == 'something_super_secret'
150
- end
151
- end
152
- end
153
- end
154
- end
155
- end
@@ -1,274 +0,0 @@
1
- require File.dirname(__FILE__) + '/../spec_helper.rb'
2
-
3
- describe "Project" do
4
- include CodeFumesServiceHelpers::Project
5
-
6
- before(:each) do
7
- setup_fixture_base
8
- end
9
-
10
- after(:all) do
11
- FakeWeb.allow_net_connect = false
12
- FakeWeb.clean_registry
13
- end
14
-
15
- describe "save" do
16
- context "with valid parameters" do
17
- context "when the public key has not been taken yet (or no key provided)" do
18
- before(:each) do
19
- register_no_param_create_uri
20
- end
21
-
22
- [ :public_key,
23
- :private_key,
24
- :short_uri,
25
- :community_uri,
26
- :api_uri].each do |method_name|
27
- it "sets the '#{method_name.to_s}'" do
28
- project = CodeFumes::Project.new
29
- project.send(method_name).should be_nil
30
- project.save
31
- project.send(method_name).should_not be_nil
32
- end
33
- end
34
- end
35
-
36
- context "when the public key has already been taken" do
37
- context "when response is success" do
38
- before(:each) do
39
- @project.name = @updated_name
40
- register_show_uri
41
- register_update_uri
42
- @project.stub!(:exists?).and_return(true)
43
- @project.save.should be_true
44
- end
45
-
46
- it "sets basic auth with the public and private key" do
47
- Project.should_receive(:put).with("/projects/#{@project.public_key}", :query => {:project => {:name => @updated_name}}, :basic_auth => {:username => @project.public_key, :password => @project.private_key}).and_return(mock("response", :code => 401))
48
- @project.save
49
- end
50
-
51
- it "updates the value of 'name' for the project associated with the supplied public key" do
52
- # This seems like a pointless assertion, since it's being set in the before block, but it
53
- # wouldn't be true if request was not successful, as #name is updated w/ the content
54
- # returned in the response
55
- @project.name.should == @updated_name
56
- end
57
-
58
- [ :public_key,
59
- :private_key,
60
- :short_uri,
61
- :community_uri,
62
- :name,
63
- :api_uri].each do |method_name|
64
- it "sets the '#{method_name.to_s}'" do
65
- @project.send(method_name).should_not be_nil
66
- end
67
- end
68
- end
69
-
70
- context "respons is Unauthorized" do
71
- before(:each) do
72
- @updated_name = "different_name"
73
- @project = CodeFumes::Project.new(:public_key => 'existing_public_key', :private_key => 'bad_key', :name => @updated_name)
74
- FakeWeb.register_uri(:put, "http://#{@project.public_key}:#{@project.private_key}@codefumes.com/api/v1/xml/projects/existing_public_key?project[name]=#{@project.name}",
75
- :status => ["401", "Unauthorized"])
76
- @project.stub!(:exists?).and_return(true)
77
- end
78
- it "returns false" do
79
- @project.save.should be_false
80
- end
81
- end
82
- end
83
- end
84
-
85
- context "with invalid parameters" do
86
- before(:each) do
87
- register_show_uri(["404", "Not found"], "")
88
- register_no_param_create_uri(["422", "Unprocessable Entity"], "")
89
- end
90
-
91
- it "does not set the 'private_key'" do
92
- project = Project.new
93
- project.save.should be_false
94
- project.private_key.should be_nil
95
- end
96
- end
97
- end
98
-
99
- context "delete" do
100
- before(:each) do
101
- FakeWeb.register_uri( :delete, @authd_project_api_uri,
102
- :status => ["200", "Successful"],
103
- :body => "")
104
- end
105
-
106
- it "sets basic auth with the public and private key" do
107
- Project.should_receive(:delete).with("/projects/#{@project.public_key}", :basic_auth => {:username => @project.public_key, :password => @project.private_key}).and_return(mock("response", :code => 401))
108
- @project.delete
109
- end
110
-
111
- context "with Sucessful response" do
112
- it "returns true" do
113
- @project.delete.should be_true
114
- end
115
- end
116
-
117
- context "with Unauthorized response" do
118
- it "returns false when invalid Unauthorized response is received" do
119
- register_delete_uri(["401", "Unauthorized"], "")
120
- @project.delete.should be_false
121
- end
122
- end
123
- end
124
-
125
- describe "exists?" do
126
- context "when the specified public_key has been reserved already" do
127
- it "returns true" do
128
- register_show_uri
129
- Project.new(:public_key => @pub_key).exists?.should be_true
130
- end
131
- end
132
-
133
- context "when the public_key is not set" do
134
- it "returns false when the public key is nil" do
135
- Project.new.exists?.should be_false
136
- end
137
-
138
- it "returns false when the public key is an empty string" do
139
- Project.new(:public_key => "").exists?.should be_false
140
- end
141
- end
142
-
143
- context "when the specified public_key is available" do
144
- before(:each) do
145
- register_show_uri(["404", "Not Found"], "")
146
- end
147
-
148
- it "returns false" do
149
- Project.new(:public_key => @pub_key).exists?.should be_false
150
- end
151
- end
152
- end
153
-
154
- describe "to_config" do
155
- before(:each) do
156
- register_show_uri(["404", "Not Found"], "")
157
- register_create_uri
158
- @project.save
159
- end
160
-
161
- it "returns an object keyed by the project's public_key as a symbol" do
162
- @project.to_config.should include(@project.public_key.to_sym)
163
- end
164
-
165
- context "the content under the project's public_key element" do
166
- [:private_key, :api_uri, :short_uri].each do |project_attribute|
167
- it "includes a key-value pair of ':#{project_attribute.to_s} => [project's #{project_attribute.to_s}]'" do
168
- value = @project.send(project_attribute)
169
- @project.to_config[@project.public_key.to_sym].should include(project_attribute => value)
170
- end
171
- end
172
- end
173
-
174
- it "doesn't include the private_key in the hash if it is nil" do
175
- public_key = "key_to_happiness"
176
- Project.new(:public_key => public_key).to_config[public_key.to_sym].should_not have_key(:private_key)
177
- end
178
- end
179
-
180
- describe "claim" do
181
- before(:each) do
182
- @project = Project.new(:public_key => 'public_key_value', :private_key => 'private_key_value')
183
- @api_key = "USERS_API_KEY"
184
- ConfigFile.stub!(:credentials).and_return({:api_key => @api_key})
185
- end
186
-
187
- it "delegates the request to the Claim class" do
188
- Claim.should_receive(:create).with(@project, @api_key)
189
- @project.claim
190
- end
191
- end
192
-
193
- describe "protected attributes" do
194
- [:api_uri, :community_uri, :short_uri].each do |attribute_name|
195
- it "values passed in during initiazation for '#{attribute_name.to_s}' are silently ignored" do
196
- p = Project.new(attribute_name => Time.now.to_s)
197
- p.send(attribute_name).should be_nil
198
- end
199
-
200
- it "calling '#{attribute_name.to_s}= [value]' is not supported" do
201
- p = Project.new
202
- lambda {p.send("#{attribute_name}=", "my_value")}.should raise_error
203
- end
204
- end
205
- end
206
-
207
- describe "accessible attributes" do
208
- before(:each) do
209
- @value = 'my_value'
210
- end
211
-
212
- [:public_key, :name].each do |attribute_name|
213
- it "values for '#{attribute_name.to_s}' are allowed to be modified by the client" do
214
- p = Project.new(attribute_name => @value )
215
- p.send(attribute_name).should == @value
216
- end
217
- end
218
- end
219
-
220
- describe "calling the class method" do
221
- describe "'find'" do
222
- context "and specifying a public_key which is already associated to a project on the site" do
223
- it "returns an initialized instance of the Project class" do
224
- register_show_uri
225
- expected_config = {
226
- @pub_key.to_sym =>
227
- {
228
- :private_key=>"private_key_value",
229
- :api_uri=>"http://codefumes.com/api/v1/xml/projects/#{@pub_key}.xml",
230
- :short_uri=>"http://codefumes.com/p/#{@pub_key}"
231
- }
232
- }
233
- Project.find(@pub_key).to_config.should == expected_config
234
- end
235
- end
236
-
237
- context "and specifying a public_key which is not associated to any project on the site yet" do
238
- before(:each) do
239
- register_show_uri(["404", "Not Found"], "")
240
- end
241
-
242
- it "returns nil" do
243
- Project.find(@pub_key).should == nil
244
- end
245
- end
246
- end
247
- end
248
-
249
- describe "reinitialize" do
250
- context "when the server has returned a build_status of 'running_build'" do
251
- it "returns 'running'" do
252
- project = Project.new
253
- project.reinitialize!({'build_status' => "running_build"})
254
- project.build_status.should == 'running'
255
- end
256
- end
257
-
258
- context "when the server has returned a build_status of 'nobuilds'" do
259
- it "returns 'nobuilds'" do
260
- project = Project.new
261
- project.reinitialize!({'build_status' => "nobuilds"})
262
- project.build_status.should == 'nobuilds'
263
- end
264
- end
265
-
266
- context "when the server has returned a build_status of ''" do
267
- it "returns nil" do
268
- project = Project.new
269
- project.reinitialize!({'build_status' => ""})
270
- project.build_status.should be_nil
271
- end
272
- end
273
- end
274
- end