ampel_extase 0.6.2 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: af74d646267c574a1c074361f0c19648358b4416
4
- data.tar.gz: 41fcb34b0b8679e296a31e57e4b21095817cf9e4
3
+ metadata.gz: 3bc231be0b27606b26a61653387d91dc44c8639f
4
+ data.tar.gz: b03da6a650bb4d89014e7fa3397bce69c53bef10
5
5
  SHA512:
6
- metadata.gz: 853d7913bcbcb3e6e1206094fe5c604c940a61b4c61af34e311b659b65d5921c919775ac037695258d89b88ccc38759fc0b5a6bb51f3b3a78d559dd4aa04f19a
7
- data.tar.gz: 8e4254e1bca325d6013ef49460780e1bfae3953e143bdc4d138156e831e5e97fd61a871d4ba230e153974556a0acf8c2dc3b80188dc7512bb136bd028172f238
6
+ metadata.gz: 68ee3cf38c7afe77b0cf5555f321f0adea149bb160312c5b81938357813e15aae10061035907d07afd3fb735cac360bc27f302e5ff49db3d7aa5bae2a392f635
7
+ data.tar.gz: db822a2f2ec45137e62cb8ead9811ace9cbe8b09d30163d4929bcce19ca3dfa89ce854c3b17d40250e7951053381c2ee12ad35b3ea18df7e5b8d79543c25ad00
data/Rakefile CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  require 'gem_hadar'
4
4
 
5
+ task :console do
6
+ sh 'irb -rubygems -I lib -r ampel_extase.rb'
7
+ end
8
+
5
9
  GemHadar do
6
10
  name 'ampel_extase'
7
11
  author 'Florian Frank'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.2
1
+ 0.7.2
@@ -1,9 +1,9 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: ampel_extase 0.6.2 ruby lib
2
+ # stub: ampel_extase 0.7.2 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "ampel_extase".freeze
6
- s.version = "0.6.2"
6
+ s.version = "0.7.2"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
@@ -12,14 +12,14 @@ Gem::Specification.new do |s|
12
12
  s.description = "Library to control the build traffic light. Yes, we can\u2026".freeze
13
13
  s.email = "flori@ping.de".freeze
14
14
  s.executables = ["ampel_control".freeze]
