darrinholst-build-lights 0.0.0 → 0.0.1

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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.0
1
+ 0.0.1
data/bin/buildlights CHANGED
@@ -1,32 +1,8 @@
1
- #!ruby
1
+ #!/usr/bin/env ruby
2
2
 
3
- require 'rubygems'
4
- require 'build-lights'
3
+ lib_dir = File.join(File.dirname(__FILE__), '..', 'lib')
4
+ $LOAD_PATH.unshift lib_dir if File.directory?(lib_dir)
5
5
 
6
- config = BuildLights::Config.new
6
+ require 'buildlights'
7
7
 
8
- failed_jobs = []
9
-
10
- url = config.ccnet_url
11
-
12
- if(url)
13
- puts "checking #{url}"
14
- failed_jobs << BuildLights::CcNetXmlScanner.new(url)
15
- else
16
- puts "skipping ccnet, ccnet_url not found"
17
- end
18
-
19
- url = config.hudson_url
20
-
21
- if(url)
22
- puts "checking #{url}"
23
- failed_jobs << BuildLights::HudsonFeedScanner.new(url)
24
- else
25
- puts "skipping hudson, hudson_url not found"
26
- end
27
-
28
- if(failed_jobs.compact.empty?)
29
- BuildLights::Lights.new.success
30
- else
31
- BuildLights::Lights.new.failed
32
- end
8
+ BuildLights.cli ARGV
data/build-lights.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{build-lights}
5
- s.version = "0.0.0"
5
+ s.version = "0.0.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Darrin Holst"]
9
- s.date = %q{2009-08-12}
9
+ s.date = %q{2009-08-13}
10
10
  s.default_executable = %q{buildlights}
11
11
  s.email = %q{darrinholst@gmail.com}
12
12
  s.executables = ["buildlights"]
@@ -23,17 +23,12 @@ Gem::Specification.new do |s|
23
23
  "VERSION",
24
24
  "bin/buildlights",
25
25
  "build-lights.gemspec",
26
- "lib/bottle_rocket.rb",
27
- "lib/build_lights.rb",
28
- "lib/ccnet_xml_scanner.rb",
29
- "lib/config.rb",
30
- "lib/feed_parser.rb",
31
- "lib/hudson_feed_scanner.rb",
26
+ "lib/buildlights.rb",
27
+ "lib/ccnet.rb",
28
+ "lib/hudson.rb",
32
29
  "lib/lights.rb",
33
- "lib/xml_parser.rb",
34
- "test/ccnet_xml_scanner_test.rb",
35
- "test/config_test.rb",
36
- "test/hudson_feed_scanner_test.rb",
30
+ "test/ccnet_test.rb",
31
+ "test/hudson_test.rb",
37
32
  "test/lights_test.rb",
38
33
  "test/test_helper.rb"
39
34
  ]
@@ -44,9 +39,8 @@ Gem::Specification.new do |s|
44
39
  s.rubygems_version = %q{1.3.5}
45
40
  s.summary = %q{build monitor that will trigger lights via x10}
46
41
  s.test_files = [
47
- "test/ccnet_xml_scanner_test.rb",
48
- "test/config_test.rb",
49
- "test/hudson_feed_scanner_test.rb",
42
+ "test/ccnet_test.rb",
43
+ "test/hudson_test.rb",
50
44
  "test/lights_test.rb",
51
45
  "test/test_helper.rb"
52
46
  ]
