jenkins-remote-api 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/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ doc/*
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm --create use ruby-1.9.2@jenkins-remote-api
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in jenkins-remote-api.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,51 @@
1
+ Jenkins Remote API
2
+ =============
3
+
4
+ A gem aims at help you consume [remote-access-api](https://wiki.jenkins-ci.org/display/JENKINS/Remote+access+API) offered by [Jenkins](http://jenkins-ci.org/).
5
+
6
+ Why
7
+ -------
8
+
9
+ The Jenkins exposes three kinds of api(xml/json/python) to outside users. And we might ask why we need to consume
10
+ those data?
11
+
12
+ Well, for a large team(over 6~8 people), how to visualize the ci process status is very important. In opposite to
13
+ the way that you manually go to Jenkins website and see the build status(positive), what if we can utilize Kanban methodology.That is to have a screen to show current ci status(passive but with knowledge radiation). Red means failure; Green means good/success;Blue means building in process.Maybe in further, we can buy [The Hudson Bear Lamps](https://wiki.jenkins-ci.org/pages/viewpage.action?pageId=20250625) to show build status.
14
+
15
+ But the prerequisite is that you need to consume the raw data offered by Jenkins api. So this gem will wrap around
16
+ the raw api from Jenkins, let you make best of it to do thing better.
17
+
18
+ The following markups are supported. The dependencies listed are required if
19
+ you wish to run the library.
20
+
21
+
22
+ Installation
23
+ -----------
24
+
25
+ gem install jenkins-remote-api
26
+
27
+ How to use
28
+ ------------
29
+
30
+ ###Commands from terminal
31
+ Yes, this gem use [CLI(using Aruba)](https://github.com/cucumber/aruba) to add command line interface so that you can fire it up directly in terminal(cool).
32
+ If you just want to play around with it, you probably don't even need to go to crazy "IRB" console^_^.
33
+
34
+ * `jenkins -h` -- It will come up with help message.
35
+ * `jenkins list_all_job_names --ci_address http://ci.jruby.org/view/Ruboto/` -- It will list all jobs'name on Jenkins.
36
+ * `jenkins jobs_description --ci_address http://ci.jruby.org/view/Ruboto/` -- It will list all jobs description(name,url,status) on Jenkins.
37
+ * `jenkins current_status --job_name ruboto-core --ci_address http://ci.jruby.org/view/Ruboto/` -- It will list current building status of job you identified on Jenkins.
38
+
39
+ ####Usage in irb console
40
+ require 'rubygems'
41
+ require 'jenkins-remote-api'
42
+ jenkins = Ci::Jenkins.new("http://ci.jruby.org/view/Ruboto/")
43
+ jenkins.list_all_job_names
44
+ jenkins.jobs_description
45
+ jenkins.current_status_on_job "ruboto-core"
46
+ job = jenkins.job_named "ruboto-core"
47
+
48
+ Contribute
49
+ ------------
50
+
51
+ Want to contribute? Email to: clarkhtse@gmail.com
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
data/bin/jenkins ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
4
+ require 'jenkins-remote-api/cli'
5
+ Jenkins::CLI.start
6
+
@@ -0,0 +1,57 @@
1
+ Feature: Jenkins
2
+ In order to consume jenkins api
3
+ As a CLI
4
+ I want to be as objective as possible
5
+
6
+ Scenario: Get ci address when you set it
7
+ When I run `jenkins ci_address_to http://deadlock.netbeans.org/hudson`
8
+ Then the output should contain "http://deadlock.netbeans.org/hudson/"
9
+
10
+ Scenario: Get list all job names for specific jenkins ci
11
+ When I run `jenkins list_all_job_names --ci_address http://ci.jruby.org/view/Ruboto/`
12
+ Then the output should exactly equal to following without caring about space:
13
+ """
14
+ +-------------------------------+
15
+ | Job Name |
16
+ +-------------------------------+
17
+ | ruboto-core |
18
+ | ruboto-core_jruby_master |
19
+ | ruboto-core_pads |
20
+ | ruboto-core_pads_jruby_master |
21
+ +-------------------------------+
22
+ """
23
+
24
+ Scenario: Get all jobs descriptions for specific ci
25
+ When I run `jenkins jobs_description --ci_address http://ci.jruby.org/view/Ruboto/`
26
+ Then the output should exactly equal to following without caring about space:
27
+ """
28
+ +-------------------------------+------------+--------------------------------------------------------+
29
+ | Job Name | Job Status | Job URL |
30
+ +-------------------------------+------------+--------------------------------------------------------+
31
+ | ruboto-core | building | http://ci.jruby.org/job/ruboto-core/ |
32
+ | ruboto-core_jruby_master | failure | http://ci.jruby.org/job/ruboto-core_jruby_master/ |
33
+ | ruboto-core_pads | building | http://ci.jruby.org/job/ruboto-core_pads/ |
34
+ | ruboto-core_pads_jruby_master | failure | http://ci.jruby.org/job/ruboto-core_pads_jruby_master/ |
35
+ +-------------------------------+------------+--------------------------------------------------------+
36
+ """
37
+
38
+ Scenario: Prompt error info when ci address for list all job names has no job infos
39
+ When I run `jenkins list_all_job_names --ci_address http://www.google.com/`
40
+ Then the output should contain "Error in grabbing xml of http://www.google.com/api/xml.Pls refer to response code:404."
41
+
42
+ Scenario: Prompt error info when ci address for list all job names return xml that is illegal
43
+ When I run `jenkins list_all_job_names --ci_address http://www.baidu.com/`
44
+ Then the output should contain "Error parsing xml from http://www.baidu.com/api/xml due to format."
45
+
46
+ Scenario: Get current build status for job for specific ci
47
+ When I run `jenkins current_status --job_name ruboto-core --ci_address http://ci.jruby.org/view/Ruboto/`
48
+ Then the output should exactly equal to following without caring about space:
49
+ """
50
+ +-------------+----------+
51
+ | Job Name | Status |
52
+ +-------------+----------+
53
+ | ruboto-core | building |
54
+ +-------------+----------+
55
+ """
56
+
57
+
@@ -0,0 +1,18 @@
1
+ #we have defined some customized steps using aruba
2
+ Then /^I should see job names "([^\"]*)"$/ do | job_names |
3
+ unescape(all_output).split.join(", ").should == unescape(job_names)
4
+ end
5
+
6
+ #http://www.themodestrubyist.com/2010/04/22/aruba---cucumber-goodness-for-the-command-line/
7
+ Then /^I should see "([^\"]*)"$/ do |partial_output|
8
+ unescape(all_output).should =~ unescape(partial_output)
9
+ end
10
+
11
+
12
+ #exact match,after remove space and line just for awesome_print
13
+ #http://www.themodestrubyist.com/2010/04/22/aruba---cucumber-goodness-for-the-command-line/
14
+ Then /^the output should exactly equal to following without caring about space:$/ do |partial_output|
15
+ all_output.to_s.split.join('').should == partial_output.split.join('')
16
+ end
17
+
18
+
@@ -0,0 +1,3 @@
1
+ #import Aruba steps for cucumber CLI
2
+ ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
3
+ require 'aruba/cucumber'
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "jenkins-remote-api/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "jenkins-remote-api"
7
+ s.version = Jenkins::Remote::Api::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Tuo Huang"]
10
+ s.email = ["clarkhtse@gmail.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{This gem is to aim at helping people consume the api from Jenkins.}
13
+ s.description = %q{It retrieves the api/xml from Jenkins Ci. Then it will parse it to
14
+ get build status. e.g how many jobs are there and what status are those jobs.
15
+ }
16
+
17
+ s.rubyforge_project = "jenkins-remote-api"
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+ s.add_development_dependency 'rspec', '~> 2.6'
24
+ s.add_development_dependency 'cucumber'
25
+ s.add_development_dependency 'aruba'
26
+ s.add_dependency 'terminal-table'
27
+ s.add_dependency 'thor'
28
+ s.add_dependency 'mechanize', '~>2.0.1'
29
+ s.add_dependency 'libxml-ruby','~>2.2.2'
30
+
31
+ end
@@ -0,0 +1 @@
1
+ Dir[File.dirname(__FILE__) + '/jenkins-remote-api/ci/*.rb'].each {|file| require file }
@@ -0,0 +1,22 @@
1
+ require 'rubygems'
2
+ require 'mechanize'
3
+ module Ci
4
+ module XmlHelper
5
+ private
6
+ def retrieve_xml_from(url)
7
+ xml = nil
8
+ begin
9
+ Mechanize.new.get(url) do |page|
10
+ xml = page.body
11
+ end
12
+ rescue Mechanize::ResponseCodeError => e
13
+ raise "Error in grabbing xml of #{url}.Pls refer to response code:#{e.response_code}."
14
+ end
15
+ xml
16
+ end
17
+
18
+ def url_with_appended_xml url
19
+ url + "api/xml"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,92 @@
1
+ require 'libxml'
2
+ require "#{File.dirname(__FILE__)}/helper/xml_helper.rb"
3
+ require "#{File.dirname(__FILE__)}/job.rb"
4
+ module Ci
5
+ class Jenkins
6
+ include LibXML
7
+ include XmlHelper
8
+
9
+ COLOR_STATUS_MAPPING = {
10
+ 'blue' => 'success',
11
+ 'red' => 'failure',
12
+ 'blue_anime' => 'building-from-failure',
13
+ 'red_anime' => 'building',
14
+ 'disabled' => 'disabled',
15
+ 'aborted' => 'aborted',
16
+ 'yellow' => 'unstable', #rare
17
+ }
18
+
19
+ attr_accessor :ci_address
20
+
21
+ def initialize url
22
+ @ci_address = url
23
+ end
24
+
25
+ def ci_address
26
+ unless @ci_address.end_with?("/")
27
+ @ci_address += "/"
28
+ end
29
+ @ci_address
30
+ end
31
+
32
+ def list_all_job_names
33
+ jobs_summary.collect{ |job_summary| job_summary[:description][:name]}
34
+ end
35
+
36
+ def job_named job_name
37
+ get_job_summary_on(job_name)[:job]
38
+ end
39
+
40
+ def jobs
41
+ jobs_summary.collect{ |job_info| job_info[:job]}
42
+ end
43
+
44
+ def jobs_description
45
+ jobs_summary.collect{ |job_info| job_info[:description]}
46
+ end
47
+
48
+ def current_status_on_job job_name
49
+ get_job_summary_on(job_name)[:description][:status]
50
+ end
51
+
52
+ private
53
+ def jobs_summary
54
+ @jobs_summary ||= cached_xml_doc_of_jobs.find('//job').collect {|job_doc|
55
+ name = job_doc.find_first('name').content.strip
56
+ url = job_doc.find_first('url').content.strip
57
+ color = job_doc.find_first('color').content.strip
58
+ {
59
+ :description => {:name => name, :status => get_status_to(color), :url => url },
60
+ :job => Ci::Job.new(url)
61
+ }
62
+ }
63
+ @jobs_summary
64
+ end
65
+
66
+ def cached_xml_doc_of_jobs
67
+ return @jobs_highlevel_xml unless @jobs_highlevel_xml.nil?
68
+ xml = retrieve_xml_from(xml_url_on_ci)
69
+ parser = LibXML::XML::Parser.string(xml)
70
+ begin
71
+ @jobs_highlevel_xml = parser.parse
72
+ rescue LibXML::XML::Error => e
73
+ raise "Error parsing xml from #{xml_url_on_ci} due to format."
74
+ end
75
+ end
76
+
77
+ def xml_url_on_ci
78
+ url_with_appended_xml(ci_address)
79
+ end
80
+
81
+ def get_status_to color
82
+ raise "This color '#{color}' and its corresponding status hasn't been added to library, pls contact author." unless COLOR_STATUS_MAPPING.has_key?(color)
83
+ COLOR_STATUS_MAPPING[color]
84
+ end
85
+
86
+ def get_job_summary_on job_name
87
+ targeting_job_summary = jobs_summary.detect{|job_summary| job_summary[:description][:name] == job_name}
88
+ raise "The job with name 'some job' doesn't exist in job list of #{xml_url_on_ci}.Using jenkins.list_all_job_names to see list." if targeting_job_summary.nil?
89
+ targeting_job_summary
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,10 @@
1
+ module Ci
2
+ class Job
3
+
4
+
5
+ def initialize xml_url
6
+ @url = xml_url
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,45 @@
1
+ require 'thor'
2
+ require 'terminal-table/import'
3
+ require "#{File.dirname(__FILE__)}/ci/jenkins.rb"
4
+
5
+ module Jenkins
6
+ class CLI < Thor
7
+
8
+ desc "ci_address_to", "Initialize a new jenkins instance"
9
+ def ci_address_to url
10
+ jenkins = Ci::Jenkins.new url
11
+ puts jenkins.ci_address
12
+ end
13
+
14
+ desc "list_all_job_names", "List all job's name for jenkins ci"
15
+ method_option :ci_address, :aliases => '-ci_addr'
16
+ def list_all_job_names
17
+ jenkins = Ci::Jenkins.new options[:ci_address]
18
+ puts table(['Job Name'], *(jenkins.list_all_job_names.collect{|name| [name]}))
19
+ end
20
+
21
+ desc "jobs_description", "List all jobs' description for jenkins ci"
22
+ method_option :ci_address, :aliases => '-ci_addr'
23
+ def jobs_description
24
+ jenkins = Ci::Jenkins.new options[:ci_address]
25
+ job_description_table = table do |t|
26
+ t.headings = 'Job Name', 'Job Status', 'Job URL'
27
+ jenkins.jobs_description.each do |job_desc|
28
+ t << job_desc.values
29
+ end
30
+ end
31
+ puts job_description_table
32
+ end
33
+
34
+ desc "current_status", "Get current status of specific job on jenkins options -ci_addr , -job_name "
35
+ method_option :ci_address, :aliases => '-ci_addr'
36
+ method_option :job_name, :aliases => '-job_name'
37
+ def current_status
38
+ jenkins = Ci::Jenkins.new options[:ci_address]
39
+ status = jenkins.current_status_on_job options[:job_name]
40
+ puts table(['Job Name', 'Status'], *([[options[:job_name], status]]))
41
+ end
42
+
43
+
44
+ end
45
+ end
@@ -0,0 +1,7 @@
1
+ module Jenkins
2
+ module Remote
3
+ module Api
4
+ VERSION = "0.0.1"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,141 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Ci::Jenkins do
4
+
5
+ let(:ci_url) { "http://deadlock.netbeans.org/hudson/" }
6
+ let(:jenkins) { Ci::Jenkins.new(ci_url) }
7
+
8
+ it "should set initialize jenkins instance with ci address" do
9
+ jenkins.ci_address.should == ci_url
10
+ end
11
+
12
+ it "should set initialize jenkins instance with ci address" do
13
+ jenkins_without_end_slash = Ci::Jenkins.new("helloworld.com")
14
+ jenkins_without_end_slash.ci_address.should == "helloworld.com/"
15
+ end
16
+
17
+
18
+ it "should get all job's names for specific ci" do
19
+ mechanize = mock("Mechanize")
20
+ Mechanize.stub(:new).and_return(mechanize)
21
+ result = mock("some xml ouput")
22
+ result.stub(:body).and_return(legal_xml_source)
23
+ mechanize.should_receive(:get).with(ci_url + "api/xml").and_yield(result)
24
+ jenkins.list_all_job_names.should == ["analytics-server", "apitest"]
25
+ end
26
+
27
+ it "should prompt network problem info when mechanize can't get right response" do
28
+ mechanize = mock("Mechanize")
29
+ Mechanize.stub(:new).and_return(mechanize)
30
+ error_page = mock("some error page")
31
+ error_page.stub(:code).and_return(404)
32
+ mechanize.stub(:get).and_raise(Mechanize::ResponseCodeError.new(error_page))
33
+ expect {
34
+ jenkins.list_all_job_names
35
+ }.to raise_exception("Error in grabbing xml of http://deadlock.netbeans.org/hudson/api/xml.Pls refer to response code:404.")
36
+ end
37
+
38
+ it "should raise error when xml is illegal" do
39
+ mechanize = mock("Mechanize")
40
+ Mechanize.stub(:new).and_return(mechanize)
41
+ result = mock("some xml ouput")
42
+ xml = <<EOF
43
+ <html>helloworld
44
+ some test
45
+ EOF
46
+ result.stub(:body).and_return(xml)
47
+ mechanize.should_receive(:get).with(ci_url + "api/xml").and_yield(result)
48
+ expect {
49
+ jenkins.list_all_job_names
50
+ }.to raise_exception(
51
+ "Error parsing xml from http://deadlock.netbeans.org/hudson/api/xml due to format.")
52
+ end
53
+
54
+ it "should return empty array when page doesn't have job info" do
55
+ mechanize = mock("Mechanize")
56
+ Mechanize.stub(:new).and_return(mechanize)
57
+ result = mock("some xml ouput")
58
+ xml = <<EOF
59
+ <?xml version="1.0" encoding="UTF-8"?>
60
+ <hudson>
61
+ <assignedLabel/>
62
+ <mode>NORMAL</mode>
63
+ </hudson>
64
+ EOF
65
+ result.stub(:body).and_return(xml)
66
+ mechanize.should_receive(:get).with(ci_url + "api/xml").and_yield(result)
67
+ jenkins.list_all_job_names.should == []
68
+ end
69
+
70
+ describe "for legal xml source" do
71
+
72
+ before(:each) do
73
+ mechanize = mock("Mechanize")
74
+ Mechanize.stub(:new).and_return(mechanize)
75
+ result = mock("some xml ouput")
76
+ result.stub(:body).and_return(legal_xml_source)
77
+ mechanize.should_receive(:get).with(ci_url + "api/xml").and_yield(result)
78
+ end
79
+
80
+ context "#job_named" do
81
+ it "should get corresponding job for name" do
82
+ Ci::Job.should_receive(:new).with("http://deadlock.netbeans.org/hudson/job/analytics-server/")
83
+ jenkins.job_named("analytics-server")
84
+ end
85
+
86
+ it "should throw error info when job with name doesn't exist" do
87
+ expect {
88
+ jenkins.job_named("some job")
89
+ }.to raise_exception("The job with name 'some job' doesn't exist in job list of #{ci_url}api/xml.Using jenkins.list_all_job_names to see list.")
90
+ end
91
+ end
92
+
93
+ context "#list_all_jobs_info" do
94
+ it "should get list_all_jobs_info" do
95
+ jenkins.jobs_description.should == [
96
+ {
97
+ :name => "analytics-server",
98
+ :status => "disabled",
99
+ :url => "http://deadlock.netbeans.org/hudson/job/analytics-server/",
100
+ },
101
+ {
102
+ :name => "apitest",
103
+ :status => "success",
104
+ :url => "http://deadlock.netbeans.org/hudson/job/apitest/",
105
+ }]
106
+ end
107
+ end
108
+
109
+ it "should get current status of job on ci" do
110
+ jenkins.current_status_on_job("apitest").should == "success"
111
+ end
112
+
113
+ end
114
+
115
+
116
+
117
+
118
+ def legal_xml_source
119
+ xml = <<EOF
120
+ <?xml version="1.0" encoding="UTF-8"?>
121
+ <hudson>
122
+ <assignedLabel/>
123
+ <mode>NORMAL</mode>
124
+ <nodeDescription>the master Hudson node</nodeDescription>
125
+ <job>
126
+ <name>analytics-server</name>
127
+ <url>
128
+ http://deadlock.netbeans.org/hudson/job/analytics-server/
129
+ </url>
130
+ <color>disabled</color>
131
+ </job>
132
+ <job>
133
+ <name>apitest</name>
134
+ <url>http://deadlock.netbeans.org/hudson/job/apitest/</url>
135
+ <color>blue</color>
136
+ </job>
137
+ </hudson>
138
+ EOF
139
+ xml
140
+ end
141
+ end
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), 'lib'))
2
+ require 'jenkins-remote-api.rb'
metadata ADDED
@@ -0,0 +1,181 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jenkins-remote-api
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Tuo Huang
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-09-03 00:00:00 +08:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 2
30
+ - 6
31
+ version: "2.6"
32
+ type: :development
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: cucumber
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 0
44
+ version: "0"
45
+ type: :development
46
+ version_requirements: *id002
47
+ - !ruby/object:Gem::Dependency
48
+ name: aruba
49
+ prerelease: false
50
+ requirement: &id003 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 0
57
+ version: "0"
58
+ type: :development
59
+ version_requirements: *id003
60
+ - !ruby/object:Gem::Dependency
61
+ name: terminal-table
62
+ prerelease: false
63
+ requirement: &id004 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ segments:
69
+ - 0
70
+ version: "0"
71
+ type: :runtime
72
+ version_requirements: *id004
73
+ - !ruby/object:Gem::Dependency
74
+ name: thor
75
+ prerelease: false
76
+ requirement: &id005 !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ segments:
82
+ - 0
83
+ version: "0"
84
+ type: :runtime
85
+ version_requirements: *id005
86
+ - !ruby/object:Gem::Dependency
87
+ name: mechanize
88
+ prerelease: false
89
+ requirement: &id006 !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ~>
93
+ - !ruby/object:Gem::Version
94
+ segments:
95
+ - 2
96
+ - 0
97
+ - 1
98
+ version: 2.0.1
99
+ type: :runtime
100
+ version_requirements: *id006
101
+ - !ruby/object:Gem::Dependency
102
+ name: libxml-ruby
103
+ prerelease: false
104
+ requirement: &id007 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ segments:
110
+ - 2
111
+ - 2
112
+ - 2
113
+ version: 2.2.2
114
+ type: :runtime
115
+ version_requirements: *id007
116
+ description: "It retrieves the api/xml from Jenkins Ci. Then it will parse it to \n get build status. e.g how many jobs are there and what status are those jobs.\n "
117
+ email:
118
+ - clarkhtse@gmail.com
119
+ executables:
120
+ - jenkins
121
+ extensions: []
122
+
123
+ extra_rdoc_files: []
124
+
125
+ files:
126
+ - .gitignore
127
+ - .rvmrc
128
+ - Gemfile
129
+ - README.md
130
+ - Rakefile
131
+ - bin/jenkins
132
+ - features/jenkins.feature
133
+ - features/step_definitions/aruba_steps.rb
134
+ - features/support/env.rb
135
+ - jenkins-remote-api.gemspec
136
+ - lib/jenkins-remote-api.rb
137
+ - lib/jenkins-remote-api/ci/helper/xml_helper.rb
138
+ - lib/jenkins-remote-api/ci/jenkins.rb
139
+ - lib/jenkins-remote-api/ci/job.rb
140
+ - lib/jenkins-remote-api/cli.rb
141
+ - lib/jenkins-remote-api/version.rb
142
+ - spec/jenkins_spec.rb
143
+ - spec/spec_helper.rb
144
+ has_rdoc: true
145
+ homepage: ""
146
+ licenses: []
147
+
148
+ post_install_message:
149
+ rdoc_options: []
150
+
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ segments:
159
+ - 0
160
+ version: "0"
161
+ required_rubygems_version: !ruby/object:Gem::Requirement
162
+ none: false
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ segments:
167
+ - 0
168
+ version: "0"
169
+ requirements: []
170
+
171
+ rubyforge_project: jenkins-remote-api
172
+ rubygems_version: 1.3.7
173
+ signing_key:
174
+ specification_version: 3
175
+ summary: This gem is to aim at helping people consume the api from Jenkins.
176
+ test_files:
177
+ - features/jenkins.feature
178
+ - features/step_definitions/aruba_steps.rb
179
+ - features/support/env.rb
180
+ - spec/jenkins_spec.rb
181
+ - spec/spec_helper.rb