15
- s.extra_rdoc_files = ["README.md".freeze, "lib/ampel_extase.rb".freeze, "lib/ampel_extase/build_state.rb".freeze, "lib/ampel_extase/controller.rb".freeze, "lib/ampel_extase/jenkins_client.rb".freeze, "lib/ampel_extase/jenkins_state_observer.rb".freeze, "lib/ampel_extase/jenkins_warning_state_observer.rb".freeze, "lib/ampel_extase/light_switcher.rb".freeze, "lib/ampel_extase/version.rb".freeze]
16
- s.files = [".gitignore".freeze, ".travis.yml".freeze, ".utilsrc".freeze, "Gemfile".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "ampel_extase.gemspec".freeze, "bin/ampel_control".freeze, "lib/ampel_extase.rb".freeze, "lib/ampel_extase/build_state.rb".freeze, "lib/ampel_extase/controller.rb".freeze, "lib/ampel_extase/jenkins_client.rb".freeze, "lib/ampel_extase/jenkins_state_observer.rb".freeze, "lib/ampel_extase/jenkins_warning_state_observer.rb".freeze, "lib/ampel_extase/light_switcher.rb".freeze, "lib/ampel_extase/version.rb".freeze, "spec/ampel_extase/build_state_spec.rb".freeze, "spec/ampel_extase/controller_spec.rb".freeze, "spec/ampel_extase/jekins_state_observer_spec.rb".freeze, "spec/ampel_extase/jenkins_client_spec.rb".freeze, "spec/ampel_extase/jenkins_warning_state_observer_spec.rb".freeze, "spec/ampel_extase/light_switcher_spec.rb".freeze, "spec/spec_helper.rb".freeze]
15
+ s.extra_rdoc_files = ["README.md".freeze, "lib/ampel_extase.rb".freeze, "lib/ampel_extase/build_state.rb".freeze, "lib/ampel_extase/controller.rb".freeze, "lib/ampel_extase/jenkins_client.rb".freeze, "lib/ampel_extase/jenkins_state_observer.rb".freeze, "lib/ampel_extase/jenkins_warning_state_observer.rb".freeze, "lib/ampel_extase/light_switcher.rb".freeze, "lib/ampel_extase/semaphore_client.rb".freeze, "lib/ampel_extase/semaphore_state_observer.rb".freeze, "lib/ampel_extase/version.rb".freeze]
16
+ s.files = [".gitignore".freeze, ".travis.yml".freeze, ".utilsrc".freeze, "Gemfile".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "ampel_extase.gemspec".freeze, "bin/ampel_control".freeze, "lib/ampel_extase.rb".freeze, "lib/ampel_extase/build_state.rb".freeze, "lib/ampel_extase/controller.rb".freeze, "lib/ampel_extase/jenkins_client.rb".freeze, "lib/ampel_extase/jenkins_state_observer.rb".freeze, "lib/ampel_extase/jenkins_warning_state_observer.rb".freeze, "lib/ampel_extase/light_switcher.rb".freeze, "lib/ampel_extase/semaphore_client.rb".freeze, "lib/ampel_extase/semaphore_state_observer.rb".freeze, "lib/ampel_extase/version.rb".freeze, "spec/ampel_extase/build_state_spec.rb".freeze, "spec/ampel_extase/controller_spec.rb".freeze, "spec/ampel_extase/jekins_state_observer_spec.rb".freeze, "spec/ampel_extase/jenkins_client_spec.rb".freeze, "spec/ampel_extase/jenkins_warning_state_observer_spec.rb".freeze, "spec/ampel_extase/light_switcher_spec.rb".freeze, "spec/ampel_extase/semaphore_client_spec.rb".freeze, "spec/ampel_extase/semaphore_state_observer_spec.rb".freeze, "spec/spec_helper.rb".freeze]
17
17
  s.homepage = "http://github.com/flori/ampel_extase".freeze
18
18
  s.licenses = ["GPL-2".freeze]
19
19
  s.rdoc_options = ["--title".freeze, "AmpelExtase - Library to control the build traffic light".freeze, "--main".freeze, "README.md".freeze]
20
- s.rubygems_version = "2.6.10".freeze
20
+ s.rubygems_version = "2.6.8".freeze
21
21
  s.summary = "Library to control the build traffic light".freeze
22
- s.test_files = ["spec/ampel_extase/build_state_spec.rb".freeze, "spec/ampel_extase/controller_spec.rb".freeze, "spec/ampel_extase/jekins_state_observer_spec.rb".freeze, "spec/ampel_extase/jenkins_client_spec.rb".freeze, "spec/ampel_extase/jenkins_warning_state_observer_spec.rb".freeze, "spec/ampel_extase/light_switcher_spec.rb".freeze, "spec/spec_helper.rb".freeze]
22
+ s.test_files = ["spec/ampel_extase/build_state_spec.rb".freeze, "spec/ampel_extase/controller_spec.rb".freeze, "spec/ampel_extase/jekins_state_observer_spec.rb".freeze, "spec/ampel_extase/jenkins_client_spec.rb".freeze, "spec/ampel_extase/jenkins_warning_state_observer_spec.rb".freeze, "spec/ampel_extase/light_switcher_spec.rb".freeze, "spec/ampel_extase/semaphore_client_spec.rb".freeze, "spec/ampel_extase/semaphore_state_observer_spec.rb".freeze, "spec/spec_helper.rb".freeze]
23
23
 
24
24
  if s.respond_to? :specification_version then
25
25
  s.specification_version = 4
@@ -7,14 +7,17 @@ serial =
7
7
  serial = ENV['SERIAL'].full? or
