sonar_connector 0.8.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.
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