sonar_connector 0.8.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +18 -0
  3. data/Rakefile +41 -0
  4. data/VERSION +1 -0
  5. data/bin/sonar-connector +69 -0
  6. data/config/config.example.json +82 -0
  7. data/lib/sonar_connector.rb +40 -0
  8. data/lib/sonar_connector/commands/command.rb +21 -0
  9. data/lib/sonar_connector/commands/commit_seppuku_command.rb +15 -0
  10. data/lib/sonar_connector/commands/increment_status_value_command.rb +14 -0
  11. data/lib/sonar_connector/commands/send_admin_email_command.rb +12 -0
  12. data/lib/sonar_connector/commands/update_disk_usage_command.rb +13 -0
  13. data/lib/sonar_connector/commands/update_status_command.rb +16 -0
  14. data/lib/sonar_connector/config.rb +166 -0
  15. data/lib/sonar_connector/connectors/base.rb +243 -0
  16. data/lib/sonar_connector/connectors/dummy_connector.rb +17 -0
  17. data/lib/sonar_connector/connectors/seppuku_connector.rb +26 -0
  18. data/lib/sonar_connector/consumer.rb +94 -0
  19. data/lib/sonar_connector/controller.rb +164 -0
  20. data/lib/sonar_connector/emailer.rb +16 -0
  21. data/lib/sonar_connector/rspec/spec_helper.rb +61 -0
  22. data/lib/sonar_connector/status.rb +43 -0
  23. data/lib/sonar_connector/utils.rb +39 -0
  24. data/script/console +10 -0
  25. data/spec/sonar_connector/commands/command_spec.rb +34 -0
  26. data/spec/sonar_connector/commands/commit_seppuku_command_spec.rb +25 -0
  27. data/spec/sonar_connector/commands/increment_status_value_command_spec.rb +25 -0
  28. data/spec/sonar_connector/commands/send_admin_email_command_spec.rb +14 -0
  29. data/spec/sonar_connector/commands/update_disk_usage_command_spec.rb +21 -0
  30. data/spec/sonar_connector/commands/update_status_command_spec.rb +24 -0
  31. data/spec/sonar_connector/config_spec.rb +93 -0
  32. data/spec/sonar_connector/connectors/base_spec.rb +207 -0
  33. data/spec/sonar_connector/connectors/dummy_connector_spec.rb +22 -0
  34. data/spec/sonar_connector/connectors/seppuku_connector_spec.rb +37 -0
  35. data/spec/sonar_connector/consumer_spec.rb +116 -0
  36. data/spec/sonar_connector/controller_spec.rb +46 -0
  37. data/spec/sonar_connector/emailer_spec.rb +36 -0
  38. data/spec/sonar_connector/status_spec.rb +78 -0
  39. data/spec/sonar_connector/utils_spec.rb +62 -0
  40. data/spec/spec.opts +2 -0
  41. data/spec/spec_helper.rb +6 -0
  42. metadata +235 -0
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sonar::Connector::DummyConnector do
4
+ before do
5
+ setup_valid_config_file
6
+ end
7
+
8
+ describe "action" do
9
+ before do
10
+ @base_config = Sonar::Connector::Config.load(valid_config_filename)
11
+ @config = {'name'=>'foo', 'repeat_delay'=> 5}
12
+ @connector = Sonar::Connector::DummyConnector.new(@config, @base_config)
13
+ end
14
+
15
+ it "should log a quirky debug message" do
16
+ mock(@connector.log).debug(anything) do |param|
17
+ param.should match(/mumbled incoherently to itself/)
18
+ end
19
+ @connector.action
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sonar::Connector::SeppukuConnector do
4
+ before do
5
+ setup_valid_config_file
6
+ @base_config = Sonar::Connector::Config.load(valid_config_filename)
7
+ @config = {'name'=>'foo', 'repeat_delay'=> 5}
8
+ end
9
+
10
+ describe "parse" do
11
+ it "should set up a run counter" do
12
+ @connector = Sonar::Connector::SeppukuConnector.new(@config, @base_config)
13
+ @connector.run_count.should == 0
14
+ end
15
+ end
16
+
17
+ describe "action" do
18
+ before do
19
+ @connector = Sonar::Connector::SeppukuConnector.new(@config, @base_config)
20
+ @queue = []
21
+ stub(@connector).queue{@queue}
22
+ end
23
+
24
+ it "should not issue seppuku command on 1st execution" do
25
+ stub(Sonar::Connector::CommitSeppukuCommand).new
26
+ @connector.action
27
+ Sonar::Connector::CommitSeppukuCommand.should_not have_received.new
28
+ end
29
+
30
+ it "should issue seppuku command on 2nd execution" do
31
+ stub(Sonar::Connector::CommitSeppukuCommand).new
32
+ @connector.action
33
+ @connector.action
34
+ Sonar::Connector::CommitSeppukuCommand.should have_received.new
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,116 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sonar::Connector::Consumer do
4
+
5
+ describe Sonar::Connector::ExecutionContext do
6
+ before do
7
+ @log = Object.new
8
+ @status = Object.new
9
+ @controller = Object.new
10
+ end
11
+
12
+ describe "initialize" do
13
+ it "should set logger" do
14
+ ec = Sonar::Connector::ExecutionContext.new(:log=>@log)
15
+ ec.log.should == @log
16
+ end
17
+
18
+ it "should set status" do
19
+ ec = Sonar::Connector::ExecutionContext.new(:status=>@status)
20
+ ec.status.should == @status
21
+ end
22
+
23
+ it "should set controller" do
24
+ Sonar::Connector::ExecutionContext.new(:controller=>@controller).controller.should == @controller
25
+ end
26
+ end
27
+ end
28
+
29
+ describe "watch" do
30
+
31
+ # create a new anonymous Sonar::Connector::Command descendant class
32
+ def new_command_class(name)
33
+ new_anon_class(Sonar::Connector::Command, name){
34
+ def initialize(message)
35
+ l = lambda do
36
+ log.info message
37
+ end
38
+ super(l)
39
+ end
40
+ }
41
+ end
42
+
43
+ before do
44
+ setup_valid_config_file
45
+ @controller = Sonar::Connector::Controller.new(valid_config_filename)
46
+ @consumer = Sonar::Connector::Consumer.new(@controller, @controller.config)
47
+ @kommand = new_command_class("DummyCommand")
48
+ @queue = Queue.new
49
+ end
50
+
51
+ it "should execute items on the queue" do
52
+ k1 = @kommand.new("some message")
53
+ k2 = @kommand.new("another message")
54
+
55
+ mock(k1).execute(anything)
56
+ mock(k2).execute(anything)
57
+
58
+ @queue << k1
59
+ @queue << k2
60
+
61
+ # set up the run order
62
+ mock(@consumer) do
63
+ run(){true}
64
+ run(){true}
65
+ run(){false}
66
+ end
67
+
68
+ @consumer.prepare(@queue)
69
+ @consumer.watch
70
+ end
71
+
72
+ it "should handle uncaught exceptions thrown by a command" do
73
+ k1 = @kommand.new("some message")
74
+ k2 = @kommand.new("another message")
75
+
76
+ mock(k1).execute(anything){
77
+ raise "command raised an uncaught exception"
78
+ }
79
+ mock(k2).execute(anything)
80
+
81
+ @queue << k1
82
+ @queue << k2
83
+
84
+ # set up the run order
85
+ mock(@consumer) do
86
+ run(){true}
87
+ run(){true}
88
+ run(){false}
89
+ end
90
+
91
+ @consumer.prepare(@queue)
92
+ @consumer.watch
93
+ end
94
+
95
+ it "should terminate on ThreadTerminator exception" do
96
+ k1 = @kommand.new("some message")
97
+ k2 = @kommand.new("some other message - this will never get processed")
98
+
99
+ mock(k1).execute(anything){
100
+ raise Sonar::Connector::ThreadTerminator.new
101
+ }
102
+
103
+ dont_allow(k2).execute
104
+
105
+ mock.proxy(@consumer).cleanup
106
+
107
+ @queue << k1
108
+ @queue << k2
109
+
110
+ @consumer.prepare(@queue)
111
+ @consumer.watch
112
+ end
113
+
114
+ end
115
+
116
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sonar::Connector::Controller do
4
+
5
+ before do
6
+ setup_valid_config_file
7
+ end
8
+
9
+ describe "new" do
10
+ before do
11
+ @controller = Sonar::Connector::Controller.new(valid_config_filename)
12
+ end
13
+
14
+ it "should assign a logger" do
15
+ @controller.log.should be_instance_of(Logger)
16
+ end
17
+
18
+ it "should assign a queue" do
19
+ @controller.queue.should be_instance_of(Queue)
20
+ end
21
+ end
22
+
23
+ describe "start" do
24
+ before do
25
+
26
+ # Add another connector so we have two in total
27
+ @config_options["connectors"] << {
28
+ "class" => "Sonar::Connector::DummyConnector",
29
+ "name" => "dummy2",
30
+ "repeat_delay" => 10
31
+ }
32
+
33
+ @controller = Sonar::Connector::Controller.new(valid_config_filename)
34
+ @controller.connectors.count.should == 2
35
+ end
36
+
37
+ it "should invoke a thread for each connector plus one for the consumer" do
38
+ t = Object.new
39
+ stub(t).join(){true}
40
+ mock(@controller).endless_sleep(){nil}
41
+ mock(Thread).new().times(3){t} # once per conector and one for the consumer
42
+ @controller.start
43
+ end
44
+ end
45
+
46
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sonar::Connector::Emailer do
4
+ before do
5
+ setup_valid_config_file
6
+ @base_config = Sonar::Connector::Config.load(valid_config_filename)
7
+ @status = Sonar::Connector::Status.new(@base_config)
8
+
9
+ @connector = Object.new
10
+ mock(@connector).name(){ "foo_connector" }
11
+
12
+ ActionMailer::Base.deliveries = []
13
+ ActionMailer::Base.delivery_method.should == :test
14
+ ActionMailer::Base.perform_deliveries.should be_true
15
+ @email = Sonar::Connector::Emailer.create_admin_message(@connector, "the important message")
16
+ end
17
+
18
+ it "should send" do
19
+ lambda{
20
+ Sonar::Connector::Emailer.deliver(@email)
21
+ }.should change{ActionMailer::Base.deliveries.size}.by(1)
22
+ end
23
+
24
+ it "should have correct sender" do
25
+ @email.from.should == @base_config.email_settings["admin_sender"].to_a
26
+ end
27
+
28
+ it "should have correct recipient" do
29
+ @email.to.should == @base_config.email_settings["admin_recipients"].to_a
30
+ end
31
+
32
+ it "should have the message and connector name in the body" do
33
+ @email.body.should match(/foo_connector/)
34
+ @email.body.should match(/the important message/)
35
+ end
36
+ end
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sonar::Connector::Status do
4
+ before do
5
+ setup_valid_config_file
6
+ @base_config = Sonar::Connector::Config.load(valid_config_filename)
7
+ @status = Sonar::Connector::Status.new(@base_config)
8
+ end
9
+
10
+ describe "initialize" do
11
+ it "should load status" do
12
+ @status.send(:status).should be_instance_of(Hash)
13
+ end
14
+ end
15
+
16
+ describe "[]" do
17
+ it "should access the group" do
18
+ @status.set("group", "key", "value")
19
+ @status["group"]["key"].should == "value"
20
+ end
21
+ end
22
+
23
+ describe "[]=" do
24
+ it "should set the group" do
25
+ @status["group"].should be_nil
26
+ @status["group"] = {"key" => "value"}
27
+ @status["group"]["key"].should == "value"
28
+ end
29
+ end
30
+
31
+ describe "load_status" do
32
+ it "should load yml file if it exists" do
33
+ mock(YAML).load_file(@base_config.status_file){ {:foo=>:bar} }
34
+
35
+ @status[:foo].should be_nil
36
+ @status.load_status
37
+ @status[:foo].should == :bar
38
+ end
39
+ end
40
+
41
+ describe "save_status" do
42
+ it "should save serialised status" do
43
+ @status.set "group", "key", "value"
44
+ @status.save_status
45
+ @status.send(:status=, {})
46
+
47
+ @status["group"].should be_nil
48
+ @status.load_status
49
+ @status["group"]["key"].should == "value"
50
+ end
51
+ end
52
+
53
+ describe "set" do
54
+ it "should initialize the group hash if it doesn't exist" do
55
+ @status["group"] = nil
56
+ @status.set "group", "key", "value"
57
+ @status["group"].should be_instance_of(Hash)
58
+ end
59
+
60
+ it "should set key and value" do
61
+ @status["group"].should be_nil
62
+ @status.set("group", "key", "value")
63
+ @status["group"]["key"].should == "value"
64
+ end
65
+
66
+ it "should update the timestamp" do
67
+ now = Time.now
68
+ stub(Time).now{now}
69
+ @status.set("group", "key", "value")
70
+ @status["group"]["last_updated"] = nil
71
+ @status["group"]["last_updated"].should be_nil
72
+
73
+ @status.set("group", "key", "value")
74
+ @status["group"]["last_updated"].should == now.to_s
75
+ end
76
+ end
77
+
78
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe Sonar::Connector::Utils do
4
+ describe "du" do
5
+ before do
6
+ @test_dir = File.join(base_dir, 'test_du_dir')
7
+ FileUtils.mkdir_p @test_dir
8
+ end
9
+
10
+ after do
11
+ FileUtils.rm_rf @test_dir
12
+ end
13
+
14
+ it "should return error if it's not a directory" do
15
+ lambda{
16
+ Sonar::Connector::Utils.du('some bad dir')
17
+ }.should raise_error(/not a directory/)
18
+ end
19
+
20
+ it "should return zero for an empty dir" do
21
+ Dir[ File.join(@test_dir, '*') ].should == []
22
+ Sonar::Connector::Utils.du(@test_dir).should == 0
23
+ end
24
+
25
+ it "should sum up filesizes" do
26
+ sizes = [0, 1, 20, 3000, 40001]
27
+
28
+ # create files of different sizes in the test dir
29
+ sizes.each_with_index do |s,i|
30
+ name = File.join(@test_dir, "#{i}.txt")
31
+ File.open(name, 'w'){|f| f << (0...s).map{65.+(rand(25)).chr}.join }
32
+ end
33
+
34
+ Sonar::Connector::Utils.du(@test_dir).should == sizes.sum
35
+ end
36
+
37
+ it "should glob subdirs" do
38
+ depth = 5
39
+ sizes = [30, 40, 400, 500]
40
+ sizes.each_with_index do |s, i|
41
+ dir = File.join @test_dir, *(0...depth).map{i.to_s}
42
+ FileUtils.mkdir_p dir
43
+ name = File.join dir, 'file.txt'
44
+ File.open(name, 'w'){|f| f << (0...s).map{65.+(rand(25)).chr}.join }
45
+ end
46
+ Sonar::Connector::Utils.du(@test_dir).should == sizes.sum
47
+ end
48
+ end
49
+
50
+ describe "stdout_logger" do
51
+ it "should return a logger" do
52
+ pending
53
+ end
54
+ end
55
+
56
+ describe "disk_logger" do
57
+ it "should return a logger" do
58
+ pending
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format specdoc
@@ -0,0 +1,6 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'sonar_connector'
5
+ require 'sonar_connector/rspec/spec_helper'
6
+
metadata ADDED
@@ -0,0 +1,235 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sonar_connector
3
+ version: !ruby/object:Gem::Version
4
+ hash: 53
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 8
9
+ - 5
10
+ version: 0.8.5
11
+ platform: ruby
12
+ authors:
13
+ - Peter MacRobert
14
+ - Mark Meyer
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2011-03-25 00:00:00 +00:00
20
+ default_executable: sonar-connector
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
23
+ name: actionmailer
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - "="
29
+ - !ruby/object:Gem::Version
30
+ hash: 23
31
+ segments:
32
+ - 2
33
+ - 3
34
+ - 10
35
+ version: 2.3.10
36
+ type: :runtime
37
+ version_requirements: *id001
38
+ - !ruby/object:Gem::Dependency
39
+ name: actionmailer_extensions
40
+ prerelease: false
41
+ requirement: &id002 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ hash: 11
47
+ segments:
48
+ - 0
49
+ - 4
50
+ - 2
51
+ version: 0.4.2
52
+ type: :runtime
53
+ version_requirements: *id002
54
+ - !ruby/object:Gem::Dependency
55
+ name: json_pure
56
+ prerelease: false
57
+ requirement: &id003 !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ hash: 27
63
+ segments:
64
+ - 1
65
+ - 2
66
+ - 2
67
+ version: 1.2.2
68
+ type: :runtime
69
+ version_requirements: *id003
70
+ - !ruby/object:Gem::Dependency
71
+ name: uuidtools
72
+ prerelease: false
73
+ requirement: &id004 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ hash: 9
79
+ segments:
80
+ - 2
81
+ - 1
82
+ - 1
83
+ version: 2.1.1
84
+ type: :runtime
85
+ version_requirements: *id004
86
+ - !ruby/object:Gem::Dependency
87
+ name: sonar_connector_filestore
88
+ prerelease: false
89
+ requirement: &id005 !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ hash: 27
95
+ segments:
96
+ - 0
97
+ - 1
98
+ - 0
99
+ version: 0.1.0
100
+ type: :runtime
101
+ version_requirements: *id005
102
+ - !ruby/object:Gem::Dependency
103
+ name: rspec
104
+ prerelease: false
105
+ requirement: &id006 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ hash: 15
111
+ segments:
112
+ - 1
113
+ - 2
114
+ - 8
115
+ version: 1.2.8
116
+ type: :development
117
+ version_requirements: *id006
118
+ - !ruby/object:Gem::Dependency
119
+ name: rr
120
+ prerelease: false
121
+ requirement: &id007 !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ hash: 61
127
+ segments:
128
+ - 0
129
+ - 10
130
+ - 5
131
+ version: 0.10.5
132
+ type: :development
133
+ version_requirements: *id007
134
+ description: Framework that allows arbitrary push and pull connectors to send data to an instance of the Trampoline SONAR server
135
+ email: hello@empire42.com
136
+ executables:
137
+ - sonar-connector
138
+ extensions: []
139
+
140
+ extra_rdoc_files:
141
+ - LICENSE
142
+ - README.rdoc
143
+ files:
144
+ - LICENSE
145
+ - README.rdoc
146
+ - Rakefile
147
+ - VERSION
148
+ - bin/sonar-connector
149
+ - config/config.example.json
150
+ - lib/sonar_connector.rb
151
+ - lib/sonar_connector/commands/command.rb
152
+ - lib/sonar_connector/commands/commit_seppuku_command.rb
153
+ - lib/sonar_connector/commands/increment_status_value_command.rb
154
+ - lib/sonar_connector/commands/send_admin_email_command.rb
155
+ - lib/sonar_connector/commands/update_disk_usage_command.rb
156
+ - lib/sonar_connector/commands/update_status_command.rb
157
+ - lib/sonar_connector/config.rb
158
+ - lib/sonar_connector/connectors/base.rb
159
+ - lib/sonar_connector/connectors/dummy_connector.rb
160
+ - lib/sonar_connector/connectors/seppuku_connector.rb
161
+ - lib/sonar_connector/consumer.rb
162
+ - lib/sonar_connector/controller.rb
163
+ - lib/sonar_connector/emailer.rb
164
+ - lib/sonar_connector/rspec/spec_helper.rb
165
+ - lib/sonar_connector/status.rb
166
+ - lib/sonar_connector/utils.rb
167
+ - script/console
168
+ - spec/sonar_connector/commands/command_spec.rb
169
+ - spec/sonar_connector/commands/commit_seppuku_command_spec.rb
170
+ - spec/sonar_connector/commands/increment_status_value_command_spec.rb
171
+ - spec/sonar_connector/commands/send_admin_email_command_spec.rb
172
+ - spec/sonar_connector/commands/update_disk_usage_command_spec.rb
173
+ - spec/sonar_connector/commands/update_status_command_spec.rb
174
+ - spec/sonar_connector/config_spec.rb
175
+ - spec/sonar_connector/connectors/base_spec.rb
176
+ - spec/sonar_connector/connectors/dummy_connector_spec.rb
177
+ - spec/sonar_connector/connectors/seppuku_connector_spec.rb
178
+ - spec/sonar_connector/consumer_spec.rb
179
+ - spec/sonar_connector/controller_spec.rb
180
+ - spec/sonar_connector/emailer_spec.rb
181
+ - spec/sonar_connector/status_spec.rb
182
+ - spec/sonar_connector/utils_spec.rb
183
+ - spec/spec.opts
184
+ - spec/spec_helper.rb
185
+ has_rdoc: true
186
+ homepage: http://github.com/trampoline/sonar-connector
187
+ licenses: []
188
+
189
+ post_install_message:
190
+ rdoc_options: []
191
+
192
+ require_paths:
193
+ - lib
194
+ required_ruby_version: !ruby/object:Gem::Requirement
195
+ none: false
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ hash: 3
200
+ segments:
201
+ - 0
202
+ version: "0"
203
+ required_rubygems_version: !ruby/object:Gem::Requirement
204
+ none: false
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ hash: 3
209
+ segments:
210
+ - 0
211
+ version: "0"
212
+ requirements: []
213
+
214
+ rubyforge_project:
215
+ rubygems_version: 1.6.2
216
+ signing_key:
217
+ specification_version: 3
218
+ summary: A behind-the-firewall connector for Trampoline SONAR
219
+ test_files:
220
+ - spec/sonar_connector/commands/command_spec.rb
221
+ - spec/sonar_connector/commands/commit_seppuku_command_spec.rb
222
+ - spec/sonar_connector/commands/increment_status_value_command_spec.rb
223
+ - spec/sonar_connector/commands/send_admin_email_command_spec.rb
224
+ - spec/sonar_connector/commands/update_disk_usage_command_spec.rb
225
+ - spec/sonar_connector/commands/update_status_command_spec.rb
226
+ - spec/sonar_connector/config_spec.rb
227
+ - spec/sonar_connector/connectors/base_spec.rb
228
+ - spec/sonar_connector/connectors/dummy_connector_spec.rb
229
+ - spec/sonar_connector/connectors/seppuku_connector_spec.rb
230
+ - spec/sonar_connector/consumer_spec.rb
231
+ - spec/sonar_connector/controller_spec.rb
232
+ - spec/sonar_connector/emailer_spec.rb
233
+ - spec/sonar_connector/status_spec.rb
234
+ - spec/sonar_connector/utils_spec.rb
235
+ - spec/spec_helper.rb