8
8
  fail 'need env var SERIAL for path to serial port'
9
9
  end
10
- jenkins_url = ENV['JENKINS_URL'].full? or
11
- fail 'need env var JENKINS_URL of the form http://test2.local:8080/job/foo'
10
+ semaphore_url = ENV['SEMAPHORE_URL'].full? or
11
+ fail 'need env var SEMAPHORE_URL'
12
12
  warning_jenkins_url = ENV['WARNING_JENKINS_URL'].full?
13
13
  sleep_duration = (ENV['SLEEP'] || 10).to_i
14
14
 
15
15
  AmpelExtase::Controller.for(
16
16
  serial: serial,
17
- jenkins_url: jenkins_url,
17
+ semaphore_url: semaphore_url,
18
18
  warning_jenkins_url: warning_jenkins_url,
19
19
  sleep: sleep_duration
20
20
  ).start
21
+
22
+
23
+ # https://semaphoreci.com/api/v1/projects/21ba4f35-3a61-4c7c-ac55-c8e563337810/master/status.json?auth_token=ybQXiTo6gGr4dSCEH2TQ
@@ -15,7 +15,7 @@ class AmpelExtase::BuildState
15
15
  end
16
16
 
17
17
  def success?
18
- %w[SUCCESS N/A].include? @last_result
18
+ %w[passed SUCCESS N/A].include? @last_result
19
19
  end
20
20
 
21
21
  def to_a
@@ -4,31 +4,32 @@ require 'term/ansicolor'
4
4
  require 'ampel_extase/light_switcher'
5
5
  require 'ampel_extase/jenkins_state_observer'
6
6
  require 'ampel_extase/jenkins_warning_state_observer'
7
+ require 'ampel_extase/semaphore_state_observer'
7
8
 
8
9
  class AmpelExtase::Controller
9
10
  include Term::ANSIColor
10
11
 
11
12
  def self.for(
12
13
  serial:,
13
- jenkins_url:,
14
+ semaphore_url:,
14
15
  warning_jenkins_url: nil,
15
16
  sleep: 10
16
17
  )
17
- ampel_jenkins = AmpelExtase::JenkinsStateObserver.for_url(jenkins_url)
18
- urls = warning_jenkins_url.full?(:split, ?,) || []
18
+ ampel_semaphore = AmpelExtase::SemaphoreStateObserver.for_url(semaphore_url)
19
+ urls = warning_jenkins_url.full?(:split, ?,) || []
19
20
  warning_jenkins = AmpelExtase::JenkinsWarningStateObserver.for_urls(*urls)
20
- lights = AmpelExtase::LightSwitcher.for(serial: serial)
21
- new(ampel_jenkins, warning_jenkins, lights, sleep: sleep)
21
+ lights = AmpelExtase::LightSwitcher.for(serial: serial)
22
+ new(ampel_semaphore, warning_jenkins, lights, sleep: sleep)
22
23
  end
23
24
 
24
25
  def initialize(
25
- ampel_jenkins,
26
+ ampel_semaphore,
26
27
  warning_jenkins,
27
28
  lights,
28
29
  sleep: 10
29
30
  )
30
- @ampel_jenkins, @warning_jenkins, @lights, @sleep =
31
- ampel_jenkins, warning_jenkins, lights, sleep
31
+ @ampel_semaphore, @warning_jenkins, @lights, @sleep =
32
+ ampel_semaphore, warning_jenkins, lights, sleep
32
33
  @expire_duration = 6 * @sleep
33
34
  check_lights
34
35
  end
@@ -59,7 +60,7 @@ class AmpelExtase::Controller
59
60
  end
60
61
 
61
62
  def perform
62
- @ampel_jenkins.on_state_change do |state|
63
+ @ampel_semaphore.on_state_change do |state|
63
64
  perform_lights_switch state
64
65
  end
65
66
  @warning_jenkins.on_state_change(@expire_duration) do |state|