@@ -0,0 +1,38 @@
1
+ require 'optparse'
2
+ require 'ccnet'
3
+ require 'hudson'
4
+ require 'lights'
5
+
6
+ module BuildLights
7
+ extend self
8
+
9
+ def cli(args)
10
+ urls = []
11
+
12
+ OptionParser.new do |opts|
13
+ opts.banner = "Usage: buildlights [options]"
14
+
15
+ opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
16
+ $verbose = true
17
+ end
18
+
19
+ opts.on("--hudson [URL]", "Hudson url") do |url|
20
+ urls << [Hudson, url]
21
+ end
22
+
23
+ opts.on("--ccnet [URL]", "CruiseControl.net url") do |url|
24
+ urls << [CcNet, url]
25
+ end
26
+ end.parse!
27
+
28
+ raise "must supply at least one url to check" if urls.empty?
29
+
30
+ failed_jobs = []
31
+
32
+ urls.each do |url|
33
+ failed_jobs << url.first.new(url.last).failed_jobs
34
+ end
35
+
36
+ Lights.new.send(failed_jobs.flatten.empty? ? :success : :failed)
37
+ end
38
+ end
data/lib/ccnet.rb ADDED
@@ -0,0 +1,28 @@
1
+ require 'hpricot'
2
+ require 'open-uri'
3
+
4
+ module BuildLights
5
+ class CcNet
6
+ def initialize(uri, parser = XmlParser)
7
+ puts "CruiseControl.net url: #{uri}" if $verbose
8
+ @doc = parser.parse(uri)
9
+ end
10
+
11
+ def failed_jobs
12
+ @doc.search(:Project).map do |project|
13
+ name = project[:name]
14
+ status = project[:lastBuildStatus]
15
+ puts "#{name} -> #{status}" if $verbose
16
+ failed = /FAIL/i.match(status)
17
+ name if failed
18
+ end.compact
19
+ end
20
+ end
21
+
22
+ class XmlParser
23
+ def self.parse(uri)
24
+ Hpricot::XML(open(uri))
25
+ end
26
+ end
27
+ end
28
+
data/lib/hudson.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'simple-rss'
2
+ require 'open-uri'
3
+
4
+ module BuildLights
5
+ class Hudson
6
+ def initialize(uri, parser = FeedParser)
7
+ puts "Hudson url: #{uri}" if $verbose
8
+ @feed = parser.parse uri
9
+ end
10
+
11
+ def failed_jobs
12
+ @feed.entries.each.map do |entry|
13
+ match = /(.*) #\d+ (.*)/.match(entry.title)
14
+ raise "Invalid rss title #{entry.title}" unless match
15
+ name = match[1]
16
+ status = match[2]
17
+ puts "#{name} -> #{status}" if $verbose
18
+ failed = /FAIL/i.match(status)
19
+ name if failed
20
+ end.compact
21
+ end
22
+ end
23
+
24
+ class FeedParser
25
+ def self.parse(uri)
26
+ SimpleRSS.parse(open(uri))
27
+ end
28
+ end
29
+ end
data/lib/lights.rb CHANGED
@@ -1,20 +1,39 @@
1
- require 'bottle_rocket'
1
+ module BuildLights
2
+ class Lights
3
+ GREEN = 1
4
+ RED = 2
2
5
 
3
- class BuildLights::Lights
4
- GREEN = 1
5
- RED = 2
6
-
7
- def initialize(implementation = BuildLights::BottleRocket)
8
- @implementation = implementation
9
- end
6
+ def initialize(implementation = BottleRocket)
7
+ @implementation = implementation
8
+ end
10
9
 
11
- def success
12
- @implementation.turn_on GREEN
13
- @implementation.turn_off RED
14
- end
10
+ def success
11
+ @implementation.turn_on GREEN
12
+ @implementation.turn_off RED
13
+ end
15
14
 
16
- def failed
17
- @implementation.turn_on RED
18
- @implementation.turn_off GREEN
15
+ def failed
16
+ @implementation.turn_on RED
17
+ @implementation.turn_off GREEN
18
+ end
19
19
  end
20
- end
20
+
21
+ class BottleRocket
22
+ def self.turn_on(unit, house='A')
23
+ send('on', unit, house)
24
+ end
25
+
26
+ def self.turn_off(unit, house='A')
27
+ send('off', unit, house)
28
+ end
29
+
30
+ private
31
+
32
+ def self.send(command, unit, house)
33
+ cmd = "br -v --house=#{house} --#{command}=#{unit}"
34
+ puts "sending X10 command -> #{cmd}" if $verbose
35
+ system cmd
36
+ raise "bottlerocket command failed with status code #{$?.exitstatus}" if $?.exitstatus > 0
37
+ end
38
+ end
39
+ end
@@ -1,30 +1,29 @@
1
1
  require 'test_helper'
2
- require 'ccnet_xml_scanner'
3
2
 
4
- class CcNetXmlScannerTest < Test::Unit::TestCase
3
+ class CcNetTest < Test::Unit::TestCase
5
4
  URI = "some uri"
