build_eval 0.0.4 → 0.0.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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/lib/build_eval/error.rb +0 -4
  3. data/lib/build_eval/http.rb +1 -5
  4. data/lib/build_eval/monitor/base.rb +2 -6
  5. data/lib/build_eval/monitor/composite.rb +0 -4
  6. data/lib/build_eval/monitor/server.rb +0 -3
  7. data/lib/build_eval/result/build_result.rb +2 -8
  8. data/lib/build_eval/result/composite_result.rb +0 -4
  9. data/lib/build_eval/result/server_result.rb +0 -4
  10. data/lib/build_eval/result/status.rb +9 -17
  11. data/lib/build_eval/server/cruise_control_response.rb +2 -6
  12. data/lib/build_eval/server/decorator.rb +3 -9
  13. data/lib/build_eval/server/invalid_selector_error.rb +0 -4
  14. data/lib/build_eval/server/jenkins.rb +0 -4
  15. data/lib/build_eval/server/team_city.rb +2 -6
  16. data/lib/build_eval/server/travis_com.rb +23 -0
  17. data/lib/build_eval/server/travis_org.rb +22 -0
  18. data/lib/build_eval/version.rb +1 -1
  19. data/lib/build_eval.rb +7 -11
  20. data/spec/lib/build_eval/error_spec.rb +4 -8
  21. data/spec/lib/build_eval/http_shared_context.rb +2 -4
  22. data/spec/lib/build_eval/http_spec.rb +30 -50
  23. data/spec/lib/build_eval/monitor/base_spec.rb +3 -7
  24. data/spec/lib/build_eval/monitor/composite_spec.rb +5 -9
  25. data/spec/lib/build_eval/monitor/server_spec.rb +6 -10
  26. data/spec/lib/build_eval/result/build_result_spec.rb +19 -30
  27. data/spec/lib/build_eval/result/composite_result_spec.rb +10 -18
  28. data/spec/lib/build_eval/result/server_result_spec.rb +14 -26
  29. data/spec/lib/build_eval/result/status_spec.rb +35 -73
  30. data/spec/lib/build_eval/server/cruise_control_response_spec.rb +33 -41
  31. data/spec/lib/build_eval/server/decorator_spec.rb +17 -31
  32. data/spec/lib/build_eval/server/invalid_selector_error_spec.rb +7 -11
  33. data/spec/lib/build_eval/server/jenkins_integration_spec.rb +10 -15
  34. data/spec/lib/build_eval/server/jenkins_spec.rb +17 -24
  35. data/spec/lib/build_eval/server/server_shared_examples.rb +3 -7
  36. data/spec/lib/build_eval/server/team_city_integration_spec.rb +18 -27
  37. data/spec/lib/build_eval/server/team_city_spec.rb +13 -20
  38. data/spec/lib/build_eval/server/travis_com_spec.rb +91 -0
  39. data/spec/lib/build_eval/server/travis_org_spec.rb +71 -0
  40. data/spec/lib/build_eval_smoke_spec.rb +11 -10
  41. data/spec/lib/build_eval_spec.rb +8 -16
  42. data/spec/spec_helper.rb +4 -4
  43. metadata +33 -18
  44. data/lib/build_eval/server/travis.rb +0 -23
  45. data/spec/lib/build_eval/server/travis_integration_spec.rb +0 -53
  46. data/spec/lib/build_eval/server/travis_spec.rb +0 -70
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c9ed39e2bae3a1ef5d1ffd40242183287fae193a
4
- data.tar.gz: bff2e6552ad2a28e5d1dbc0cea6b463cd6a82a3a
3
+ metadata.gz: 2c32dba8242b9791724f68774da3882fbff6d6f3
4
+ data.tar.gz: 9b0ac4ca5b0ecdad1bf4fa02cf7052fee8c3630a
5
5
  SHA512:
