build_eval 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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