hudson-remote-api 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2010 Dru Ibarra
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README CHANGED
@@ -4,8 +4,11 @@ Usage:
4
4
 
5
5
  require 'hudson-remote-api'
6
6
 
7
- # Configuration
8
- Hudson[:host] = 'localhost'
7
+ # Auto Configuration sets Hudson[:url]
8
+ Hudson.auto_config
9
+
10
+ # Manual Configuration
11
+ Hudson[:url] = 'http://localhost:8080'
9
12
  Hudson[:user] = 'hudson'
10
13
  Hudson[:password] = 'password'
11
14
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -1,22 +1,24 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{hudson-remote-api}
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Dru Ibarra"]
12
- s.date = %q{2010-09-01}
12
+ s.date = %q{2010-09-03}
13
13
  s.description = %q{Connect to Hudson's remote web API}
14
14
  s.email = %q{Druwerd@gmail.com}
15
15
  s.extra_rdoc_files = [
16
- "README"
16
+ "LICENSE",
17
+ "README"
17
18
  ]
18
19
  s.files = [
19
20
  ".gitignore",
21
+ "LICENSE",
20
22
  "README",
21
23
  "Rakefile",
22
24
  "VERSION",
@@ -24,8 +26,16 @@ Gem::Specification.new do |s|
24
26
  "lib/hudson-remote-api.rb",
25
27
  "lib/hudson-remote-api/build.rb",
26
28
  "lib/hudson-remote-api/build_queue.rb",
29
+ "lib/hudson-remote-api/config.rb",
27
30
  "lib/hudson-remote-api/errors.rb",
28
- "lib/hudson-remote-api/job.rb"
31
+ "lib/hudson-remote-api/job.rb",
32
+ "lib/hudson-remote-api/multicast.rb",
33
+ "test/test_hudson_build.rb",
34
+ "test/test_hudson_build_queue.rb",
35
+ "test/test_hudson_config.rb",
36
+ "test/test_hudson_job.rb",
37
+ "test/test_hudson_multicast.rb",
38
+ "test/test_hudson_remote_api.rb"
29
39
  ]
30
40
  s.homepage = %q{http://github.com/Druwerd/hudson-remote-api}
31
41
  s.rdoc_options = ["--charset=UTF-8"]
@@ -33,6 +43,14 @@ Gem::Specification.new do |s|
33
43
  s.rubyforge_project = %q{hudson-remote-api}
34
44
  s.rubygems_version = %q{1.3.7}
35
45
  s.summary = %q{Connect to Hudson's remote web API}
46
+ s.test_files = [
47
+ "test/test_hudson_build.rb",
48
+ "test/test_hudson_build_queue.rb",
49
+ "test/test_hudson_config.rb",
50
+ "test/test_hudson_job.rb",
51
+ "test/test_hudson_multicast.rb",
52
+ "test/test_hudson_remote_api.rb"
53
+ ]
36
54
 
37
55
  if s.respond_to? :specification_version then
38
56
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
@@ -3,35 +3,35 @@
3
3
  # Author:: Dru Ibarra
4
4
 
5
5
  require 'net/http'
6
+ require 'uri'
6
7
  require 'rexml/document'
7
8
  require 'cgi'
8
9
  require 'yaml'
9
10
  require 'zlib'
11
+ require File.dirname(__FILE__) + '/hudson-remote-api/config.rb'
10
12
 
11
13
  module Hudson
12
- @@settings = {:host => 'localhost', :port => 80, :user => nil, :password => nil}
13
-
14
- def self.[](param)
15
- return @@settings[param]
16
- end
17
-
18
- def self.[]=(param,value)
19
- @@settings[param]=value
20
- end
21
-
22
- def self.settings=(settings)
23
- @@settings = settings
24
- end
25
-
26
- HUDSON_URL_ROOT = ""
27
14
  # Base class for all Hudson objects
28
15
  class HudsonObject
29
-
30
- def self.get_xml(path)
16
+
17
+
18
+ def self.load_xml_api
19
+ @@hudson_xml_api_path = File.join(Hudson[:url], "api/xml")
20
+ @@xml_api_create_item_path = File.join(Hudson[:url], "createItem")
21
+ end
22
+
23
+ load_xml_api
24
+
25
+ def self.get_xml(url)
26
+ puts url
27
+ uri = URI.parse(url)
28
+ host = uri.host
29
+ port = uri.port
30
+ path = uri.path
31
31
  request = Net::HTTP::Get.new(path)
32
32
  request.basic_auth(Hudson[:user], Hudson[:password]) if Hudson[:user] and Hudson[:password]
33
33
  request['Content-Type'] = "text/xml"
34
- response = Net::HTTP.start(Hudson[:host], Hudson[:port]){|http| http.request(request)}
34
+ response = Net::HTTP.start(host, port){|http| http.request(request)}
35
35
 
36
36
  if response.is_a?(Net::HTTPSuccess) or response.is_a?(Net::HTTPRedirection)
37
37
  encoding = response.get_fields("Content-Encoding")
@@ -50,21 +50,29 @@ module Hudson
50
50
  self.class.get_xml(path)
51
51
  end
52
52
 
53
- def send_post_request(path, data={})
53
+ def send_post_request(url, data={})
54
+ uri = URI.parse(url)
55
+ host = uri.host
56
+ port = uri.port
57
+ path = uri.path
54
58
  request = Net::HTTP::Post.new(path)
55
59
  request.basic_auth(Hudson[:user], Hudson[:password]) if Hudson[:user] and Hudson[:password]
56
60
  request.set_form_data(data)
57
61
  #puts request.to_yaml
58
- Net::HTTP.new(Hudson[:host], Hudson[:port]).start{|http| http.request(request)}
62
+ Net::HTTP.new(host, port).start{|http| http.request(request)}
59
63
  end
60
64
 
61
65
  def send_xml_post_request(path, xml)
66
+ uri = URI.parse(url)
67
+ host = uri.host
68
+ port = uri.port
69
+ path = uri.path
62
70
  request = Net::HTTP::Post.new(path)
63
71
  request.basic_auth(Hudson[:user], Hudson[:password]) if Hudson[:user] and Hudson[:password]
64
72
  request.body = xml
65
73
  #puts request.body
66
74
  #puts request.to_yaml
67
- Net::HTTP.new(Hudson[:host], Hudson[:port]).start{|http| http.request(request)}
75
+ Net::HTTP.new(host, port).start{|http| http.request(request)}
68
76
  end
69
77
  end
70
78
  end
@@ -1,4 +1,3 @@
1
- require 'hudson-remote-api'
2
1
  module Hudson
3
2
  class Build < HudsonObject
4
3
  attr_reader :number, :job, :revisions, :result
@@ -12,18 +11,19 @@ module Hudson
12
11
  @number = @job.last_build
13
12
  end
14
13
  @revisions = {}
14
+ @xml_api_build_info_path = File.join(Hudson[:url], "job/#{@job.name}/#{@number}/api/xml")
15
15
  load_build_info
16
16
  end
17
17
 
18
18
  private
19
19
  def load_build_info
20
- path = "#{HUDSON_URL_ROOT}/job/#{@job.name}/#{@number}/api/xml"
21
- build_info_xml = get_xml(path)
22
- build_info_doc = REXML::Document.new(build_info_xml)
23
20
 
24
- if !build_info_doc.elements["/freeStyleBuild/changeSet"].nil?
25
- build_info_doc.elements.each("/freeStyleBuild/changeSet/revision"){|e| @revisions[e.elements["module"].text] = e.elements["revision"].text }
26
- end
21
+ build_info_xml = get_xml(@xml_api_build_info_path)
22
+ build_info_doc = REXML::Document.new(build_info_xml)
23
+
24
+ if !build_info_doc.elements["/freeStyleBuild/changeSet"].nil?
25
+ build_info_doc.elements.each("/freeStyleBuild/changeSet/revision"){|e| @revisions[e.elements["module"].text] = e.elements["revision"].text }
26
+ end
27
27
  end
28
28
  end
29
29
  end
@@ -1,11 +1,16 @@
1
- require 'hudson-remote-api'
2
1
  module Hudson
3
2
  # This class provides an interface to Hudson's build queue
4
3
  class BuildQueue < HudsonObject
4
+
5
+ def self.load_xml_api
6
+ @@xml_api_build_queue_info_path = File.join(Hudson[:url], "queue/api/xml")
7
+ end
8
+
9
+ load_xml_api
10
+
5
11
  # List the jobs in the queue
6
12
  def self.list()
7
- path = "#{HUDSON_URL_ROOT}/queue/api/xml"
8
- xml = get_xml(path)
13
+ xml = get_xml(@@xml_api_build_queue_info_path)
9
14
  queue = []
10
15
  queue_doc = REXML::Document.new(xml)
11
16
  return queue if queue_doc.elements["/queue/item"].nil?
@@ -0,0 +1,46 @@
1
+ require File.dirname(__FILE__) + '/multicast.rb'
2
+
3
+ module Hudson
4
+ # set default settings
5
+ @@settings = {:url => 'http://localhost:8080', :user => nil, :password => nil, :version => nil}
6
+
7
+ def self.[](param)
8
+ return @@settings[param]
9
+ end
10
+
11
+ def self.[]=(param,value)
12
+ param = param.to_sym if param.kind_of?(String)
13
+ if param == :host or param == :url
14
+ value = "http://#{value}" if value !~ /https?:\/\//
15
+ @@settings[:url] = value
16
+ else
17
+ @@settings[param]=value
18
+ end
19
+ HudsonObject::load_xml_api
20
+ end
21
+
22
+ def self.settings=(settings)
23
+ if settings.kind_of?(Hash)
24
+ settings.each do |param, value|
25
+ Hudson[param] = value
26
+ end
27
+ end
28
+ end
29
+
30
+ # Discovers nearby Hudson server on the network and configures settings
31
+ def self.auto_config
32
+ xml_response = discover()
33
+ if xml_response
34
+ #puts xml_response
35
+ doc = REXML::Document.new(xml_response)
36
+ url = doc.elements["/hudson/url"]
37
+ if url
38
+ Hudson[:url] = url.text
39
+ Hudson[:version] = doc.elements["/hudson/version"].text
40
+ puts "found Hudson version #{Hudson[:version]} @ #{Hudson[:url]}"
41
+ return true
42
+ end
43
+ end
44
+ end
45
+
46
+ end
@@ -1,4 +1,3 @@
1
- require 'hudson-remote-api'
2
1
  module Hudson
3
2
  # This class provides an interface to Hudson jobs
4
3
  class Job < HudsonObject
@@ -8,8 +7,7 @@ module Hudson
8
7
 
9
8
  # List all Hudson jobs
10
9
  def self.list()
11
- path = "#{HUDSON_URL_ROOT}/api/xml"
12
- xml = get_xml(path)
10
+ xml = get_xml(@@hudson_xml_api_path)
13
11
 
14
12
  jobs = []
15
13
  jobs_doc = REXML::Document.new(xml)
@@ -21,8 +19,7 @@ module Hudson
21
19
 
22
20
  # List all jobs in active execution
23
21
  def self.list_active
24
- path = "#{HUDSON_URL_ROOT}/api/xml"
25
- xml = get_xml(path)
22
+ xml = get_xml(@@hudson_xml_api_path)
26
23
 
27
24
  active_jobs = []
28
25
  jobs_doc = REXML::Document.new(xml)
@@ -36,14 +33,24 @@ module Hudson
36
33
 
37
34
  def initialize(name)
38
35
  @name = name
36
+ load_xml_api
39
37
  load_config
40
38
  load_info
41
39
  end
42
40
 
41
+ def load_xml_api
42
+ @xml_api_path = File.join(Hudson[:url], "job/#{@name}/api/xml")
43
+ @xml_api_config_path = File.join(Hudson[:url], "job/#{@name}/config.xml")
44
+ @xml_api_build_path = File.join(Hudson[:url], "job/#{@name}/build")
45
+ @xml_api_disable_path = File.join(Hudson[:url], "job/#{@name}/disable")
46
+ @xml_api_enable_path = File.join(Hudson[:url], "job/#{@name}/enable")
47
+ @xml_api_delete_path = File.join(Hudson[:url], "job/#{@name}/doDelete")
48
+ @xml_api_wipe_out_workspace_path = File.join(Hudson[:url], "job/#{@name}/doWipeOutWorkspace")
49
+ end
50
+
43
51
  # Load data from Hudson's Job configuration settings into class variables
44
52
  def load_config()
45
- path = "#{HUDSON_URL_ROOT}/job/#{@name}/config.xml"
46
- @config = get_xml(path)
53
+ @config = get_xml(@xml_api_config_path)
47
54
  @config_doc = REXML::Document.new(@config)
48
55
 
49
56
  @config_doc = REXML::Document.new(@config)
@@ -61,19 +68,19 @@ module Hudson
61
68
  end
62
69
 
63
70
  def load_info()
64
- path = "#{HUDSON_URL_ROOT}/job/#{@name}/api/xml"
65
- @info = get_xml(path)
71
+ @info = get_xml(@xml_api_path)
66
72
  @info_doc = REXML::Document.new(@info)
67
73
 
68
- #FIXME: make sure it's really a freeStyleProject
69
- @color = @info_doc.elements["/freeStyleProject/color"].text
70
- @last_build = @info_doc.elements["/freeStyleProject/lastBuild/number"].text
71
- @last_completed_build = @info_doc.elements["/freeStyleProject/lastCompletedBuild/number"].text
72
- @last_failed_build = @info_doc.elements["/freeStyleProject/lastFailedBuild/number"].text if @info_doc.elements["/freeStyleProject/lastFailedBuild/number"]
73
- @last_stable_build = @info_doc.elements["/freeStyleProject/lastStableBuild/number"].text if @info_doc.elements["/freeStyleProject/lastStableBuild/number"]
74
- @last_successful_build = @info_doc.elements["/freeStyleProject/lastSuccessfulBuild/number"].text if @info_doc.elements["/freeStyleProject/lastSuccessfulBuild/number"]
75
- @last_unsuccessful_build = @info_doc.elements["/freeStyleProject/lastUnsuccessfulBuild/number"].text if @info_doc.elements["/freeStyleProject/lastUnsuccessfulBuild/number"]
76
- @next_build_number = @info_doc.elements["/freeStyleProject/nextBuildNumber"].text
74
+ if @info_doc.elements["/freeStylePorject"]
75
+ @color = @info_doc.elements["/freeStyleProject/color"].text if @info_doc.elements["/freeStyleProject/color"]
76
+ @last_build = @info_doc.elements["/freeStyleProject/lastBuild/number"].text if @info_doc.elements["/freeStyleProject/lastBuild/number"]
77
+ @last_completed_build = @info_doc.elements["/freeStyleProject/lastCompletedBuild/number"].text if @info_doc.elements["/freeStyleProject/lastCompletedBuild/number"]
78
+ @last_failed_build = @info_doc.elements["/freeStyleProject/lastFailedBuild/number"].text if @info_doc.elements["/freeStyleProject/lastFailedBuild/number"]
79
+ @last_stable_build = @info_doc.elements["/freeStyleProject/lastStableBuild/number"].text if @info_doc.elements["/freeStyleProject/lastStableBuild/number"]
80
+ @last_successful_build = @info_doc.elements["/freeStyleProject/lastSuccessfulBuild/number"].text if @info_doc.elements["/freeStyleProject/lastSuccessfulBuild/number"]
81
+ @last_unsuccessful_build = @info_doc.elements["/freeStyleProject/lastUnsuccessfulBuild/number"].text if @info_doc.elements["/freeStyleProject/lastUnsuccessfulBuild/number"]
82
+ @next_build_number = @info_doc.elements["/freeStyleProject/nextBuildNumber"].text if @info_doc.elements["/freeStyleProject/nextBuildNumber"]
83
+ end
77
84
  end
78
85
 
79
86
  def active?
@@ -91,9 +98,8 @@ module Hudson
91
98
  # Create a new job on Hudson server based on the current job object
92
99
  def copy(new_job=nil)
93
100
  new_job = "copy_of_#{@name}" if new_job.nil?
94
- path = "#{HUDSON_URL_ROOT}/createItem"
95
101
 
96
- response = send_post_request(path, {:name=>new_job, :mode=>"copy", :from=>@name})
102
+ response = send_post_request(@@xml_api_create_item_path, {:name=>new_job, :mode=>"copy", :from=>@name})
97
103
  raise(APIError, "Error copying job #{@name}: #{response.body}") if response.class != Net::HTTPFound
98
104
  Job.new(new_job)
99
105
  end
@@ -101,8 +107,7 @@ module Hudson
101
107
  # Update the job configuration on Hudson server
102
108
  def update(config=nil)
103
109
  @config = config if !config.nil?
104
- path = "#{HUDSON_URL_ROOT}/job/#{@name}/config.xml"
105
- response = send_xml_post_request(path, @config)
110
+ response = send_xml_post_request(@xml_api_config_path, @config)
106
111
  response.is_a?(Net::HTTPSuccess) or response.is_a?(Net::HTTPRedirection)
107
112
  end
108
113
 
@@ -147,37 +152,33 @@ module Hudson
147
152
 
148
153
  # Start building this job on Hudson server (can't build parameterized jobs)
149
154
  def build()
150
- path = "#{HUDSON_URL_ROOT}/job/#{@name}/build"
151
- response = send_post_request(path, {:delay => '0sec'})
155
+ response = send_post_request(@xml_api_build_path, {:delay => '0sec'})
152
156
  response.is_a?(Net::HTTPSuccess) or response.is_a?(Net::HTTPRedirection)
153
157
  end
154
158
 
155
- def disable()
156
- path = "#{HUDSON_URL_ROOT}/job/#{@name}/disable"
157
- response = send_post_request(path)
159
+ def disable()
160
+ response = send_post_request(@xml_api_disable_path)
158
161
  puts response.class
159
162
  response.is_a?(Net::HTTPSuccess) or response.is_a?(Net::HTTPRedirection)
160
163
  end
161
164
 
162
- def enable()
163
- path = "#{HUDSON_URL_ROOT}/job/#{@name}/enable"
164
- response = send_post_request(path)
165
+ def enable()
166
+ response = send_post_request(@xml_api_enable_path)
165
167
  puts response.class
166
168
  response.is_a?(Net::HTTPSuccess) or response.is_a?(Net::HTTPRedirection)
167
169
  end
168
170
 
169
171
  # Delete this job from Hudson server
170
172
  def delete()
171
- path = "#{HUDSON_URL_ROOT}/job/#{@name}/doDelete"
172
- response = send_post_request(path)
173
+ response = send_post_request(@xml_api_delete_path)
173
174
  response.is_a?(Net::HTTPSuccess) or response.is_a?(Net::HTTPRedirection)
174
175
  end
175
176
 
176
177
  def wipe_out_workspace()
177
178
  wait_for_build_to_finish
178
- path = "#{HUDSON_URL_ROOT}/job/#{@name}/doWipeOutWorkspace"
179
+
179
180
  if !active?
180
- response = send_post_request(path)
181
+ response = send_post_request(@xml_api_wipe_out_workspace_path)
181
182
  else
182
183
  response = false
183
184
  end
@@ -0,0 +1,22 @@
1
+ require 'socket'
2
+ require 'timeout'
3
+ require 'rexml/document'
4
+
5
+ module Hudson
6
+ def self.discover(multicast_addr = "239.77.124.213", port=33848, timeout_limit=5)
7
+ socket = UDPSocket.open
8
+ socket.setsockopt(Socket::IPPROTO_IP, Socket::IP_TTL, [1].pack('i'))
9
+ socket.send(ARGV.join(' '), 0, multicast_addr, port)
10
+ msg = nil
11
+ #msg, info = socket.recvfrom_nonblock(1024)
12
+ timeout(timeout_limit) do
13
+ msg, info = socket.recvfrom(1024)
14
+ end
15
+ msg
16
+ rescue Exception => e
17
+ puts e
18
+ nil
19
+ ensure
20
+ socket.close
21
+ end
22
+ end
@@ -0,0 +1,12 @@
1
+ require 'test/unit'
2
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
+ require 'hudson-remote-api.rb'
4
+
5
+ class TestHudsonBuild < Test::Unit::TestCase
6
+
7
+ def test_init
8
+ # TODO: load hudson build fixtures
9
+ #assert Hudson::Build.new('test_job')
10
+ end
11
+
12
+ end
@@ -0,0 +1,11 @@
1
+ require 'test/unit'
2
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
+ require 'hudson-remote-api.rb'
4
+
5
+ class TestHudsonBuildQueue < Test::Unit::TestCase
6
+
7
+ def test_list
8
+ assert Hudson::BuildQueue.list
9
+ end
10
+
11
+ end
@@ -0,0 +1,30 @@
1
+ require 'test/unit'
2
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
+ require 'hudson-remote-api.rb'
4
+
5
+ class TestHudsonConfig < Test::Unit::TestCase
6
+
7
+ def test_get
8
+ assert Hudson[:url]
9
+ end
10
+
11
+ def test_set
12
+ test_url = "test.host.com"
13
+ Hudson[:url] = test_url
14
+ assert_equal(Hudson[:url], "http://#{test_url}")
15
+ end
16
+
17
+ def test_load_settings_hash
18
+ new_settings = {:url => 'test.com', :user => 'test', :password => 'test', :version => '1.00'}
19
+ Hudson.settings = new_settings
20
+ assert_equal(Hudson[:url], "http://#{new_settings[:url]}")
21
+ assert_equal(Hudson[:user], "test")
22
+ assert_equal(Hudson[:password], "test")
23
+ assert_equal(Hudson[:version], "1.00")
24
+ end
25
+
26
+ def test_auto_config
27
+ assert_nothing_thrown{ Hudson.auto_config }
28
+ end
29
+
30
+ end
@@ -0,0 +1,19 @@
1
+ require 'test/unit'
2
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
+ require 'hudson-remote-api.rb'
4
+
5
+ class TestHudsonJob < Test::Unit::TestCase
6
+
7
+ def test_list
8
+ assert Hudson::Job.list
9
+ end
10
+
11
+ def test_list_active
12
+ assert Hudson::Job.list_active
13
+ end
14
+
15
+ def test_init
16
+ # TODO: load job fixtures
17
+ #assert Hudson::Job.new('test_job')
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ require 'test/unit'
2
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
+ require 'hudson-remote-api.rb'
4
+
5
+ class TestHudsonMulticast < Test::Unit::TestCase
6
+
7
+ def test_multicast
8
+ assert_nothing_thrown{ Hudson.discover }
9
+ end
10
+
11
+ end
@@ -0,0 +1,2 @@
1
+ test_files = Dir.glob("*.rb")
2
+ test_files.each{|f| require f}
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hudson-remote-api
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Dru Ibarra
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-01 00:00:00 -07:00
18
+ date: 2010-09-03 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -26,9 +26,11 @@ executables: []
26
26
  extensions: []
27
27
 
28
28
  extra_rdoc_files:
29
+ - LICENSE
29
30
  - README
30
31
  files:
31
32
  - .gitignore
33
+ - LICENSE
32
34
  - README
33
35
  - Rakefile
34
36
  - VERSION
@@ -36,8 +38,16 @@ files:
36
38
  - lib/hudson-remote-api.rb
37
39
  - lib/hudson-remote-api/build.rb
38
40
  - lib/hudson-remote-api/build_queue.rb
41
+ - lib/hudson-remote-api/config.rb
39
42
  - lib/hudson-remote-api/errors.rb
40
43
  - lib/hudson-remote-api/job.rb
44
+ - lib/hudson-remote-api/multicast.rb
45
+ - test/test_hudson_build.rb
46
+ - test/test_hudson_build_queue.rb
47
+ - test/test_hudson_config.rb
48
+ - test/test_hudson_job.rb
49
+ - test/test_hudson_multicast.rb
50
+ - test/test_hudson_remote_api.rb
41
51
  has_rdoc: true
42
52
  homepage: http://github.com/Druwerd/hudson-remote-api
43
53
  licenses: []
@@ -72,5 +82,10 @@ rubygems_version: 1.3.7
72
82
  signing_key:
73
83
  specification_version: 3
74
84
  summary: Connect to Hudson's remote web API
75
- test_files: []
76
-
85
+ test_files:
86
+ - test/test_hudson_build.rb
87
+ - test/test_hudson_build_queue.rb
88
+ - test/test_hudson_config.rb
89
+ - test/test_hudson_job.rb
90
+ - test/test_hudson_multicast.rb
91
+ - test/test_hudson_remote_api.rb