6
- metadata.gz: b6006e6709284a157a71b6b48f09b0706f9112c89706e57de79faf3a40d3b46d8e998366c422420349f5d48e1e2beb6e0f6ff3cdddb59993efb5abe34bc862a6
7
- data.tar.gz: 6c2978e0ce2095206a9086b018beef07e409f18dbf3c8e9afb5c7b8210942728b496ac04d8af499f3e9d54deb5df6435dfedef34f18d252661602afc1f1113b1
6
+ metadata.gz: af37b3850de9b567e633194aaef3f146460fcfd2d7e673d138c5a681099042dfee9431c36d61fbb2073321e75d547c428a226f1caeb44154ab698034b1acb3b6
7
+ data.tar.gz: ea266ac251292a56461437f5ece2ada4fb9c7643c47cf792fd39354d6bb4087fa71a27951a9702f17c266ec410dc72eb8ef3fb7037983acb7e23f914ef7e7064
@@ -1,11 +1,7 @@
1
1
  module BuildEval
2
-
3
2
  class Error < ::StandardError
4
-
5
3
  def initialize(message)
6
4
  super(message)
7
5
  end
8
-
9
6
  end
10
-
11
7
  end
@@ -1,7 +1,5 @@
1
1
  module BuildEval
2
-
3
2
  class Http
4
-
5
3
  def initialize(config)
6
4
  @username = config[:username]
7
5
  @password = config[:password]
@@ -20,11 +18,9 @@ module BuildEval
20
18
  private
21
19
 
22
20
  def ssl_options(uri)
23
- ssl_options = { use_ssl: uri.scheme == "https" }
21
+ ssl_options = { use_ssl: uri.scheme == 'https' }
24
22
  ssl_options[:ssl_verify_mode] = @ssl_verify_mode if @ssl_verify_mode
25
23
  ssl_options
26
24
  end
27
-
28
25
  end
29
-
30
26
  end
@@ -1,13 +1,9 @@
1
1
  module BuildEval
2
2
  module Monitor
3
-
4
3
  class Base
5
-
6
- def +(monitor)
7
- BuildEval::Monitor::Composite.new(self, monitor)
4
+ def +(other)
5
+ BuildEval::Monitor::Composite.new(self, other)
8
6
  end
9
-
10
7
  end
11
-
12
8
  end
13
9
  end
@@ -1,8 +1,6 @@
1
1
  module BuildEval
2
2
  module Monitor
3
-
4
3
  class Composite < BuildEval::Monitor::Base
5
-
6
4
  def initialize(*monitors)
7
5
  @monitors = monitors
8
6
  end
@@ -10,8 +8,6 @@ module BuildEval
10
8
  def evaluate
11
9
  BuildEval::Result::CompositeResult.new(@monitors.map(&:evaluate))
12
10
  end
13
-
14
11
  end
15
-
16
12
  end
17
13
  end
@@ -1,8 +1,6 @@
1
1
  module BuildEval
2
2
  module Monitor
3
-
4
3
  class Server < BuildEval::Monitor::Base
5
-
6
4
  def initialize(args)
7
5
  @server = args[:server]
8
6
  @build_names = args[:build_names]
@@ -12,7 +10,6 @@ module BuildEval
12
10
  build_results = @build_names.map { |build_name| @server.build_result(build_name) }
13
11
  BuildEval::Result::ServerResult.new(@server, build_results)
14
12
  end
15
-
16
13
  end
17
14
  end
18
15
  end
@@ -1,18 +1,14 @@
1
1
  module BuildEval
2
2
  module Result
3
-
4
3
  class BuildResult
5
-
6
4
  class << self
7
-
8
5
  def create(args)
9
- self.new(build_name: args[:build_name], status: BuildEval::Result::Status.find(args[:status_name]))
6
+ new(build_name: args[:build_name], status: BuildEval::Result::Status.find(args[:status_name]))
10
7
  end
11
8
 
12
9
  def indeterminate(build_name)
13
- self.new(build_name: build_name, status: BuildEval::Result::Status::INDETERMINATE)
10
+ new(build_name: build_name, status: BuildEval::Result::Status::INDETERMINATE)
14
11
  end
15
-
16
12
  end
17
13
 
18
14
  attr_reader :build_name
@@ -34,8 +30,6 @@ module BuildEval
34
30
  def to_s
35
31
  "#{@build_name}: #{@status}"
36
32
  end
37
-
38
33
  end
39
-
40
34
  end
41
35
  end
@@ -1,8 +1,6 @@
1
1
  module BuildEval
2
2
  module Result
3
-
4
3
  class CompositeResult
5
-
6
4
  def initialize(results)
7
5
  @results = results
8
6
  end
