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 +4 -4
- data/Rakefile +4 -0
- data/VERSION +1 -1
- data/ampel_extase.gemspec +6 -6
- data/bin/ampel_control +6 -3
- data/lib/ampel_extase/build_state.rb +1 -1
- data/lib/ampel_extase/controller.rb +12 -11
- data/lib/ampel_extase/semaphore_client.rb +32 -0
- data/lib/ampel_extase/semaphore_state_observer.rb +67 -0
- data/lib/ampel_extase/version.rb +1 -1
- data/spec/ampel_extase/controller_spec.rb +12 -11
- data/spec/ampel_extase/semaphore_client_spec.rb +31 -0
- data/spec/ampel_extase/semaphore_state_observer_spec.rb +118 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3bc231be0b27606b26a61653387d91dc44c8639f
|
4
|
+
data.tar.gz: b03da6a650bb4d89014e7fa3397bce69c53bef10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68ee3cf38c7afe77b0cf5555f321f0adea149bb160312c5b81938357813e15aae10061035907d07afd3fb735cac360bc27f302e5ff49db3d7aa5bae2a392f635
|
7
|
+
data.tar.gz: db822a2f2ec45137e62cb8ead9811ace9cbe8b09d30163d4929bcce19ca3dfa89ce854c3b17d40250e7951053381c2ee12ad35b3ea18df7e5b8d79543c25ad00
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.7.2
|
data/ampel_extase.gemspec
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: ampel_extase 0.
|
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
|
+
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.
|
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
|
data/bin/ampel_control
CHANGED
@@ -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
|
-
|
11
|
-
fail 'need env var
|
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
|
-
|
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
|
@@ -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
|
-
|
14
|
+
semaphore_url:,
|
14
15
|
warning_jenkins_url: nil,
|
15
16
|
sleep: 10
|
16
17
|
)
|
17
|
-
|
18
|
-
urls
|
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
|
21
|
-
new(
|
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
|
-
|
26
|
+
ampel_semaphore,
|
26
27
|
warning_jenkins,
|
27
28
|
lights,
|
28
29
|
sleep: 10
|
29
30
|
)
|
30
|
-
@
|
31
|
-
|
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
|
-
@
|
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
|
-
@
|
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
|
data/lib/ampel_extase/version.rb
CHANGED
@@ -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::
|
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 :
|
24
|
-
AmpelExtase::
|
25
|
+
let :ampel_semaphore do
|
26
|
+
AmpelExtase::SemaphoreStateObserver.new ampel_client
|
25
27
|
end
|
26
28
|
|
27
29
|
let :warning_jenkins1 do
|
28
|
-
AmpelExtase::
|
30
|
+
AmpelExtase::SemaphoreStateObserver.new(warning_client1)
|
29
31
|
end
|
30
32
|
|
31
33
|
let :warning_jenkins2 do
|
32
|
-
AmpelExtase::
|
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
|
-
|
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
|
-
|
70
|
+
semaphore_url: nil
|
69
71
|
)
|
70
|
-
expect(demo_object.instance_eval { @
|
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
|
-
|
124
|
-
|
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.
|
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.
|
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
|