go_api_client 0.5.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.travis.yml +26 -0
- data/README.md +86 -0
- data/go_api_client.gemspec +11 -11
- data/lib/go_api_client/api/abstract_api.rb +12 -0
- data/lib/go_api_client/api/cctray.rb +53 -0
- data/lib/go_api_client/api/config.rb +60 -0
- data/lib/go_api_client/api/feed.rb +39 -0
- data/lib/go_api_client/api/job.rb +34 -0
- data/lib/go_api_client/api/pipeline.rb +87 -0
- data/lib/go_api_client/api/properties.rb +43 -0
- data/lib/go_api_client/api/stage.rb +45 -0
- data/lib/go_api_client/attribute_helper.rb +9 -0
- data/lib/go_api_client/client.rb +20 -0
- data/lib/go_api_client/domain/artifact.rb +16 -0
- data/lib/go_api_client/domain/author.rb +22 -0
- data/lib/go_api_client/domain/changeset.rb +13 -0
- data/lib/go_api_client/domain/config/job.rb +15 -0
- data/lib/go_api_client/domain/config/pipeline.rb +15 -0
- data/lib/go_api_client/domain/config/stage.rb +15 -0
- data/lib/go_api_client/domain/entry.rb +13 -0
- data/lib/go_api_client/domain/feed.rb +13 -0
- data/lib/go_api_client/domain/internal_cache.rb +28 -0
- data/lib/go_api_client/domain/job.rb +17 -0
- data/lib/go_api_client/domain/material.rb +14 -0
- data/lib/go_api_client/domain/pipeline.rb +27 -0
- data/lib/go_api_client/domain/project.rb +14 -0
- data/lib/go_api_client/domain/scheduled_job.rb +12 -0
- data/lib/go_api_client/domain/stage.rb +28 -0
- data/lib/go_api_client/domain/user.rb +30 -0
- data/lib/go_api_client/http_fetcher.rb +73 -48
- data/lib/go_api_client/parsers/artifact_parser.rb +17 -0
- data/lib/go_api_client/parsers/author_parser.rb +24 -0
- data/lib/go_api_client/parsers/changeset.rb +26 -0
- data/lib/go_api_client/parsers/config/job_parser.rb +48 -0
- data/lib/go_api_client/parsers/config/pipeline_parser.rb +42 -0
- data/lib/go_api_client/parsers/config/stage_parser.rb +33 -0
- data/lib/go_api_client/parsers/entry_parser.rb +27 -0
- data/lib/go_api_client/parsers/feed_parser.rb +27 -0
- data/lib/go_api_client/parsers/job_parser.rb +47 -0
- data/lib/go_api_client/parsers/material_parser.rb +29 -0
- data/lib/go_api_client/parsers/parser_helper.rb +11 -0
- data/lib/go_api_client/parsers/pipeline_parser.rb +30 -0
- data/lib/go_api_client/parsers/project_parser.rb +26 -0
- data/lib/go_api_client/parsers/scheduled_job_parser.rb +28 -0
- data/lib/go_api_client/parsers/stage_parser.rb +31 -0
- data/lib/go_api_client/parsers/user_parser.rb +12 -0
- data/lib/go_api_client/version.rb +4 -4
- data/lib/go_api_client.rb +56 -110
- data/test/go_api_client/artifact_test.rb +8 -8
- data/test/go_api_client/author_test.rb +27 -0
- data/test/go_api_client/building_test.rb +21 -19
- data/test/go_api_client/{atom/entry_test.rb → entry_test.rb} +8 -8
- data/test/go_api_client/job_test.rb +15 -14
- data/test/go_api_client/pipeline_test.rb +24 -27
- data/test/go_api_client/stage_test.rb +21 -74
- data/test/go_api_client/user_test.rb +15 -20
- metadata +108 -78
- data/.init.sh +0 -8
- data/.rbenv-gemsets +0 -1
- data/.ruby-version +0 -1
- data/.rvmrc +0 -1
- data/.yardopts +0 -6
- data/Gemfile.lock +0 -32
- data/README.textile +0 -64
- data/lib/go_api_client/artifact.rb +0 -27
- data/lib/go_api_client/atom/author.rb +0 -42
- data/lib/go_api_client/atom/entry.rb +0 -34
- data/lib/go_api_client/atom/feed.rb +0 -40
- data/lib/go_api_client/atom/feed_page.rb +0 -49
- data/lib/go_api_client/atom.rb +0 -4
- data/lib/go_api_client/commit.rb +0 -30
- data/lib/go_api_client/helpers/simple_attribute_support.rb +0 -11
- data/lib/go_api_client/helpers.rb +0 -1
- data/lib/go_api_client/job.rb +0 -68
- data/lib/go_api_client/pipeline.rb +0 -48
- data/lib/go_api_client/stage.rb +0 -57
- data/lib/go_api_client/user.rb +0 -36
- data/test/go_api_client/atom/author_test.rb +0 -27
- data/test/go_api_client/atom/feed_page_test.rb +0 -41
- data/test/go_api_client/atom/feed_test.rb +0 -39
- data/test/go_api_client/commit_test.rb +0 -38
- data/test/schedule_test.rb +0 -12
data/.init.sh
DELETED
data/.rbenv-gemsets
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
go-api-client
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.9.3-p392
|
data/.rvmrc
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
rvm ruby-1.9.2-p290@go-api-client
|
data/.yardopts
DELETED
data/Gemfile.lock
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
go_api_client (0.5.4)
|
5
|
-
nokogiri
|
6
|
-
|
7
|
-
GEM
|
8
|
-
remote: http://rubygems.org/
|
9
|
-
specs:
|
10
|
-
addressable (2.2.7)
|
11
|
-
crack (0.3.1)
|
12
|
-
multi_json (1.2.0)
|
13
|
-
nokogiri (1.5.2)
|
14
|
-
rake (0.9.2.2)
|
15
|
-
simplecov (0.6.1)
|
16
|
-
multi_json (~> 1.0)
|
17
|
-
simplecov-html (~> 0.5.3)
|
18
|
-
simplecov-html (0.5.3)
|
19
|
-
test-unit (2.4.8)
|
20
|
-
webmock (1.8.0)
|
21
|
-
addressable (>= 2.2.7)
|
22
|
-
crack (>= 0.1.7)
|
23
|
-
|
24
|
-
PLATFORMS
|
25
|
-
ruby
|
26
|
-
|
27
|
-
DEPENDENCIES
|
28
|
-
go_api_client!
|
29
|
-
rake
|
30
|
-
simplecov
|
31
|
-
test-unit
|
32
|
-
webmock
|
data/README.textile
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
h2. Go API Client Gem
|
2
|
-
|
3
|
-
This gem provides access to the "ThoughtWorks Studios Go":http://www.thoughtworks-studios.com/go-continuous-delivery API, it is capable of parsing out the atom feed and generate an object graph with all the pipelines/stages/jobs and committer information.
|
4
|
-
|
5
|
-
h2. Installation
|
6
|
-
|
7
|
-
<pre>$ [sudo] gem install go_api_client</pre>
|
8
|
-
|
9
|
-
h2. Usage
|
10
|
-
|
11
|
-
See "GoApiClient":http://rubydoc.info/github/ThoughtWorksInc/go-api-client/GoApiClient for supported options and more details.
|
12
|
-
|
13
|
-
<pre>
|
14
|
-
require 'go_api_client'
|
15
|
-
|
16
|
-
# check if the server is building
|
17
|
-
GoApiClient.build_in_progress?(:host => 'go.example.com')
|
18
|
-
|
19
|
-
# check if the build has finished
|
20
|
-
GoApiClient.build_finished?(:host => 'go.example.com')
|
21
|
-
|
22
|
-
# schedule a pipeline
|
23
|
-
GoApiClient.schedule_pipeline(:host => 'go.example.com', :pipeline_name => 'MyProject')
|
24
|
-
|
25
|
-
# fetch a list of all pipelines
|
26
|
-
latest_atom_entry_id = nil
|
27
|
-
while true
|
28
|
-
last_run = GoApiClient.runs(:host => 'go.example.com', :pipeline_name => 'MyProject', :latest_atom_entry_id => latest_atom_entry_id)
|
29
|
-
latest_atom_entry_id = last_run.latest_atom_entry_id # => the last stage that was seen by the api client, keep this for further calls to #runs
|
30
|
-
|
31
|
-
pipelines = last_run.pipelines
|
32
|
-
last_pipeline = pipelines.last
|
33
|
-
puts "Finished running stage #{last_pipeline.stages.last.name} from pipeline #{last_pipeline.name}."
|
34
|
-
puts "The last commit(#{last_pipeline.commits.last.revision}) was checked in by #{last_pipeline.commits.last.user}"
|
35
|
-
sleep 10
|
36
|
-
end
|
37
|
-
</pre>
|
38
|
-
|
39
|
-
h2. License
|
40
|
-
|
41
|
-
Go API Client Gem is MIT Licensed
|
42
|
-
|
43
|
-
The MIT License
|
44
|
-
|
45
|
-
Copyright (c) 2012 ThoughtWorks, Inc. (http://thoughtworks.com)
|
46
|
-
|
47
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
48
|
-
of this software and associated documentation files (the "Software"), to deal
|
49
|
-
in the Software without restriction, including without limitation the rights
|
50
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
51
|
-
copies of the Software, and to permit persons to whom the Software is
|
52
|
-
furnished to do so, subject to the following conditions:
|
53
|
-
|
54
|
-
The above copyright notice and this permission notice shall be included in
|
55
|
-
all copies or substantial portions of the Software.
|
56
|
-
|
57
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
58
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
59
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
60
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
61
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
62
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
63
|
-
THE SOFTWARE.
|
64
|
-
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module GoApiClient
|
2
|
-
class Artifact
|
3
|
-
attr_accessor :base_uri, :src, :dest, :artifact_type
|
4
|
-
include GoApiClient::Helpers::SimpleAttributesSupport
|
5
|
-
|
6
|
-
def initialize(attributes)
|
7
|
-
super(attributes)
|
8
|
-
end
|
9
|
-
|
10
|
-
def as_zip_file_url
|
11
|
-
"#{File.join(base_uri, src)}.zip"
|
12
|
-
end
|
13
|
-
|
14
|
-
class << self
|
15
|
-
def from(artifact_base_uri, artifact_element)
|
16
|
-
attributes = {
|
17
|
-
:base_uri => artifact_base_uri,
|
18
|
-
:src => artifact_element.attributes['src'].value,
|
19
|
-
:dest => artifact_element.attributes['dest'].value,
|
20
|
-
:artifact_type => artifact_element.attributes['type'].value,
|
21
|
-
}
|
22
|
-
|
23
|
-
self.new(attributes)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module GoApiClient
|
2
|
-
module Atom
|
3
|
-
class Author
|
4
|
-
|
5
|
-
attr_accessor :name, :email, :uri
|
6
|
-
|
7
|
-
include GoApiClient::Helpers::SimpleAttributesSupport
|
8
|
-
|
9
|
-
def initialize(root, attributes={})
|
10
|
-
@root = root
|
11
|
-
super(attributes)
|
12
|
-
end
|
13
|
-
|
14
|
-
def parse!
|
15
|
-
self.name = @root.xpath('xmlns:name').first.content
|
16
|
-
self.email = @root.xpath('xmlns:email').first.content rescue nil
|
17
|
-
self.uri = @root.xpath('xmlns:uri').first.content rescue nil
|
18
|
-
|
19
|
-
if email.nil? || email.empty?
|
20
|
-
if name =~ /(.*) <(.+?)>/
|
21
|
-
self.name, self.email = $1, $2
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
@root = nil
|
26
|
-
self
|
27
|
-
end
|
28
|
-
|
29
|
-
def ==(other)
|
30
|
-
other && self.class.equal?(other.class) &&
|
31
|
-
name == other.name &&
|
32
|
-
email == other.email &&
|
33
|
-
uri == other.uri
|
34
|
-
end
|
35
|
-
|
36
|
-
def hash
|
37
|
-
self.class.hash ^ name.hash ^ email.hash ^ uri.hash
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'time'
|
2
|
-
|
3
|
-
module GoApiClient
|
4
|
-
module Atom
|
5
|
-
class Entry
|
6
|
-
|
7
|
-
attr_accessor :authors, :id, :updated_at, :title, :stage_href, :pipelines
|
8
|
-
|
9
|
-
include GoApiClient::Helpers::SimpleAttributesSupport
|
10
|
-
|
11
|
-
def initialize(root, attributes={})
|
12
|
-
@root = root
|
13
|
-
super(attributes)
|
14
|
-
end
|
15
|
-
|
16
|
-
def parse!
|
17
|
-
self.updated_at = Time.parse(@root.xpath('xmlns:updated').first.content).utc
|
18
|
-
self.id = @root.xpath('xmlns:id').first.content
|
19
|
-
self.title = @root.xpath('xmlns:title').first.content
|
20
|
-
self.stage_href = @root.
|
21
|
-
xpath("xmlns:link[@type='application/vnd.go+xml' and @rel='alternate']").
|
22
|
-
first.
|
23
|
-
attributes["href"].value
|
24
|
-
|
25
|
-
self.authors = @root.xpath('xmlns:author').collect do |author|
|
26
|
-
Author.new(author).parse!
|
27
|
-
end
|
28
|
-
@root = nil
|
29
|
-
self
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
@@ -1,40 +0,0 @@
|
|
1
|
-
module GoApiClient
|
2
|
-
module Atom
|
3
|
-
class Feed
|
4
|
-
attr_accessor :feed_pages, :entries
|
5
|
-
|
6
|
-
def initialize(atom_feed_url, last_entry_id=nil)
|
7
|
-
@atom_feed_url = atom_feed_url
|
8
|
-
@last_entry_id = last_entry_id
|
9
|
-
end
|
10
|
-
|
11
|
-
def fetch!(http_fetcher = HttpFetcher.new)
|
12
|
-
self.entries = []
|
13
|
-
feed_url = @atom_feed_url
|
14
|
-
|
15
|
-
begin
|
16
|
-
doc = Nokogiri::XML(http_fetcher.get!(feed_url))
|
17
|
-
feed_page = GoApiClient::Atom::FeedPage.new(doc.root).parse!
|
18
|
-
|
19
|
-
self.entries += if feed_page.contains_entry?(@last_entry_id)
|
20
|
-
feed_page.entries_after(@last_entry_id)
|
21
|
-
else
|
22
|
-
feed_page.entries
|
23
|
-
end
|
24
|
-
feed_url = feed_page.next_page
|
25
|
-
end while feed_page.next_page && !feed_page.contains_entry?(@last_entry_id)
|
26
|
-
self
|
27
|
-
end
|
28
|
-
|
29
|
-
def fetch_all!(http_fetcher = HttpFetcher.new)
|
30
|
-
begin
|
31
|
-
doc = Nokogiri::XML(http_fetcher.get!(@atom_feed_url))
|
32
|
-
doc.css("pipeline").inject({}) do |hash, feed|
|
33
|
-
hash[feed.attr("href")] = GoApiClient::Atom::Feed.new(feed.attr("href")).fetch!
|
34
|
-
hash
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'time'
|
2
|
-
module GoApiClient
|
3
|
-
module Atom
|
4
|
-
class FeedPage
|
5
|
-
attr_accessor :updated_at, :next_page, :url, :entries
|
6
|
-
|
7
|
-
include GoApiClient::Helpers::SimpleAttributesSupport
|
8
|
-
|
9
|
-
def initialize(root, attributes={})
|
10
|
-
@root = root
|
11
|
-
super(attributes)
|
12
|
-
end
|
13
|
-
|
14
|
-
def parse!
|
15
|
-
self.updated_at = Time.parse(@root.xpath('xmlns:updated').first.content).utc
|
16
|
-
self.next_page = href_from(@root.xpath("xmlns:link[@rel='next']"))
|
17
|
-
self.url = href_from(@root.xpath("xmlns:link[@rel='self']"))
|
18
|
-
self.entries = @root.xpath("xmlns:entry").collect do |entry|
|
19
|
-
Entry.new(entry).parse!
|
20
|
-
end
|
21
|
-
@root = nil
|
22
|
-
self
|
23
|
-
end
|
24
|
-
|
25
|
-
def entries_after(entry_or_id)
|
26
|
-
index = if entry_or_id.is_a?(String)
|
27
|
-
entries.find_index {|e| e.id == entry_or_id}
|
28
|
-
else
|
29
|
-
entries.find_index {|e| e == entry_or_id}
|
30
|
-
end
|
31
|
-
|
32
|
-
index.zero? ? [] : entries[0..index-1]
|
33
|
-
end
|
34
|
-
|
35
|
-
def contains_entry?(entry_or_id)
|
36
|
-
if entry_or_id.is_a?(String)
|
37
|
-
entries.find {|e| e.id == entry_or_id}
|
38
|
-
else
|
39
|
-
entries.include?(entry_or_id)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
def href_from(xml)
|
45
|
-
xml.first.attribute('href').value unless xml.empty?
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
data/lib/go_api_client/atom.rb
DELETED
data/lib/go_api_client/commit.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module GoApiClient
|
2
|
-
class Commit
|
3
|
-
|
4
|
-
attr_accessor :revision, :message, :time, :user
|
5
|
-
|
6
|
-
include GoApiClient::Helpers::SimpleAttributesSupport
|
7
|
-
|
8
|
-
def initialize(root, attributes={})
|
9
|
-
@root = root
|
10
|
-
super(attributes)
|
11
|
-
end
|
12
|
-
|
13
|
-
def parse!
|
14
|
-
self.revision = @root.xpath("./revision").first.content
|
15
|
-
self.message = @root.xpath("./message").first.content
|
16
|
-
self.time = Time.parse(@root.xpath("./checkinTime").first.content).utc
|
17
|
-
self.user = User.parse(@root.xpath("./user").first.content)
|
18
|
-
@root = nil
|
19
|
-
self
|
20
|
-
end
|
21
|
-
|
22
|
-
def to_s
|
23
|
-
"commit #{revision}
|
24
|
-
Author: #{user}
|
25
|
-
Date: #{time}
|
26
|
-
|
27
|
-
#{message.each_line.collect {|l| " #{l}"}}"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
require 'go_api_client/helpers/simple_attribute_support'
|
data/lib/go_api_client/job.rb
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
module GoApiClient
|
2
|
-
class Job
|
3
|
-
attr_accessor :artifacts_uri, :console_log_url, :url, :identifier, :http_fetcher, :name, :artifacts
|
4
|
-
|
5
|
-
PROPERTIES = {
|
6
|
-
:duration => :cruise_job_duration,
|
7
|
-
:result => :cruise_job_result,
|
8
|
-
:scheduled => :cruise_timestamp_01_scheduled,
|
9
|
-
:assigned => :cruise_timestamp_02_assigned,
|
10
|
-
:preparing => :cruise_timestamp_03_preparing,
|
11
|
-
:building => :cruise_timestamp_04_building,
|
12
|
-
:completing => :cruise_timestamp_05_completing,
|
13
|
-
:completed => :cruise_timestamp_06_completed,
|
14
|
-
}
|
15
|
-
|
16
|
-
attr_accessor *PROPERTIES.keys
|
17
|
-
|
18
|
-
include GoApiClient::Helpers::SimpleAttributesSupport
|
19
|
-
|
20
|
-
def initialize(root, attributes={})
|
21
|
-
@root = root
|
22
|
-
super(attributes)
|
23
|
-
end
|
24
|
-
|
25
|
-
class << self
|
26
|
-
def from(url, attributes = {})
|
27
|
-
attributes[:http_fetcher] ||= GoApiClient::HttpFetcher.new
|
28
|
-
doc = Nokogiri::XML(attributes[:http_fetcher].get!(url))
|
29
|
-
self.new(doc.root, attributes).parse!
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def parse!
|
34
|
-
self.artifacts_uri = @root.xpath("./artifacts").first.attributes["baseUri"].value
|
35
|
-
self.url = href_from(@root.xpath("./link[@rel='self']"))
|
36
|
-
self.identifier = @root.xpath('./id').first.content
|
37
|
-
self.name = @root.attributes['name'].value
|
38
|
-
self.artifacts = @root.xpath("./artifacts/artifact").collect do |artifact_element|
|
39
|
-
Artifact.from(self.artifacts_uri, artifact_element)
|
40
|
-
end
|
41
|
-
|
42
|
-
PROPERTIES.each do |variable, property_name|
|
43
|
-
property_value = @root.xpath("./properties/property[@name='#{property_name}']").first.content rescue nil
|
44
|
-
|
45
|
-
next if property_value.nil? || property_value.empty?
|
46
|
-
|
47
|
-
if property_name =~ /timestamp/
|
48
|
-
property_value = Time.parse(property_value).utc
|
49
|
-
elsif property_value =~ /^\d+$/
|
50
|
-
property_value = property_value.to_i
|
51
|
-
end
|
52
|
-
self.send("#{variable}=", property_value)
|
53
|
-
end
|
54
|
-
|
55
|
-
@root = nil
|
56
|
-
self
|
57
|
-
end
|
58
|
-
|
59
|
-
def console_log_url
|
60
|
-
@console_log_url ||= "#{artifacts_uri}/cruise-output/console.log"
|
61
|
-
end
|
62
|
-
|
63
|
-
private
|
64
|
-
def href_from(xml)
|
65
|
-
xml.first.attribute('href').value unless xml.empty?
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|