6
5
 
7
6
  def test_failed_jobs
8
7
  parser = parser_for(URI, ["job 1", "Failed"], ["job 2", "Failed"])
9
- scanner = CcNetXmlScanner.new(URI, parser)
8
+ scanner = BuildLights::CcNet.new(URI, parser)
10
9
  assert_equal(["job 1", "job 2"], scanner.failed_jobs)
11
10
  end
12
11
 
13
12
  def test_successful_jobs
14
13
  parser = parser_for(URI, ["job 1", "Success"], ["job 2", "Success"])
15
- scanner = CcNetXmlScanner.new(URI, parser)
14
+ scanner = BuildLights::CcNet.new(URI, parser)
16
15
  assert_equal([], scanner.failed_jobs)
17
16
  end
18
17
 
19
18
  def test_mixed_jobs
20
19
  parser = parser_for(URI, ["job 1", "Success"], ["job 2", "Failed"])
21
- scanner = CcNetXmlScanner.new(URI, parser)
20
+ scanner = BuildLights::CcNet.new(URI, parser)
22
21
  assert_equal(["job 2"], scanner.failed_jobs)
23
22
  end
24
23
 
25
24
  def test_mixed_case
26
25
  parser = parser_for(URI, ["job 1", "FAILED"], ["job 2", "SUCCESS"], ["job 3", "FAIL"])
27
- scanner = CcNetXmlScanner.new(URI, parser)
26
+ scanner = BuildLights::CcNet.new(URI, parser)
28
27
  assert_equal(["job 1", "job 3"], scanner.failed_jobs)
29
28
  end
30
29
 
@@ -1,30 +1,29 @@
1
1
  require 'test_helper'
2
- require 'hudson_feed_scanner'
3
2
 
4
- class HudsonFeedScannerTest < Test::Unit::TestCase
3
+ class HudsonTest < Test::Unit::TestCase
5
4
  URI = "some uri"
6
5
 
7
6
  def test_all_successful
8
7
  parser = feed_parser_for(URI, "job 1 #1 (SUCCESS)", "job 2 #1 (SUCCESS)")
9
- scanner = HudsonFeedScanner.new(URI, parser)
8
+ scanner = BuildLights::Hudson.new(URI, parser)
10
9
  assert_equal([], scanner.failed_jobs)
11
10
  end
12
11
 
13
12
  def test_all_failed
14
13
  parser = feed_parser_for(URI, "job 1 #1 (FAILED)", "job 2 #1 (FAILED)")
15
- scanner = HudsonFeedScanner.new(URI, parser)
14
+ scanner = BuildLights::Hudson.new(URI, parser)
16
15
  assert_equal(['job 1', 'job 2'], scanner.failed_jobs)
17
16
  end
18
17
 
19
18
  def test_mixed
20
19
  parser = feed_parser_for(URI, "job 1 #1 (SUCCESS)", "job 2 #1 (FAILED)", "job 3 #1 (SUCCESS)")
21
- scanner = HudsonFeedScanner.new(URI, parser)
20
+ scanner = BuildLights::Hudson.new(URI, parser)
22
21
  assert_equal(['job 2'], scanner.failed_jobs)
23
22
  end
24
23
 
25
24
  def test_mixed_with_lower_case
26
25
  parser = feed_parser_for(URI, "job 1 #1 (success)", "job 2 #1 (failed)", "job 3 #1 (success)")
27
- scanner = HudsonFeedScanner.new(URI, parser)
26
+ scanner = BuildLights::Hudson.new(URI, parser)
28
27
  assert_equal(['job 2'], scanner.failed_jobs)
29
28
  end
30
29
 
data/test/lights_test.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'test_helper'
2
- require 'lights'
3
2
 
4
3
  class LightsTest < Test::Unit::TestCase
5
4
  def test_successful_builds
@@ -7,7 +6,7 @@ class LightsTest < Test::Unit::TestCase
7
6
  impl.expects(:turn_on).with(1)
8
7
  impl.expects(:turn_off).with(2)
9
8
 
10
- Lights.new(impl).success
9
+ BuildLights::Lights.new(impl).success
11
10
  end
12
11
 
13
12
  def test_failed_builds