@@ -124,7 +125,7 @@ class AmpelExtase::Controller
124
125
  def info(message)
125
126
  yellow message
126
127
  end
127
-
128
+
128
129
  def switch_all_lights_off
129
130
  @lights.each(&:off)
130
131
  end
@@ -135,7 +136,7 @@ class AmpelExtase::Controller
135
136
 
136
137
  def handle_crash(exception)
137
138
  warn "Caught: #{exception.class}: #{exception}\n#{exception.backtrace * ?\n}"
138
- @ampel_jenkins.reset
139
+ @ampel_semaphore.reset
139
140
  @warning_jenkins.reset
140
141
  switch_all_lights_off
141
142
  end
@@ -0,0 +1,32 @@
1
+ require 'open-uri'
2
+ require 'tins/xt'
3
+ require 'json'
4
+ require 'uri'
5
+
6
+ module AmpelExtase
7
+ class SemaphoreClient
8
+ def initialize(url)
9
+ @url = url
10
+ end
11
+
12
+ attr_reader :url
13
+
14
+ def fetch
15
+ puts "Fetching #{url.inspect}."
16
+ JSON open(url).read
17
+ rescue => e
18
+ e.message << " for #{url.inspect}"
19
+ raise
20
+ end
21
+
22
+ def fetch_build(type)
23
+ builds = fetch['builds']
24
+ case type
25
+ when :last_completed_build
26
+ builds.detect { |build| !!build['finished_at'] }
27
+ when :last_build
28
+ builds.first
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,67 @@
1
+ require 'ampel_extase/build_state'
2
+ require 'ampel_extase/semaphore_client'
3
+
4
+ class AmpelExtase::SemaphoreStateObserver
5
+ def self.for_url(semaphore_url)
6
+ if semaphore_url
7
+ client = AmpelExtase::SemaphoreClient.new(semaphore_url)
8
+ new(client)
9
+ else
10
+ Tins::NULL
11
+ end
12
+ end
13
+
14
+ def initialize(client)
15
+ @client = client
16
+ reset
17
+ end
18
+
19
+ def reset
20
+ set_state AmpelExtase::BuildState.for
21
+ end
22
+
23
+ def last_result
24
+ @client.fetch_build(:last_completed_build)['result']
25
+ end
26
+
27
+ def building?
28
+ !@client.fetch_build(:last_build)['finished_at']
29
+ end
30
+
31
+ def state_changed?(new_state)
32
+ new_state != @build_state
33
+ end
34
+
35
+ def set_state(state)
36
+ @build_state = state
37
+ @state_changed_at = Time.now
38
+ self
39
+ end
40
+
41
+ attr_reader :build_state
42
+
43
+ attr_reader :state_changed_at
44
+
45
+ def fetch_new_state
46
+ AmpelExtase::BuildState.for [ last_result, building? ]
47
+ end
48
+
49
+ def on_state_change
50
+ new_state = fetch_new_state
51
+ if state_changed?(new_state)
52
+ puts "state changed from #@build_state to #{new_state} => taking action"
53
+ begin
54
+ yield new_state
55
+ ensure
56
+ set_state new_state
57
+ end
58
+ else
59
+ puts "state did not change, is still #@build_state => do nothing"
60
+ end
61
+ self
62
+ end
63
+
64
+ def expired?(duration)
65
+ Time.now > @state_changed_at + duration
66
+ end
67
+ end
@@ -1,6 +1,6 @@
1
1
  module AmpelExtase
2
2
  # AmpelExtase version
3
- VERSION = '0.6.2'
3
+ VERSION = '0.7.2'
4
4
  VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
@@ -3,13 +3,15 @@ require 'spec_helper'
3
3
  describe AmpelExtase::Controller do
4
4
  before do
5
5
  allow_any_instance_of(AmpelExtase::JenkinsClient).to receive(:puts)
6
+ allow_any_instance_of(AmpelExtase::SemaphoreClient).to receive(:puts)
6
7
  allow_any_instance_of(described_class).to receive(:puts)