@@ -18,8 +16,6 @@ module BuildEval
18
16
  def to_s
19
17
  @results.map(&:to_s).join("\n")
20
18
  end
21
-
22
19
  end
23
-
24
20
  end
25
21
  end
@@ -1,8 +1,6 @@
1
1
  module BuildEval
2
2
  module Result
3
-
4
3
  class ServerResult
5
-
6
4
  def initialize(server, build_results)
7
5
  @server = server
8
6
  @build_results = build_results
@@ -19,8 +17,6 @@ module BuildEval
19
17
  def to_s
20
18
  "#{@server}: #{@build_results.map(&:to_s).join(", ")}"
21
19
  end
22
-
23
20
  end
24
-
25
21
  end
26
22
  end
@@ -1,8 +1,6 @@
1
1
  module BuildEval
2
2
  module Result
3
-
4
3
  class Status
5
-
6
4
  private
7
5
 
8
6
  def initialize(args)
@@ -13,26 +11,22 @@ module BuildEval
13
11
 
14
12
  public
15
13
 
16
- SUCCESS = self.new(severity: 0, symbol: :success!, description: "succeeded")
17
- UNKNOWN = self.new(severity: 1, symbol: :warning!, description: "unknown")
18
- INDETERMINATE = self.new(severity: 2, symbol: :warning!, description: "indeterminate")
19
- FAILURE = self.new(severity: 3, symbol: :failure!, description: "failed")
20
- ERROR = self.new(severity: 4, symbol: :failure!, description: "errored")
14
+ SUCCESS = new(severity: 0, symbol: :success!, description: 'succeeded')
15
+ UNKNOWN = new(severity: 1, symbol: :warning!, description: 'unknown')
16
+ INDETERMINATE = new(severity: 2, symbol: :warning!, description: 'indeterminate')
17
+ FAILURE = new(severity: 3, symbol: :failure!, description: 'failed')
18
+ ERROR = new(severity: 4, symbol: :failure!, description: 'errored')
21
19
 
22
20
  class << self
23
-
24
21
  def find(name)
25
- begin
26
- self.const_get(name.upcase)
27
- rescue NameError
28
- raise "Build status '#{name}' is invalid"
29
- end
22
+ const_get(name.upcase)
23
+ rescue NameError
24
+ raise "Build status '#{name}' is invalid"
30
25
  end
31
26
 
32
27
  def effective_status(statuses)
33
- statuses.sort_by { |status| status.severity }.last
28
+ statuses.sort_by(&:severity).last
34
29
  end
35
-
36
30
  end
37
31
 
38
32
  attr_reader :severity
@@ -48,8 +42,6 @@ module BuildEval
48
42
  def to_s
49
43
  @description
50
44
  end
51
-
52
45
  end
53
-
54
46
  end
55
47
  end
@@ -1,8 +1,6 @@
1
1
  module BuildEval
2
2
  module Server
3
-
4
3
  class CruiseControlResponse
5
-
6
4
  def initialize(raw_response)
7
5
  @raw_response = raw_response
8
6
  end
@@ -11,12 +9,10 @@ module BuildEval
11
9
  build_element = Nokogiri::XML(@raw_response.body).xpath(project_selector).first
12
10
  raise BuildEval::Server::InvalidSelectorError.new(@raw_response, project_selector) unless build_element
13
11
  BuildEval::Result::BuildResult.create(
14
- build_name: build_element.attribute("name").value.match(/[^\/]+$/)[0],
15
- status_name: build_element.attribute("lastBuildStatus").value
12
+ build_name: build_element.attribute('name').value.match(%r{[^\/]+$})[0],
13
+ status_name: build_element.attribute('lastBuildStatus').value
16
14
  )
17
15
  end
18
-
19
16
  end
20
-
21
17
  end
22
18
  end
@@ -1,25 +1,19 @@
1
1
  module BuildEval
2
2
  module Server
3
-
4
3
  class Decorator
5
-
6
4
  def initialize(delegate)
7
5
  @delegate = delegate
8
6
  end
9
7
 
10
8
  def build_result(name)
11
- begin
12
- @delegate.build_result(name)
13
- rescue Exception
14
- BuildEval::Result::BuildResult.indeterminate(name)
15
- end
9
+ @delegate.build_result(name)
10
+ rescue StandardError
11
+ BuildEval::Result::BuildResult.indeterminate(name)
16
12
  end
