ampel_extase 0.0.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 022ff48198a22a7cfe5cc1420e65700947e0172f
4
+ data.tar.gz: 2f3be2fc324ec1db920c33eec571df7b0f017e99
5
+ SHA512:
6
+ metadata.gz: 609b536235aa262677b606e148e05beb87594fbe356181391bad36a3265ba13ab0f160e9fdc9ab053f79917930c1ddf9d7f225aa375a51e9b3a3889d945ea3ba
7
+ data.tar.gz: 3e8b6f53050e98aa865f977c5c6a410f351bbe5b566780621d667f35d283318f54e5520f3f0fac5db8b4ac155b12c4afe1cd9c9acec6117bce9a6d366587f916
@@ -0,0 +1,9 @@
1
+ .*.sw[pon]
2
+ .DS_Store
3
+ .build
4
+ .bundle
5
+ .rvmrc
6
+ Gemfile.lock
7
+ coverage
8
+ pkg
9
+ tags
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # vim: set filetype=ruby et sw=2 ts=2:
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gemspec
File without changes
@@ -0,0 +1,27 @@
1
+ # vim: set filetype=ruby et sw=2 ts=2:
2
+
3
+ require 'gem_hadar'
4
+
5
+ GemHadar do
6
+ name 'ampel_extase'
7
+ author 'Florian Frank'
8
+ email 'flori@ping.de'
9
+ homepage "http://github.com/flori/#{name}"
10
+ summary 'Library to control the build traffic light'
11
+ description "#{summary}. Yes, we can…"
12
+ licenses << 'GPL-2'
13
+ test_dir 'spec'
14
+ ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock', '.rvmrc', 'coverage',
15
+ 'tags', '.bundle', '.DS_Store', '.build'
16
+
17
+ readme 'README.md'
18
+ executables.merge Dir['bin/*'].map { |x| File.basename(x) }
19
+
20
+ dependency 'tins', '~>1.0'
21
+ dependency 'socket_switcher'
22
+ development_dependency 'simplecov', '~>0.9'
23
+ development_dependency 'rspec', '~>3.0'
24
+ development_dependency 'byebug'
25
+
26
+ default_task_dependencies :spec
27
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
@@ -0,0 +1,50 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # stub: ampel_extase 0.0.0 ruby lib
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "ampel_extase"
6
+ s.version = "0.0.0"
7
+
8
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
9
+ s.require_paths = ["lib"]
10
+ s.authors = ["Florian Frank"]
11
+ s.date = "2015-01-02"
12
+ s.description = "Library to control the build traffic light. Yes, we can\u{2026}"
13
+ s.email = "flori@ping.de"
14
+ s.executables = ["ampel_control"]
15
+ s.extra_rdoc_files = ["README.md", "lib/ampel_extase.rb", "lib/ampel_extase/build_state.rb", "lib/ampel_extase/controller.rb", "lib/ampel_extase/jenkins_client.rb", "lib/ampel_extase/light_switcher.rb", "lib/ampel_extase/version.rb"]
16
+ s.files = [".gitignore", "Gemfile", "README.md", "Rakefile", "VERSION", "ampel_extase.gemspec", "bin/ampel_control", "lib/ampel_extase.rb", "lib/ampel_extase/build_state.rb", "lib/ampel_extase/controller.rb", "lib/ampel_extase/jenkins_client.rb", "lib/ampel_extase/light_switcher.rb", "lib/ampel_extase/version.rb", "spec/ampel_extase/jenkins_client_spec.rb", "spec/ampel_extase/light_switcher_spec.rb", "spec/spec_helper.rb"]
17
+ s.homepage = "http://github.com/flori/ampel_extase"
18
+ s.licenses = ["GPL-2"]
19
+ s.rdoc_options = ["--title", "AmpelExtase - Library to control the build traffic light", "--main", "README.md"]
20
+ s.rubygems_version = "2.2.2"
21
+ s.summary = "Library to control the build traffic light"
22
+ s.test_files = ["spec/ampel_extase/jenkins_client_spec.rb", "spec/ampel_extase/light_switcher_spec.rb", "spec/spec_helper.rb"]
23
+
24
+ if s.respond_to? :specification_version then
25
+ s.specification_version = 4
26
+
27
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
28
+ s.add_development_dependency(%q<gem_hadar>, ["~> 1.0.0"])
29
+ s.add_development_dependency(%q<simplecov>, ["~> 0.9"])
30
+ s.add_development_dependency(%q<rspec>, ["~> 3.0"])
31
+ s.add_development_dependency(%q<byebug>, [">= 0"])
32
+ s.add_runtime_dependency(%q<tins>, ["~> 1.0"])
33
+ s.add_runtime_dependency(%q<socket_switcher>, [">= 0"])
34
+ else
35
+ s.add_dependency(%q<gem_hadar>, ["~> 1.0.0"])
36
+ s.add_dependency(%q<simplecov>, ["~> 0.9"])
37
+ s.add_dependency(%q<rspec>, ["~> 3.0"])
38
+ s.add_dependency(%q<byebug>, [">= 0"])
39
+ s.add_dependency(%q<tins>, ["~> 1.0"])
40
+ s.add_dependency(%q<socket_switcher>, [">= 0"])
41
+ end
42
+ else
43
+ s.add_dependency(%q<gem_hadar>, ["~> 1.0.0"])
44
+ s.add_dependency(%q<simplecov>, ["~> 0.9"])
45
+ s.add_dependency(%q<rspec>, ["~> 3.0"])
46
+ s.add_dependency(%q<byebug>, [">= 0"])
47
+ s.add_dependency(%q<tins>, ["~> 1.0"])
48
+ s.add_dependency(%q<socket_switcher>, [">= 0"])
49
+ end
50
+ end
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'ampel_extase'
4
+
5
+ serial = ENV['SERIAL'] or
6
+ fail 'need env var SERIAL for path to serial port'
7
+ jenkins_url = ENV['JENKINS_URL'] or
8
+ fail 'need env var JENKINS_URL of the form http://test2.local:8080/job/foo'
9
+ sleep_duration = (ENV['SLEEP'] || 10).to_i
10
+
11
+ AmpelExtase::Controller.new(
12
+ serial,
13
+ jenkins_url,
14
+ debug: true,
15
+ sleep: sleep_duration,
16
+ ).start
@@ -0,0 +1,6 @@
1
+ module AmpelExtase
2
+ end
3
+
4
+ require 'tins/xt'
5
+ require 'ampel_extase/version'
6
+ require 'ampel_extase/controller'
@@ -0,0 +1,32 @@
1
+ class AmpelExtase::BuildState
2
+ def self.for(a = nil)
3
+ a ||= [ "N/A", nil ]
4
+ new(*a)
5
+ end
6
+
7
+ def initialize(last_result, is_building)
8
+ @last_result, @is_building = last_result, is_building
9
+ end
10
+
11
+ attr_reader :last_result
12
+
13
+ def building?
14
+ !!@is_building
15
+ end
16
+
17
+ def to_a
18
+ return @last_result, @is_building
19
+ end
20
+
21
+ def ==(other)
22
+ to_a == other.to_a
23
+ end
24
+
25
+ def to_s
26
+ if building?
27
+ "#{@last_result} (building)"
28
+ else
29
+ @last_result.to_s
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'ampel_extase/jenkins_client'
4
+ require 'ampel_extase/light_switcher'
5
+ require 'ampel_extase/build_state'
6
+
7
+ class AmpelExtase::Controller
8
+ def initialize(serial, jenkins_url, debug: false, sleep: 10)
9
+ @jenkins = AmpelExtase::JenkinsClient.new(jenkins_url, debug: debug)
10
+ check_jenkins
11
+ @lights = AmpelExtase::LightSwitcher.new(serial, debug: debug)
12
+ check_lights
13
+ @sleep = sleep
14
+ @build_state = AmpelExtase::BuildState.for
15
+ end
16
+
17
+ def start
18
+ puts "starting controller loop"
19
+ loop do
20
+ begin
21
+ perform
22
+ rescue => e
23
+ warn "Caught: #{e.class}: #{e}\n#{e.backtrace * ?\n}"
24
+ crashed
25
+ end
26
+ sleep_duration
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def sleep_duration
33
+ puts "sleep for #@sleep seconds"
34
+ sleep @sleep
35
+ end
36
+
37
+ def perform
38
+ @crashed = false
39
+ on_state_change do |state|
40
+ perform_switch state
41
+ end
42
+ end
43
+
44
+ def perform_switch(state)
45
+ case state.last_result
46
+ when 'SUCCESS'
47
+ @lights.green.on
48
+ @lights.red.off
49
+ when 'FAILURE', 'ABORTED'
50
+ @lights.red.on
51
+ if state.building?
52
+ @lights.green.on
53
+ else
54
+ @lights.green.off
55
+ end
56
+ end
57
+ end
58
+
59
+ def on_state_change
60
+ new_state = AmpelExtase::BuildState.for [ last_result, building? ]
61
+ if new_state == @build_state
62
+ puts "state did not change, is still #@build_state => do nothing"
63
+ else
64
+ puts "state changed from #@build_state to #{new_state} => taking action"
65
+ yield new_state
66
+ end
67
+ ensure
68
+ @build_state = new_state
69
+ end
70
+
71
+ def last_result
72
+ @jenkins.fetch_build(:last_completed_build)['result']
73
+ end
74
+
75
+ def building?
76
+ @jenkins.fetch_build(:last_build)['building']
77
+ end
78
+
79
+ def crashed
80
+ return if @crashed
81
+ for light in @lights
82
+ light.off
83
+ end
84
+ rescue
85
+ ensure
86
+ @crashed = true
87
+ end
88
+
89
+ def check_lights
90
+ puts "checking lights configuration"
91
+ for light in @lights
92
+ light.on
93
+ end
94
+ sleep 1
95
+ for light in @lights
96
+ light.off
97
+ end
98
+ sleep 1
99
+ puts "OK"
100
+ end
101
+
102
+ def check_jenkins
103
+ puts "checking jenkins configuration"
104
+ @jenkins.fetch and puts "OK"
105
+ end
106
+ end
@@ -0,0 +1,52 @@
1
+ require 'open-uri'
2
+ require 'tins/xt'
3
+ require 'json'
4
+ require 'uri'
5
+
6
+ module AmpelExtase
7
+ class JenkinsClient
8
+ def initialize(url, debug: false)
9
+ url = URI.parse(url.to_s) unless URI::HTTP === url
10
+ @url, @debug = url, debug
11
+ end
12
+
13
+ def api_url(*path)
14
+ [ @url, *path, 'api', 'json' ].compact * '/'
15
+ end
16
+
17
+ def console_url(number)
18
+ [ @url, number, 'consoleText' ] * '/'
19
+ end
20
+
21
+ def fetch(url = api_url)
22
+ @debug and STDERR.puts "Fetching #{url.to_s.inspect}."
23
+ JSON open(url).read
24
+ rescue => e
25
+ e.message << " for #{url.inspect}"
26
+ raise
27
+ end
28
+
29
+ def fetch_build(type)
30
+ url = if sym = type.ask_and_send(:to_sym)
31
+ key = sym.to_s.camelize(:lower)
32
+ key[0, 1] = key[0, 1].downcase
33
+ api_url(key)
34
+ else
35
+ api_url(type)
36
+ end
37
+ fetch url
38
+ end
39
+
40
+ def fetch_build_revision(type)
41
+ data = fetch_build(type)
42
+ data['actions'].find { |x| x.keys.include?('lastBuiltRevision') }['lastBuiltRevision']['SHA1']
43
+ rescue
44
+ nil
45
+ end
46
+
47
+ def fetch_console_text(type)
48
+ build = fetch_build(type)
49
+ open(console_url(build['number'])).read
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,32 @@
1
+ require 'socket_switcher'
2
+
3
+ module AmpelExtase
4
+ class LightSwitcher
5
+ def initialize(serial, debug: false)
6
+ @port = SocketSwitcher::Port.new(serial, debug: debug)
7
+ end
8
+
9
+ attr_reader :port
10
+
11
+ def green
12
+ @port.device(0)
13
+ end
14
+
15
+ def red
16
+ @port.device(1)
17
+ end
18
+
19
+ def aux
20
+ @port.device(2)
21
+ end
22
+
23
+ def each(&block)
24
+ [
25
+ :green,
26
+ :red,
27
+ # not in use for now :aux,
28
+ ].map { |color| __send__(color) }.each(&block)
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,8 @@
1
+ module AmpelExtase
2
+ # AmpelExtase version
3
+ VERSION = '0.0.0'
4
+ VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
+ VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
+ VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
7
+ VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
8
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe AmpelExtase::JenkinsClient do
4
+ pending
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe AmpelExtase::LightSwitcher do
4
+ pending
5
+ end
@@ -0,0 +1,9 @@
1
+ require 'simplecov'
2
+ if ENV['START_SIMPLECOV'].to_i == 1
3
+ SimpleCov.start do
4
+ add_filter "#{File.basename(File.dirname(__FILE__))}/"
5
+ end
6
+ end
7
+ require 'rspec'
8
+ require 'byebug'
9
+ require 'ampel_extase'
metadata ADDED
@@ -0,0 +1,158 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ampel_extase
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Florian Frank
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: gem_hadar
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: simplecov
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.9'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.9'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: tins
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: socket_switcher
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Library to control the build traffic light. Yes, we can…
98
+ email: flori@ping.de
99
+ executables:
100
+ - ampel_control
101
+ extensions: []
102
+ extra_rdoc_files:
103
+ - README.md
104
+ - lib/ampel_extase.rb
105
+ - lib/ampel_extase/build_state.rb
106
+ - lib/ampel_extase/controller.rb
107
+ - lib/ampel_extase/jenkins_client.rb
108
+ - lib/ampel_extase/light_switcher.rb
109
+ - lib/ampel_extase/version.rb
110
+ files:
111
+ - ".gitignore"
112
+ - Gemfile
113
+ - README.md
114
+ - Rakefile
115
+ - VERSION
116
+ - ampel_extase.gemspec
117
+ - bin/ampel_control
118
+ - lib/ampel_extase.rb
119
+ - lib/ampel_extase/build_state.rb
120
+ - lib/ampel_extase/controller.rb
121
+ - lib/ampel_extase/jenkins_client.rb
122
+ - lib/ampel_extase/light_switcher.rb
123
+ - lib/ampel_extase/version.rb
124
+ - spec/ampel_extase/jenkins_client_spec.rb
125
+ - spec/ampel_extase/light_switcher_spec.rb
126
+ - spec/spec_helper.rb
127
+ homepage: http://github.com/flori/ampel_extase
128
+ licenses:
129
+ - GPL-2
130
+ metadata: {}
131
+ post_install_message:
132
+ rdoc_options:
133
+ - "--title"
134
+ - AmpelExtase - Library to control the build traffic light
135
+ - "--main"
136
+ - README.md
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubyforge_project:
151
+ rubygems_version: 2.2.2
152
+ signing_key:
153
+ specification_version: 4
154
+ summary: Library to control the build traffic light
155
+ test_files:
156
+ - spec/ampel_extase/jenkins_client_spec.rb
157
+ - spec/ampel_extase/light_switcher_spec.rb
158
+ - spec/spec_helper.rb