8
+ allow_any_instance_of(AmpelExtase::SemaphoreStateObserver).to receive(:puts)
7
9
  allow_any_instance_of(AmpelExtase::JenkinsStateObserver).to receive(:puts)
8
10
  allow_any_instance_of(described_class).to receive(:sleep)
9
11
  end
10
12
 
11
13
  let :ampel_client do
12
- double('AmpelExtase::JenkinsClient', url: 'http://foo/bar')
14
+ double('AmpelExtase::SemaphoreClient', url: 'http://foo/bar')
13
15
  end
14
16
 
15
17
  let :warning_client1 do
@@ -20,16 +22,16 @@ describe AmpelExtase::Controller do
20
22
  double('AmpelExtase::JenkinsClient', url: 'http://foo/bar')
21
23
  end
22
24
 
23
- let :ampel_jenkins do
24
- AmpelExtase::JenkinsStateObserver.new ampel_client
25
+ let :ampel_semaphore do
26
+ AmpelExtase::SemaphoreStateObserver.new ampel_client
25
27
  end
26
28
 
27
29
  let :warning_jenkins1 do
28
- AmpelExtase::JenkinsStateObserver.new(warning_client1)
30
+ AmpelExtase::SemaphoreStateObserver.new(warning_client1)
29
31
  end
30
32
 
31
33
  let :warning_jenkins2 do
32
- AmpelExtase::JenkinsStateObserver.new(warning_client2)
34
+ AmpelExtase::SemaphoreStateObserver.new(warning_client2)
33
35
  end
34
36
 
35
37
  let :warning_jenkins do
@@ -44,7 +46,7 @@ describe AmpelExtase::Controller do
44
46
 
45
47
  let :controller do
46
48
  described_class.new(
47
- ampel_jenkins,
49
+ ampel_semaphore,
48
50
  warning_jenkins,
49
51
  lights
50
52
  )
@@ -65,9 +67,9 @@ describe AmpelExtase::Controller do
65
67
  it 'can create a demo object that does not really do anything' do
66
68
  demo_object = described_class.for(
67
69
  serial: nil,
68
- jenkins_url: nil
70
+ semaphore_url: nil
69
71
  )
70
- expect(demo_object.instance_eval { @ampel_jenkins }).to be_nil
72
+ expect(demo_object.instance_eval { @ampel_semaphore }).to be_nil
71
73
  expect(demo_object.instance_eval { @warning_jenkins }).to be_nil
72
74
  expect(demo_object.instance_eval { @lights }).to be_nil
73
75
  end
@@ -120,9 +122,8 @@ describe AmpelExtase::Controller do
120
122
  end
121
123
 
122
124
  it 'reacts to state changes' do
123
- state = AmpelExtase::BuildState.for
124
- allow(ampel_jenkins).to receive(:state_changed?).and_return true
125
- expect { |b| ampel_jenkins.on_state_change(&b) }.to yield_with_args(state)
125
+ allow(ampel_semaphore).to receive(:state_changed?).and_return true
126
+ expect { |b| ampel_semaphore.on_state_change(&b) }.to yield_with_args(ampel_semaphore.fetch_new_state)
126
127
  allow(warning_jenkins1).to receive(:state_changed?).and_return true
127
128
  state = AmpelExtase::BuildState.for [ 'FAILURE', false ]