17
13
 
18
14
  def monitor(*build_names)
19
15
  BuildEval::Monitor::Server.new(server: @delegate, build_names: build_names.flatten)
20
16
  end
21
-
22
17
  end
23
-
24
18
  end
25
19
  end
@@ -1,13 +1,9 @@
1
1
  module BuildEval
2
2
  module Server
3
-
4
3
  class InvalidSelectorError < BuildEval::Error
5
-
6
4
  def initialize(response, selector)
7
5
  super("Build response did not match selector:\nResponse: #{response.message}\nSelector: #{selector}")
8
6
  end
9
-
10
7
  end
11
-
12
8
  end
13
9
  end
@@ -1,8 +1,6 @@
1
1
  module BuildEval
2
2
  module Server
3
-
4
3
  class Jenkins
5
-
6
4
  def initialize(args)
7
5
  @http = BuildEval::Http.new(args)
8
6
  @base_uri = args[:uri]
@@ -16,8 +14,6 @@ module BuildEval
16
14
  def to_s
17
15
  "Jenkins server #{@base_uri}"
18
16
  end
19
-
20
17
  end
21
-
22
18
  end
23
19
  end
@@ -1,8 +1,6 @@
1
1
  module BuildEval
2
2
  module Server
3
-
4
3
  class TeamCity
5
-
6
4
  def initialize(args)
7
5
  @http = BuildEval::Http.new(args)
8
6
  @base_uri = args[:uri]
@@ -10,16 +8,14 @@ module BuildEval
10
8
 
11
9
  def build_result(name)
12
10
  response = @http.get("#{@base_uri}/httpAuth/app/rest/buildTypes/id:#{name}/builds")
13
- build_element = Nokogiri::XML(response.body).xpath("//build").first
11
+ build_element = Nokogiri::XML(response.body).xpath('//build').first
14
12
  raise "Unexpected build response: #{response.message}" unless build_element
15
- BuildEval::Result::BuildResult.create(build_name: name, status_name: build_element.attribute("status").value)
13
+ BuildEval::Result::BuildResult.create(build_name: name, status_name: build_element.attribute('status').value)
16
14
  end
17
15
 
18
16
  def to_s
19
17
  "TeamCity server #{@base_uri}"
20
18
  end
21
-
22
19
  end
23
-
24
20
  end
25
21
  end
@@ -0,0 +1,23 @@
1
+ module BuildEval
2
+ module Server
3
+ class TravisCom
4
+ def initialize(args)
5
+ @username = args[:username]
6
+ Travis::Pro.github_auth(args[:github_token])
7
+ end
8
+
9
+ def build_result(name)
10
+ repo_string = "#{@username}/#{name}"
11
+ has_failed = Travis::Pro::Repository.find(repo_string).last_build.failed?
12
+ BuildEval::Result::BuildResult.create(
13
+ build_name: repo_string,
14
+ status_name: has_failed ? 'Failure' : 'Success'
15
+ )
16
+ end
17
+
18
+ def to_s
19
+ "Travis CI Com #{@username}"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ module BuildEval
2
+ module Server
3
+ class TravisOrg
4
+ def initialize(args)
5
+ @username = args[:username]
6
+ end
7
+
8
+ def build_result(name)
9
+ repo_string = "#{@username}/#{name}"
10
+ has_failed = Travis::Repository.find(repo_string).last_build.failed?
11
+ BuildEval::Result::BuildResult.create(
12
+ build_name: repo_string,
13
+ status_name: has_failed ? 'Failure' : 'Success'
14
+ )
15
+ end
16
+
17
+ def to_s
18
+ "Travis CI Org #{@username}"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,3 +1,3 @@
1
1
  module BuildEval
2
- VERSION = "0.0.4".freeze
2
+ VERSION = '0.0.5'.freeze
3
3
  end
data/lib/build_eval.rb CHANGED
@@ -2,6 +2,8 @@ require 'nokogiri'
2
2
  require 'uri'
3
3
  require 'net/http'
4
4
  require 'net/https'
5
+ require 'travis'
6
+ require 'travis/tools/github'
5
7
  require_relative 'build_eval/error'
6
8
  require_relative 'build_eval/http'
7
9
  require_relative 'build_eval/result/status'