@@ -15,6 +14,6 @@ class LightsTest < Test::Unit::TestCase
15
14
  impl.expects(:turn_on).with(2)
16
15
  impl.expects(:turn_off).with(1)
17
16
 
18
- Lights.new(impl).failed
17
+ BuildLights::Lights.new(impl).failed
19
18
  end
20
19
  end
data/test/test_helper.rb CHANGED
@@ -1,9 +1,10 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
1
4
  require 'rubygems'
2
5
  require 'test/unit'
3
6
  require 'mocha'
4
-
5
- $LOAD_PATH.unshift(File.dirname(__FILE__))
6
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
+ require 'buildlights'
7
8
 
8
9
  class Test::Unit::TestCase
9
10
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: darrinholst-build-lights
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darrin Holst
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-12 00:00:00 -07:00
12
+ date: 2009-08-13 00:00:00 -07:00
13
13
  default_executable: buildlights
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -50,17 +50,12 @@ files:
50
50
  - VERSION
51
51
  - bin/buildlights
52
52
  - build-lights.gemspec
53
- - lib/bottle_rocket.rb
54
- - lib/build_lights.rb
55
- - lib/ccnet_xml_scanner.rb
56
- - lib/config.rb
57
- - lib/feed_parser.rb
58
- - lib/hudson_feed_scanner.rb
53
+ - lib/buildlights.rb
54
+ - lib/ccnet.rb
55
+ - lib/hudson.rb
59
56
  - lib/lights.rb
60
- - lib/xml_parser.rb
61
- - test/ccnet_xml_scanner_test.rb
62
- - test/config_test.rb
63
- - test/hudson_feed_scanner_test.rb
57
+ - test/ccnet_test.rb
58
+ - test/hudson_test.rb
64
59
  - test/lights_test.rb
65
60
  - test/test_helper.rb
66
61
  has_rdoc: false
@@ -91,8 +86,7 @@ signing_key:
91
86
  specification_version: 3
92
87
  summary: build monitor that will trigger lights via x10
93
88
  test_files:
94
- - test/ccnet_xml_scanner_test.rb
95
- - test/config_test.rb
96
- - test/hudson_feed_scanner_test.rb
89
+ - test/ccnet_test.rb
90
+ - test/hudson_test.rb
97
91
  - test/lights_test.rb
98
92
  - test/test_helper.rb