128
129
  allow(warning_jenkins1).to receive(:fetch_new_state).and_return state
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe AmpelExtase::SemaphoreClient do
4
+ before do
5
+ allow_any_instance_of(described_class).to receive(:puts)
6
+ end
7
+
8
+ let :semaphore_url do
9
+ 'https://semaphoreci.com/api/v1/projects/uuid/master?auth_token=foobar'
10
+ end
11
+
12
+ let :client do
13
+ described_class.new semaphore_url
14
+ end
15
+
16
+ let :opened_uri do
17
+ double('URI', read: '{"hello":"world"}')
18
+ end
19
+
20
+ describe '#fetch' do
21
+ it 'can fetch JSON data from CI' do
22
+ expect(client).to receive(:open).with(semaphore_url).and_return opened_uri
23
+ expect(client.fetch).to eq("hello" => "world")
24
+ end
25
+
26
+ it 'modifies exception messages and reraises' do
27
+ expect(client).to receive(:open).with(semaphore_url).and_raise(StandardError)
28
+ expect { client.fetch }.to raise_error(StandardError)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,118 @@
1
+ require 'spec_helper'
2
+
3
+ describe AmpelExtase::SemaphoreStateObserver do
4
+ before do
5
+ allow_any_instance_of(AmpelExtase::SemaphoreClient).to receive(:puts)
6
+ allow_any_instance_of(described_class).to receive(:puts)
7
+ end
8
+
9
+ let :client do
10
+ double('AmpelExtase::SemaphoreClient', url: 'http://foo/bar')
11
+ end
12
+
13
+ before do
14
+ allow(client).to receive(:fetch).and_return true
15
+ end
16
+
17
+ let :observer do
18
+ described_class.new client
19
+ end
20
+
21
+ describe '.for_url' do
22
+ it 'creates a state observer for an URL' do
23
+ url = 'http://foo/bar'
24
+ expect(AmpelExtase::SemaphoreClient).to\
25
+ receive(:new).with(url).and_return client
26
+ expect(described_class).to\
27
+ receive(:new).with(client)
28
+ described_class.for_url url
29
+ end
30
+
31
+ it 'returns a null object if url was nil' do
32
+ expect(described_class.for_url(nil)).to be_nil
33
+ end
34
+ end
35
+
36
+ describe '#last_result' do
37
+ it 'uses client to fetch last_completed_build' do
38
+ allow(client).to receive(:fetch_build).with(:last_completed_build).
39
+ and_return('result' => :foo)
40
+ expect(observer.last_result).to eq :foo
41
+ end
42
+ end
43
+
44
+ describe '#building?' do
45
+ it 'uses client to fetch last_build' do
46
+ allow(client).to receive(:fetch_build).with(:last_build).
47
+ and_return('finished_at' => nil)
48
+ expect(observer.building?).to eq true
49
+ end
50
+ end
51
+
52
+ describe '#on_state_change' do
53
+ let :bs_initial do
54
+ AmpelExtase::BuildState.for [ 'N/A', nil ]
55
+ end
56
+
57
+ let :bs_success do
58
+ AmpelExtase::BuildState.for [ 'SUCCESS', true ]
59
+ end
60
+
61
+ let :bs_failure do
62
+ AmpelExtase::BuildState.for [ 'FAILURE', true ]
63
+ end
64
+
65
+ it 'tracks changes in build state' do
66
+ Time.dummy(past = Time.now - 10) do
67
+ observer
68
+ end
69
+ expect(observer.instance_variable_get(:@build_state)).to eq bs_initial
70
+ expect(observer.state_changed_at).to eq past
71
+ allow(client).to receive(:fetch_build).with(:last_completed_build).
72
+ and_return('result' => 'SUCCESS')
73
+ allow(client).to receive(:fetch_build).with(:last_build).
74
+ and_return('building' => true)
75
+ expect(observer).to receive(:puts).with(
76
+ "state changed from N/A to SUCCESS (building) => "\
77
+ "taking action"
78
+ )
79
+ now = nil
80
+ Time.dummy(Time.now) do
81
+ expect { |b|
82
+ observer.on_state_change(&b)
83
+ now = Time.now
84
+ }.to yield_with_args(bs_success)
85
+ end
86
+ expect(observer.instance_variable_get(:@build_state)).to eq bs_success
87
+ expect(observer.state_changed_at).to eq now
88
+ allow(client).to receive(:fetch_build).with(:last_completed_build).
89
+ and_return('result' => 'FAILURE')
90
+ allow(client).to receive(:fetch_build).with(:last_build).
91
+ and_return('building' => true)
92
+ expect(observer).to receive(:puts).with(
93
+ "state changed from SUCCESS (building) to FAILURE (building) => "\
94
+ "taking action"
95
+ )
96
+ expect { |b| observer.on_state_change(&b) }.to yield_with_args(bs_failure)
97
+ expect(observer.instance_variable_get(:@build_state)).to eq bs_failure
98
+ end
99
+
100
+ it 'notices if nothing has changed' do
101
+ allow(client).to receive(:fetch_build).twice.with(:last_completed_build).
102
+ and_return('result' => 'SUCCESS')
103
+ allow(client).to receive(:fetch_build).twice.with(:last_build).
104
+ and_return('building' => true)
105
+ expect(observer).to receive(:puts).with(
106
+ "state changed from N/A to SUCCESS (building) => "\
107
+ "taking action"
108
+ )
109
+ expect { |b| observer.on_state_change(&b) }.to yield_with_args(bs_success)
110
+ expect(observer.instance_variable_get(:@build_state)).to eq bs_success
111
+ expect(observer).to receive(:puts).with(
112
+ "state did not change, is still SUCCESS (building) => do nothing"
113
+ )
114
+ expect(observer.instance_variable_get(:@build_state)).to eq bs_success
115
+ expect { |b| observer.on_state_change(&b) }.not_to yield_with_args(bs_success)
116
+ end
117
+ end
118
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ampel_extase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
@@ -122,6 +122,8 @@ extra_rdoc_files:
122
122
  - lib/ampel_extase/jenkins_state_observer.rb