@@ -12,16 +14,15 @@ require_relative 'build_eval/server/invalid_selector_error'
12
14
  require_relative 'build_eval/server/decorator'
13
15
  require_relative 'build_eval/server/cruise_control_response'
14
16
  require_relative 'build_eval/server/team_city'
15
- require_relative 'build_eval/server/travis'
17
+ require_relative 'build_eval/server/travis_org'
18
+ require_relative 'build_eval/server/travis_com'
16
19
  require_relative 'build_eval/server/jenkins'
17
20
  require_relative 'build_eval/monitor/base'
18
21
  require_relative 'build_eval/monitor/server'
19
22
  require_relative 'build_eval/monitor/composite'
20
23
 
21
24
  module BuildEval
22
-
23
25
  class << self
24
-
25
26
  def server(args)
26
27
  type_args = args.clone
27
28
  server_type = type_args.delete(:type)
@@ -31,14 +32,9 @@ module BuildEval
31
32
  private
32
33
 
33
34
  def server_class_for(type)
34
- begin
35
- BuildEval::Server.const_get(type.to_s)
36
- rescue NameError
37
- raise "Server type '#{type}' is invalid"
38
- end
39
-
35
+ BuildEval::Server.const_get(type.to_s)
36
+ rescue NameError
37
+ raise "Server type '#{type}' is invalid"
40
38
  end
41
-
42
39
  end
43
-
44
40
  end
@@ -1,21 +1,17 @@
1
1
  describe BuildEval::Error do
2
-
3
- let(:message) { "some message" }
2
+ let(:message) { 'some message' }
4
3
 
5
4
  let(:error) { described_class.new(message) }
6
5
 
7
- it "is a standard error" do
6
+ it 'is a standard error' do
8
7
  expect(error).to be_a(::StandardError)
9
8
  end
10
9
 
11
- describe "#messsage" do
12
-
10
+ describe '#messsage' do
13
11
  subject { error.message }
14
12
 
15
- it "returns the provided message" do
13
+ it 'returns the provided message' do
16
14
  expect(subject).to eql(message)
17
15
  end
18
-
19
16
  end
20
-
21
17
  end
@@ -1,7 +1,5 @@
1
- shared_context "stubbed http interactions" do
2
-
1
+ shared_context 'stubbed http interactions' do
3
2
  let(:http) { instance_double(BuildEval::Http) }
4
3
 
5
4
  before(:example) { allow(BuildEval::Http).to receive(:new).and_return(http) }
6
-
7
- end
5
+ end
@@ -1,102 +1,82 @@
1
1
  describe BuildEval::Http do
2
-
3
2
  let(:config) { {} }
4
3
 
5
4
  let(:http) { described_class.new(config) }
6
5
 
7
- shared_examples_for "a http method returning a response" do
8
-
9
- let(:response_status) { [ "200", "OK" ] }
10
- let(:response_body) { "Some Response Body" }
6
+ shared_examples_for 'a http method returning a response' do
7
+ let(:response_status) { %w(200 OK) }
8
+ let(:response_body) { 'Some Response Body' }
11
9
 
12
- it "returns a response containing the response body" do
10
+ it 'returns a response containing the response body' do
13
11
  expect(subject.body).to eql(response_body)
14
12
  end
15
13
 
16
- it "returns a response containing the response status" do
17
- expect(subject.code).to eql("200")
14
+ it 'returns a response containing the response status' do
15
+ expect(subject.code).to eql('200')
18
16
  end
19
17
 
20
- it "returns a response containing the response message" do
21
- expect(subject.message).to eql("OK")
18
+ it 'returns a response containing the response message' do
19
+ expect(subject.message).to eql('OK')
22
20
  end
23
-
24
21
  end
25
22
 
26
- describe "#get" do
27
-
28
- let(:scheme) { "http" }
29
- let(:host) { "a.host" }
30
- let(:path) { "some/path" }
23
+ describe '#get' do
24
+ let(:scheme) { 'http' }
25
+ let(:host) { 'a.host' }
26
+ let(:path) { 'some/path' }
31
27
  let(:uri_string) { "#{scheme}://#{host}/#{path}" }
32
28
 
33
29
  subject { http.get(uri_string) }
34
30
 
