go_api_client 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +0 -2
- data/go_api_client.gemspec +5 -4
- data/lib/go_api_client/atom/feed.rb +7 -7
- data/lib/go_api_client/pipeline.rb +2 -5
- data/lib/go_api_client/stage.rb +11 -14
- data/lib/go_api_client/version.rb +1 -1
- data/lib/go_api_client.rb +4 -4
- data/test/fixtures/stages_empty.xml +9 -0
- data/test/go_api_client/pipeline_test.rb +28 -16
- data/test/go_api_client/stage_test.rb +33 -24
- data/test/test_helper.rb +7 -2
- metadata +22 -5
data/Gemfile
CHANGED
data/go_api_client.gemspec
CHANGED
@@ -5,9 +5,9 @@ require "go_api_client/version"
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "go_api_client"
|
7
7
|
s.version = GoApiClient::VERSION
|
8
|
-
s.authors = ["Nikhil Mungel"]
|
9
|
-
s.email = ["hyfather@gmail.com"]
|
10
|
-
s.homepage = ""
|
8
|
+
s.authors = ["Nikhil Mungel", "Ketan Padegaonkar", "Shishir Das"]
|
9
|
+
s.email = ["hyfather@gmail.com", "KetanPadegaonkar@gmail.com", "shishir.das@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/ThoughtWorksInc/go-api-client"
|
11
11
|
s.summary = %q{Client to parse Go CI atom feed}
|
12
12
|
s.description = %q{This gem parses atom feed generated by the Go Continuous Integration server and provides an OO representation of the pipelines and stages.}
|
13
13
|
|
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
# specify any dependencies here; for example:
|
22
|
-
|
22
|
+
s.add_development_dependency "webmock"
|
23
|
+
|
23
24
|
s.add_runtime_dependency "nokogiri"
|
24
25
|
end
|
@@ -1,10 +1,7 @@
|
|
1
1
|
module GoApiClient
|
2
2
|
module Atom
|
3
3
|
class Feed
|
4
|
-
attr_accessor :updated_at
|
5
|
-
attr_accessor :next_page
|
6
|
-
attr_accessor :url
|
7
|
-
attr_accessor :entries
|
4
|
+
attr_accessor :updated_at, :next_page, :url, :entries
|
8
5
|
|
9
6
|
def initialize(root)
|
10
7
|
@root = root
|
@@ -12,14 +9,17 @@ module GoApiClient
|
|
12
9
|
|
13
10
|
def parse!
|
14
11
|
self.updated_at = @root.xpath('xmlns:updated').first.content
|
15
|
-
self.next_page = @root.xpath("xmlns:link[@rel='next']")
|
16
|
-
self.url = @root.xpath("xmlns:link[@rel='self']")
|
17
|
-
|
12
|
+
self.next_page = href_from(@root.xpath("xmlns:link[@rel='next']"))
|
13
|
+
self.url = href_from(@root.xpath("xmlns:link[@rel='self']"))
|
18
14
|
self.entries = @root.xpath("xmlns:entry").collect do |entry|
|
19
15
|
Entry.new(entry).parse!
|
20
16
|
end
|
21
17
|
self
|
22
18
|
end
|
19
|
+
|
20
|
+
def href_from(xml)
|
21
|
+
xml.first.attribute('href').value unless xml.empty?
|
22
|
+
end
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -18,11 +18,8 @@ module GoApiClient
|
|
18
18
|
|
19
19
|
def authors
|
20
20
|
authors = stages.map(&:authors).flatten
|
21
|
-
authors.map(&:name).flatten.uniq.join("
|
22
|
-
end
|
23
|
-
|
24
|
-
def same?(link)
|
25
|
-
@details_link == link
|
21
|
+
authors.map(&:name).flatten.uniq.join(", ")
|
26
22
|
end
|
23
|
+
|
27
24
|
end
|
28
25
|
end
|
data/lib/go_api_client/stage.rb
CHANGED
@@ -1,31 +1,28 @@
|
|
1
1
|
module GoApiClient
|
2
2
|
class Stage
|
3
|
-
|
3
|
+
attr_accessor :authors, :stage_link, :name, :result, :jobs, :pipeline
|
4
4
|
|
5
5
|
def initialize(entry, pipelines)
|
6
6
|
@authors = entry.authors
|
7
|
-
@
|
7
|
+
@stage_link = entry.stage_href
|
8
8
|
@pipelines = pipelines
|
9
9
|
end
|
10
10
|
|
11
11
|
def fetch
|
12
|
-
doc = Nokogiri::XML(open(self.
|
12
|
+
doc = Nokogiri::XML(open(self.stage_link))
|
13
13
|
@name = doc.root.xpath("@name").first.value
|
14
14
|
@result = doc.root.xpath("//result").first.content
|
15
15
|
job_detail_links = doc.root.xpath("//job").collect{|job| job.attributes["href"]}
|
16
16
|
@jobs = Job.build(self, job_detail_links)
|
17
|
-
|
17
|
+
|
18
18
|
pipeline_link = doc.root.xpath("//pipeline").first.attributes["href"].value
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
new_pipeline.stages << self
|
26
|
-
@pipelines << new_pipeline
|
27
|
-
end
|
28
|
-
@pipelines
|
19
|
+
|
20
|
+
pipeline = @pipelines[pipeline_link] || Pipeline.new(pipeline_link).fetch
|
21
|
+
pipeline.stages << self
|
22
|
+
|
23
|
+
@pipelines[pipeline_link] ||= pipeline
|
24
|
+
self
|
29
25
|
end
|
30
26
|
end
|
31
27
|
end
|
28
|
+
|
data/lib/go_api_client.rb
CHANGED
@@ -11,10 +11,10 @@ module GoApiClient
|
|
11
11
|
def self.runs(host)
|
12
12
|
doc = Nokogiri::XML(open("http://#{host}/go/api/pipelines/defaultPipeline/stages.xml"))
|
13
13
|
feed = GoApiClient::Atom::Feed.new(doc.root).parse!
|
14
|
-
pipelines =
|
15
|
-
feed.entries.
|
16
|
-
|
14
|
+
pipelines = {}
|
15
|
+
feed.entries.each do |entry|
|
16
|
+
Stage.new(entry, pipelines).fetch
|
17
17
|
end
|
18
|
-
pipelines
|
18
|
+
pipelines.values
|
19
19
|
end
|
20
20
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:go="http://www.thoughtworks-studios.com/ns/go">
|
2
|
+
<title><![CDATA[defaultPipeline]]></title>
|
3
|
+
<id>http://localhost:8153/go/api/pipelines/defaultPipeline/stages.xml</id>
|
4
|
+
<author>
|
5
|
+
<name>Go</name>
|
6
|
+
</author>
|
7
|
+
<updated>2012-03-07T11:15:10+05:30</updated>
|
8
|
+
<link rel="self" href="http://localhost:8153/go/api/pipelines/defaultPipeline/stages.xml"/>
|
9
|
+
</feed>
|
@@ -1,25 +1,37 @@
|
|
1
1
|
require "test_helper"
|
2
2
|
|
3
|
-
|
3
|
+
module GoApiClient
|
4
|
+
class PipelineTest < Test::Unit::TestCase
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
6
|
+
def setup
|
7
|
+
stub_request(:get, "http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml").to_return(:body => file_contents("pipelines_1.xml"))
|
8
|
+
end
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
def test_fetch_populates_necessary_fields
|
11
|
+
link = "http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml"
|
12
|
+
pipeline = GoApiClient::Pipeline.new(link)
|
13
|
+
pipeline.fetch
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
assert_equal "1", pipeline.label
|
16
|
+
assert_equal ["Update README"], pipeline.commit_messages
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_should_return_string_delimited_list_of_authors
|
20
|
+
link = "http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml"
|
21
|
+
pipeline = GoApiClient::Pipeline.new(link).fetch
|
22
|
+
author_foo = Atom::Author.new(nil)
|
23
|
+
author_foo.name = 'foo'
|
24
|
+
author_foo.email = 'foo@example.com'
|
25
|
+
author_foo.uri = 'http://foo.example.com'
|
26
|
+
|
27
|
+
author_bar = Atom::Author.new(nil)
|
28
|
+
author_bar.name = 'bar'
|
29
|
+
author_bar.email = 'bar@example.com'
|
30
|
+
author_bar.uri = 'http://bar.example.com'
|
17
31
|
|
18
|
-
|
19
|
-
|
20
|
-
|
32
|
+
pipeline.stages << OpenStruct.new(:authors => [author_foo, author_bar])
|
33
|
+
assert_equal 'foo, bar', pipeline.authors
|
34
|
+
end
|
21
35
|
|
22
|
-
assert pipeline.same?(link)
|
23
|
-
assert(false == pipeline.same?("http://localhost:8153/go/api"))
|
24
36
|
end
|
25
37
|
end
|
@@ -1,32 +1,41 @@
|
|
1
1
|
require "test_helper"
|
2
2
|
|
3
|
-
|
3
|
+
module GoApiClient
|
4
|
+
class StageTest < Test::Unit::TestCase
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
6
|
+
def setup
|
7
|
+
stub_request(:get, "http://localhost:8153/go/api/pipelines/defaultPipeline/1.xml").to_return(:body => file_contents("pipelines_1.xml"))
|
8
|
+
stub_request(:get, "http://localhost:8153/go/api/stages/1.xml").to_return(:body => file_contents("stages_1.xml"))
|
9
|
+
stub_request(:get, "http://localhost:8153/go/api/stages/2.xml").to_return(:body => file_contents("stages_2.xml"))
|
10
|
+
stub_request(:get, "http://localhost:8153/go/api/jobs/1.xml").to_return(:body => file_contents("jobs_1.xml"))
|
11
|
+
stub_request(:get, "http://localhost:8153/go/api/jobs/2.xml").to_return(:body => file_contents("jobs_2.xml"))
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_stage_parsing
|
15
|
+
stub_request(:get, "http://localhost:8153/go/api/pipelines/defaultPipeline/stages.xml").to_return(:body => file_contents("stages.xml"))
|
16
|
+
pipelines = GoApiClient.runs("localhost:8153")
|
17
|
+
stages = pipelines.first.stages
|
13
18
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
assert_equal "
|
23
|
-
assert_equal "
|
19
|
+
assert_equal 1, pipelines.count
|
20
|
+
assert_equal 2, stages.count
|
21
|
+
assert_equal "oogabooga <twgosaas@gmail.com>", pipelines.first.authors
|
22
|
+
stages.each do |stage|
|
23
|
+
assert_equal "oogabooga <twgosaas@gmail.com>", stage.authors.first.name
|
24
|
+
assert_equal "Failed", stage.result
|
25
|
+
end
|
26
|
+
assert_equal "Acceptance", stages.first.name
|
27
|
+
assert_equal "Units", stages.last.name
|
28
|
+
assert_equal ["Update README"], pipelines.first.commit_messages
|
29
|
+
|
30
|
+
assert_equal "http://localhost:8153/go/files/defaultPipeline/1/Acceptance/1/Test/cruise-output/console.log", stages.first.jobs.first.console_log_url
|
31
|
+
assert_equal "http://localhost:8153/go/files/defaultPipeline/1/Units/1/Test/cruise-output/console.log", stages.last.jobs.first.console_log_url
|
24
32
|
end
|
25
|
-
assert_equal "Acceptance", stages.first.name
|
26
|
-
assert_equal "Units", stages.last.name
|
27
|
-
assert_equal ["Update README"], pipelines.first.commit_messages
|
28
33
|
|
29
|
-
|
30
|
-
|
34
|
+
def test_empty_atom_feed_should_not_throw_up
|
35
|
+
stub_request(:get, "http://localhost:8153/go/api/pipelines/defaultPipeline/stages.xml").to_return(:body => file_contents("stages_empty.xml"))
|
36
|
+
pipelines = GoApiClient.runs("localhost:8153")
|
37
|
+
|
38
|
+
assert pipelines.empty?
|
39
|
+
end
|
31
40
|
end
|
32
41
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'go_api_client'
|
3
|
-
|
3
|
+
require 'ostruct'
|
4
|
+
Dir["go_api_client/**/*.rb"].each {|f| require f}
|
4
5
|
require 'webmock/test_unit'
|
5
6
|
|
6
7
|
def file_contents(file_name)
|
7
8
|
File.read(File.expand_path("../../test/fixtures/#{file_name}", __FILE__))
|
8
9
|
end
|
9
10
|
|
10
|
-
|
11
|
+
module Test::Unit::Assertions
|
12
|
+
def assert_false(test, failure_message = nil)
|
13
|
+
assert(!test, failure_message || "Expected <#{test}> to be <false>.")
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,19 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: go_api_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Nikhil Mungel
|
9
|
+
- Ketan Padegaonkar
|
10
|
+
- Shishir Das
|
9
11
|
autorequire:
|
10
12
|
bindir: bin
|
11
13
|
cert_chain: []
|
12
|
-
date: 2012-
|
14
|
+
date: 2012-03-07 00:00:00.000000000Z
|
13
15
|
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: webmock
|
18
|
+
requirement: &70210519943860 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '0'
|
24
|
+
type: :development
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: *70210519943860
|
14
27
|
- !ruby/object:Gem::Dependency
|
15
28
|
name: nokogiri
|
16
|
-
requirement: &
|
29
|
+
requirement: &70210519941940 !ruby/object:Gem::Requirement
|
17
30
|
none: false
|
18
31
|
requirements:
|
19
32
|
- - ! '>='
|
@@ -21,11 +34,13 @@ dependencies:
|
|
21
34
|
version: '0'
|
22
35
|
type: :runtime
|
23
36
|
prerelease: false
|
24
|
-
version_requirements: *
|
37
|
+
version_requirements: *70210519941940
|
25
38
|
description: This gem parses atom feed generated by the Go Continuous Integration
|
26
39
|
server and provides an OO representation of the pipelines and stages.
|
27
40
|
email:
|
28
41
|
- hyfather@gmail.com
|
42
|
+
- KetanPadegaonkar@gmail.com
|
43
|
+
- shishir.das@gmail.com
|
29
44
|
executables:
|
30
45
|
- go_api_client
|
31
46
|
extensions: []
|
@@ -55,10 +70,11 @@ files:
|
|
55
70
|
- test/fixtures/stages.xml
|
56
71
|
- test/fixtures/stages_1.xml
|
57
72
|
- test/fixtures/stages_2.xml
|
73
|
+
- test/fixtures/stages_empty.xml
|
58
74
|
- test/go_api_client/pipeline_test.rb
|
59
75
|
- test/go_api_client/stage_test.rb
|
60
76
|
- test/test_helper.rb
|
61
|
-
homepage:
|
77
|
+
homepage: https://github.com/ThoughtWorksInc/go-api-client
|
62
78
|
licenses: []
|
63
79
|
post_install_message:
|
64
80
|
rdoc_options: []
|
@@ -91,6 +107,7 @@ test_files:
|
|
91
107
|
- test/fixtures/stages.xml
|
92
108
|
- test/fixtures/stages_1.xml
|
93
109
|
- test/fixtures/stages_2.xml
|
110
|
+
- test/fixtures/stages_empty.xml
|
94
111
|
- test/go_api_client/pipeline_test.rb
|
95
112
|
- test/go_api_client/stage_test.rb
|
96
113
|
- test/test_helper.rb
|