123
123
  - lib/ampel_extase/jenkins_warning_state_observer.rb
124
124
  - lib/ampel_extase/light_switcher.rb
125
+ - lib/ampel_extase/semaphore_client.rb
126
+ - lib/ampel_extase/semaphore_state_observer.rb
125
127
  - lib/ampel_extase/version.rb
126
128
  files:
127
129
  - ".gitignore"
@@ -140,6 +142,8 @@ files:
140
142
  - lib/ampel_extase/jenkins_state_observer.rb
141
143
  - lib/ampel_extase/jenkins_warning_state_observer.rb
142
144
  - lib/ampel_extase/light_switcher.rb
145
+ - lib/ampel_extase/semaphore_client.rb
146
+ - lib/ampel_extase/semaphore_state_observer.rb
143
147
  - lib/ampel_extase/version.rb
144
148
  - spec/ampel_extase/build_state_spec.rb
145
149
  - spec/ampel_extase/controller_spec.rb
@@ -147,6 +151,8 @@ files:
147
151
  - spec/ampel_extase/jenkins_client_spec.rb
148
152
  - spec/ampel_extase/jenkins_warning_state_observer_spec.rb
149
153
  - spec/ampel_extase/light_switcher_spec.rb
154
+ - spec/ampel_extase/semaphore_client_spec.rb
155
+ - spec/ampel_extase/semaphore_state_observer_spec.rb
150
156
  - spec/spec_helper.rb
151
157
  homepage: http://github.com/flori/ampel_extase
152
158
  licenses:
@@ -172,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
172
178
  version: '0'
173
179
  requirements: []
174
180
  rubyforge_project:
175
- rubygems_version: 2.6.10
181
+ rubygems_version: 2.6.8
176
182
  signing_key:
177
183
  specification_version: 4
178
184
  summary: Library to control the build traffic light
@@ -183,4 +189,6 @@ test_files:
183
189
  - spec/ampel_extase/jenkins_client_spec.rb
184
190
  - spec/ampel_extase/jenkins_warning_state_observer_spec.rb
185
191
  - spec/ampel_extase/light_switcher_spec.rb
192
+ - spec/ampel_extase/semaphore_client_spec.rb
193
+ - spec/ampel_extase/semaphore_state_observer_spec.rb
186
194
  - spec/spec_helper.rb