35
- context "when the uri is valid" do
36
-
31
+ context 'when the uri is valid' do
37
32
  let(:expected_request_uri) { uri_string }
38
33
 
39
34
  before(:example) do
40
35
  FakeWeb.register_uri(:get, expected_request_uri, status: response_status, body: response_body)
41
36
  end
42
37
 
43
- context "and the uri contains a http scheme" do
44
-
45
- let(:scheme) { "http" }
46
-
47
- it_behaves_like "a http method returning a response"
38
+ context 'and the uri contains a http scheme' do
39
+ let(:scheme) { 'http' }
48
40
 
41
+ it_behaves_like 'a http method returning a response'
49
42
  end
50
43
 
51
- context "and the uri contains a https scheme" do
52
-
53
- let(:scheme) { "https" }
54
-
55
- it_behaves_like "a http method returning a response"
44
+ context 'and the uri contains a https scheme' do
45
+ let(:scheme) { 'https' }
56
46
 
47
+ it_behaves_like 'a http method returning a response'
57
48
  end
58
49
 
59
- context "and an ssl verification mode configuration option was established" do
60
-
50
+ context 'and an ssl verification mode configuration option was established' do
61
51
  let(:ssl_verification_mode) { OpenSSL::SSL::VERIFY_NONE }
62
52
  let(:config) { { ssl_verify_mode: ssl_verification_mode } }
63
53
 
64
- it_behaves_like "a http method returning a response"
65
-
54
+ it_behaves_like 'a http method returning a response'
66
55
  end
67
56
 
68
- context "and partial authentication configuration options were established" do
69
-
70
- let(:config) { { username: "some_username" } }
71
-
72
- it_behaves_like "a http method returning a response"
57
+ context 'and partial authentication configuration options were established' do
58
+ let(:config) { { username: 'some_username' } }
73
59
 
60
+ it_behaves_like 'a http method returning a response'
74
61
  end
75
62
 
76
- context "and basic authentication configuration options were established" do
77
-
78
- let(:username) { "some_username" }
79
- let(:password) { "some_password" }
63
+ context 'and basic authentication configuration options were established' do
64
+ let(:username) { 'some_username' }
65
+ let(:password) { 'some_password' }
80
66
  let(:config) { { username: username, password: password } }
81
67
 
82
68
  let(:expected_request_uri) { "#{scheme}://#{username}:#{password}@#{host}/#{path}" }
83
69
 
84
- it_behaves_like "a http method returning a response"
85
-
70
+ it_behaves_like 'a http method returning a response'
86
71
  end
87
-
88
72
  end
89
73
 
90
- context "when the uri is invalid" do
91
-
74
+ context 'when the uri is invalid' do
92
75
  before(:example) { FakeWeb.clean_registry }
93
76
 
94
- it "raises an error" do
77
+ it 'raises an error' do
95
78
  expect { subject }.to raise_error(SocketError)
96
79
  end
97
-
98
80
  end
99
-
100
81
  end
101
-
102
82
  end
@@ -1,29 +1,25 @@
1
1
  describe BuildEval::Monitor::Base do
2
-
3
2
  class BuildEval::Monitor::TestableBase < BuildEval::Monitor::Base
4
3
  end
5
4
 
6
5
  let(:base_monitor) { BuildEval::Monitor::TestableBase.new }
7
6
 
8
- describe "#+" do
9
-
7
+ describe '#+' do
10
8
  let(:provided_monitor) { instance_double(BuildEval::Monitor::Base) }
11
9
 
12
10
  subject { base_monitor + provided_monitor }
13
11
 
14
- it "creates a composite monitor combining the monitor with the provided monitor" do
12
+ it 'creates a composite monitor combining the monitor with the provided monitor' do
15
13
  expect(BuildEval::Monitor::Composite).to receive(:new).with(base_monitor, provided_monitor)
16
14
 
17
15
  subject
18
16
  end
19
17
 
20
- it "returns the composite monitor" do
18
+ it 'returns the composite monitor' do
21
19
  composite_monitor = instance_double(BuildEval::Monitor::Composite)
22
20
  allow(BuildEval::Monitor::Composite).to receive(:new).and_return(composite_monitor)
23
21
 
24
22
  expect(subject).to eql(composite_monitor)
25
23
  end
26
-
27
24
  end
28
-
29
25
  end