data/lib/bottle_rocket.rb DELETED
@@ -1,15 +0,0 @@
1
- class BuildLights::BottleRocket
2
- def self.turn_on(unit, house='A')
3
- send('on', unit, house)
4
- end
5
-
6
- def self.turn_off(unit, house='A')
7
- send('off', unit, house)
8
- end
9
-
10
- private
11
-
12
- def self.send(command, unit, house)
13
- puts `br -v --house=#{house} --#{command}=#{unit}`
14
- end
15
- end
data/lib/build_lights.rb DELETED
@@ -1,7 +0,0 @@
1
- module BuildLights
2
- end
3
-
4
- require 'config'
5
- require 'ccnet_xml_scanner'
6
- require 'hudson_feed_scanner'
7
- require 'lights'
@@ -1,13 +0,0 @@
1
- require 'xml_parser'
2
-
3
- class BuildLights::CcNetXmlScanner
4
- def initialize(uri, parser = BuildLights::XmlParser)
5
- @doc = parser.parse(uri)
6
- end
7
-
8
- def failed_jobs
9
- @doc.search(:Project).map do |project|
10
- project[:name] if project[:lastBuildStatus] =~ /FAIL/i
11
- end.compact
12
- end
13
- end
data/lib/config.rb DELETED
@@ -1,31 +0,0 @@
1
- require 'build-lights'
2
- require 'yaml'
3
-
4
- class BuildLights::Config
5
- HOME_LOCATION = "#{ENV['HOME']}"
6
- SYSTEM_LOCATION = "/etc"
7
-
8
- def initialize
9
- [HOME_LOCATION, SYSTEM_LOCATION].each do |path|
10
- config_file = File.join(path, ".buildlights")
11
- puts config_file
12
- if File.exists?(config_file) && File.file?(config_file)
13
- config = YAML.load_file(config_file)
14
-
15
- if(config)
16
- config.each_pair do |key, value|
17
- self.class.send(:attr_reader, key.to_sym)
18
- instance_variable_set("@#{key}".to_sym, value)
19
- end
20
- end
21
-
22
- return
23
- end
24
- end
25
-
26
- raise "No configuration file found"
27
- end
28
-
29
- def method_missing(*args)
30
- end
31
- end
data/lib/feed_parser.rb DELETED
@@ -1,8 +0,0 @@
1
- require 'simple-rss'
2
- require 'open-uri'
3
-
4
- class BuildLights::FeedParser
5
- def self.parse(uri)
6
- SimpleRSS.parse(open(uri))
7
- end
8
- end
@@ -1,15 +0,0 @@
1
- require 'feed_parser'
2
-
3
- class BuildLights::HudsonFeedScanner
4
- def initialize(uri, parser = BuildLights::FeedParser)
5
- @feed = parser.parse uri
6
- end
7
-
8
- def failed_jobs
9
- @feed.entries.each.map do |entry|
10
- match = /(.*) #\d+ (.*)/.match(entry.title)
11
- raise "Invalid rss title #{entry.title}" unless match
12
- match[1] if /FAIL/i.match(match[2])
13
- end.compact
14
- end
15
- end
data/lib/xml_parser.rb DELETED
@@ -1,8 +0,0 @@
1
- require 'hpricot'
2
- require 'open-uri'
3
-
4
- class BuildLights::XmlParser
5
- def self.parse(uri)
6
- Hpricot::XML(open(uri))
7
- end
8
- end
data/test/config_test.rb DELETED
@@ -1,70 +0,0 @@
1
- require 'test_helper'
2
- require 'config'
3
- require 'tempfile'
4
- require 'fileutils'
5
-
6
- class BuildLights::Config
7
- HOME_LOCATION = File.join(Dir.tmpdir, "buildlights_unittests", "home")
8
- SYSTEM_LOCATION = File.join(Dir.tmpdir, "buildlights_unittests", "system")
9
- end
10
-
11
- class ConfigTest < Test::Unit::TestCase
12
- def setup
13
- FileUtils.rm_rf BuildLights::Config::HOME_LOCATION
14
- FileUtils.rm_rf BuildLights::Config::SYSTEM_LOCATION
15
- FileUtils.mkdir_p BuildLights::Config::HOME_LOCATION
16
- FileUtils.mkdir_p BuildLights::Config::SYSTEM_LOCATION
17
- end
18
-
19
- def test_no_config_found
20
- assert_raise RuntimeError do
21
- BuildLights::Config.new
22
- end
23
- end
24
-
25
- def test_config_found_in_home_dir
26
- add_file_to_home
27
- assert_home_file_used
28
- end
29
-
30
- def test_config_found_in_home_dir_is_used_first
31
- add_file_to_home
32
- add_file_to_system
33
- assert_home_file_used
34
- end
35
-
36
- def test_config_found_in_system_dir
37
- add_file_to_system
38
- assert_system_file_used
39
- end
40
-
41
- private
42
-
43
- def add_file_to_home
44
- File.open(File.join(BuildLights::Config::HOME_LOCATION, ".buildlights"), "w") do |f|
45
- f.puts "ccnet_url: ccnet_url_from_home"
46
- f.puts "hudson_url: hudson_url_from_home"
47
- end
48
- end
49
-
50
- def add_file_to_system
51
- File.open(File.join(BuildLights::Config::SYSTEM_LOCATION, ".buildlights"), "w") do |f|
52
- f.puts "ccnet_url: ccnet_url_from_system"
53
- f.puts "hudson_url: hudson_url_from_system"
54
- end
55
- end
56
-
57
- def assert_home_file_used
58
- assert_attributes(BuildLights::Config.new, "home")
59
- end
60
-
61
- def assert_system_file_used
62
- assert_attributes(BuildLights::Config.new, "system")
63
- end
64
-
65
- def assert_attributes(config, home_or_system)
66
- assert_equal("hudson_url_from_#{home_or_system}", config.hudson_url)
67
- assert_equal("ccnet_url_from_#{home_or_system}", config.ccnet_url)
68
- assert_equal(nil, config.foo_url)
69
- end
70
- end