go_api_client 0.0.8 → 0.3.0

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.
Files changed (78) hide show
  1. data/.gitignore +7 -39
  2. data/.rvmrc +1 -0
  3. data/Gemfile.lock +12 -2
  4. data/Rakefile +8 -9
  5. data/go_api_client.gemspec +5 -2
  6. data/lib/go_api_client/atom/author.rb +25 -1
  7. data/lib/go_api_client/atom/entry.rb +9 -3
  8. data/lib/go_api_client/atom/feed.rb +19 -14
  9. data/lib/go_api_client/atom/feed_page.rb +49 -0
  10. data/lib/go_api_client/atom.rb +1 -0
  11. data/lib/go_api_client/commit.rb +30 -0
  12. data/lib/go_api_client/helpers/simple_attribute_support.rb +11 -0
  13. data/lib/go_api_client/helpers.rb +1 -0
  14. data/lib/go_api_client/http_fetcher.rb +41 -0
  15. data/lib/go_api_client/job.rb +56 -10
  16. data/lib/go_api_client/pipeline.rb +36 -12
  17. data/lib/go_api_client/stage.rb +43 -14
  18. data/lib/go_api_client/user.rb +36 -0
  19. data/lib/go_api_client/version.rb +7 -1
  20. data/lib/go_api_client.rb +45 -12
  21. data/test/fixtures/building/job_1.xml +41 -0
  22. data/test/fixtures/building/job_2.xml +43 -0
  23. data/test/fixtures/building/job_3.xml +40 -0
  24. data/test/fixtures/building/job_4.xml +40 -0
  25. data/test/fixtures/building/pipeline_1.xml +45 -0
  26. data/test/fixtures/building/pipeline_2.xml +39 -0
  27. data/test/fixtures/building/pipeline_3.xml +71 -0
  28. data/test/fixtures/building/stages.xml +180 -0
  29. data/test/fixtures/building/stages_1.xml +16 -0
  30. data/test/fixtures/building/stages_2.xml +16 -0
  31. data/test/fixtures/building/stages_3.xml +16 -0
  32. data/test/fixtures/building/stages_4.xml +16 -0
  33. data/test/fixtures/jobs_1.xml +3 -3
  34. data/test/fixtures/jobs_with_no_properties.xml +42 -0
  35. data/test/fixtures/ordering/go/api/jobs/1.xml +29 -0
  36. data/test/fixtures/ordering/go/api/jobs/10.xml +31 -0
  37. data/test/fixtures/ordering/go/api/jobs/2.xml +29 -0
  38. data/test/fixtures/ordering/go/api/jobs/3.xml +29 -0
  39. data/test/fixtures/ordering/go/api/jobs/4.xml +29 -0
  40. data/test/fixtures/ordering/go/api/jobs/5.xml +29 -0
  41. data/test/fixtures/ordering/go/api/jobs/6.xml +29 -0
  42. data/test/fixtures/ordering/go/api/jobs/7.xml +31 -0
  43. data/test/fixtures/ordering/go/api/jobs/8.xml +31 -0
  44. data/test/fixtures/ordering/go/api/jobs/9.xml +31 -0
  45. data/test/fixtures/ordering/go/api/pipelines/defaultPipeline/1.xml +31 -0
  46. data/test/fixtures/ordering/go/api/pipelines/defaultPipeline/2.xml +26 -0
  47. data/test/fixtures/ordering/go/api/pipelines/defaultPipeline/3.xml +26 -0
  48. data/test/fixtures/ordering/go/api/pipelines/defaultPipeline/4.xml +27 -0
  49. data/test/fixtures/ordering/go/api/pipelines/defaultPipeline/5.xml +33 -0
  50. data/test/fixtures/ordering/go/api/pipelines/defaultPipeline/stages.xml +255 -0
  51. data/test/fixtures/ordering/go/api/stages/1.xml +14 -0
  52. data/test/fixtures/ordering/go/api/stages/10.xml +14 -0
  53. data/test/fixtures/ordering/go/api/stages/2.xml +14 -0
  54. data/test/fixtures/ordering/go/api/stages/3.xml +14 -0
  55. data/test/fixtures/ordering/go/api/stages/4.xml +14 -0
  56. data/test/fixtures/ordering/go/api/stages/5.xml +14 -0
  57. data/test/fixtures/ordering/go/api/stages/6.xml +14 -0
  58. data/test/fixtures/ordering/go/api/stages/7.xml +14 -0
  59. data/test/fixtures/ordering/go/api/stages/8.xml +14 -0
  60. data/test/fixtures/ordering/go/api/stages/9.xml +14 -0
  61. data/test/fixtures/pagination/stages.xml +636 -0
  62. data/test/fixtures/pagination/stages_before_7916973.xml +615 -0
  63. data/test/fixtures/pagination/stages_before_7959831.xml +615 -0
  64. data/test/fixtures/pipelines_1.xml +8 -1
  65. data/test/fixtures/stages.xml +1 -1
  66. data/test/go_api_client/atom/author_test.rb +27 -0
  67. data/test/go_api_client/atom/entry_test.rb +27 -0
  68. data/test/go_api_client/atom/feed_page_test.rb +41 -0
  69. data/test/go_api_client/atom/feed_test.rb +25 -0
  70. data/test/go_api_client/building_test.rb +38 -0
  71. data/test/go_api_client/commit_test.rb +38 -0
  72. data/test/go_api_client/job_test.rb +42 -0
  73. data/test/go_api_client/pipeline_test.rb +63 -16
  74. data/test/go_api_client/stage_test.rb +48 -14
  75. data/test/go_api_client/user_test.rb +27 -0
  76. data/test/test_helper.rb +19 -3
  77. metadata +173 -10
  78. data/bin/go_api_client +0 -3
data/.gitignore CHANGED
@@ -1,40 +1,8 @@
1
- # Compiled source #
2
- ###################
3
- *.com
4
- *.class
5
- *.dll
6
- *.exe
7
- *.o
8
- *.so
9
-
10
- # Packages #
11
- ############
12
- # it's better to unpack these files and commit the raw source
13
- # git has its own built in compression methods
14
- *.7z
15
- *.dmg
16
- *.gz
17
- *.iso
18
- *.jar
19
- *.rar
20
- *.tar
21
- *.zip
22
-
23
- # Logs and databases #
24
- ######################
25
- *.log
26
- *.sql
27
- *.sqlite
28
-
29
- # OS generated files #
30
- ######################
31
- .DS_Store*
32
- ehthumbs.db
33
- Icon?
34
- Thumbs.db
35
-
36
-
37
-
38
- \#*\#
39
- .\#*
1
+ coverage
2
+ .bundle
3
+ bundle/
4
+ pkg/*
5
+ /tmp/
6
+ /vendor/ruby
7
+ .idea/*
40
8
  TAGS
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm ruby-1.9.2-p290@go-api-client
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- go_api_client (0.0.7)
4
+ go_api_client (0.3.0)
5
5
  nokogiri
6
6
 
7
7
  GEM
@@ -9,7 +9,14 @@ GEM
9
9
  specs:
10
10
  addressable (2.2.7)
11
11
  crack (0.3.1)
12
- nokogiri (1.5.0)
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)
13
20
  webmock (1.8.0)
14
21
  addressable (>= 2.2.7)
15
22
  crack (>= 0.1.7)
@@ -19,4 +26,7 @@ PLATFORMS
19
26
 
20
27
  DEPENDENCIES
21
28
  go_api_client!
29
+ rake
30
+ simplecov
31
+ test-unit
22
32
  webmock
data/Rakefile CHANGED
@@ -1,13 +1,12 @@
1
1
  require "bundler/gem_tasks"
2
2
  require 'rake/testtask'
3
3
 
4
- task :test do
5
- Rake::TestTask.new do |t|
6
- t.libs << "test"
7
- t.test_files = FileList['test/**/*test.rb']
8
- t.verbose = true
9
- end
10
- end
11
-
12
- task :default => :test
4
+ desc "Run all tests"
5
+ Rake::TestTask.new do |t|
6
+ t.libs << "test"
7
+ t.test_files = FileList['test/**/*test.rb']
8
+ t.verbose = true
9
+ end
13
10
 
11
+ desc "the default task"
12
+ task :default => :test
@@ -4,7 +4,7 @@ require "go_api_client/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "go_api_client"
7
- s.version = GoApiClient::VERSION
7
+ s.version = GoApiClient::Version::VERSION
8
8
  s.authors = ["Nikhil Mungel", "Ketan Padegaonkar", "Shishir Das"]
9
9
  s.email = ["hyfather@gmail.com", "KetanPadegaonkar@gmail.com", "shishir.das@gmail.com"]
10
10
  s.homepage = "https://github.com/ThoughtWorksInc/go-api-client"
@@ -13,13 +13,16 @@ Gem::Specification.new do |s|
13
13
 
14
14
  s.rubyforge_project = "go_api_client"
15
15
 
16
- s.files = `git ls-files`.split("\n")
16
+ s.files = `git ls-files`.split("\n") - `git ls-files -- vendor/cache`.split("\n")
17
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  # specify any dependencies here; for example:
22
22
  s.add_development_dependency "webmock"
23
+ s.add_development_dependency "simplecov"
24
+ s.add_development_dependency 'rake'
25
+ s.add_development_dependency 'test-unit'
23
26
 
24
27
  s.add_runtime_dependency "nokogiri"
25
28
  end
@@ -1,18 +1,42 @@
1
1
  module GoApiClient
2
2
  module Atom
3
3
  class Author
4
+
4
5
  attr_accessor :name, :email, :uri
5
- def initialize(root)
6
+
7
+ include GoApiClient::Helpers::SimpleAttributesSupport
8
+
9
+ def initialize(root, attributes={})
6
10
  @root = root
11
+ super(attributes)
7
12
  end
8
13
 
9
14
  def parse!
10
15
  self.name = @root.xpath('xmlns:name').first.content
11
16
  self.email = @root.xpath('xmlns:email').first.content rescue nil
12
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
+
13
25
  @root = nil
14
26
  self
15
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
+
16
40
  end
17
41
  end
18
42
  end
@@ -1,20 +1,26 @@
1
+ require 'time'
2
+
1
3
  module GoApiClient
2
4
  module Atom
3
5
  class Entry
6
+
4
7
  attr_accessor :authors, :id, :updated_at, :title, :stage_href, :pipelines
5
8
 
6
- def initialize(root)
9
+ include GoApiClient::Helpers::SimpleAttributesSupport
10
+
11
+ def initialize(root, attributes={})
7
12
  @root = root
13
+ super(attributes)
8
14
  end
9
15
 
10
16
  def parse!
11
- self.updated_at = @root.xpath('xmlns:updated').first.content
17
+ self.updated_at = Time.parse(@root.xpath('xmlns:updated').first.content).utc
12
18
  self.id = @root.xpath('xmlns:id').first.content
13
19
  self.title = @root.xpath('xmlns:title').first.content
14
20
  self.stage_href = @root.
15
21
  xpath("xmlns:link[@type='application/vnd.go+xml' and @rel='alternate']").
16
22
  first.
17
- attributes["href"]
23
+ attributes["href"].value
18
24
 
19
25
  self.authors = @root.xpath('xmlns:author').collect do |author|
20
26
  Author.new(author).parse!
@@ -1,24 +1,29 @@
1
1
  module GoApiClient
2
2
  module Atom
3
3
  class Feed
4
- attr_accessor :updated_at, :next_page, :url, :entries
4
+ attr_accessor :feed_pages, :entries
5
5
 
6
- def initialize(root)
7
- @root = root
6
+ def initialize(atom_feed_url, last_entry_id=nil)
7
+ @atom_feed_url = atom_feed_url
8
+ @last_entry_id = last_entry_id
8
9
  end
9
10
 
10
- def parse!
11
- self.updated_at = @root.xpath('xmlns:updated').first.content
12
- self.next_page = href_from(@root.xpath("xmlns:link[@rel='next']"))
13
- self.url = href_from(@root.xpath("xmlns:link[@rel='self']"))
14
- self.entries = @root.xpath("xmlns:entry").collect do |entry|
15
- Entry.new(entry).parse!
16
- end
17
- self
18
- end
11
+ def fetch!(http_fetcher = HttpFetcher.new)
12
+ self.entries = []
13
+ feed_url = @atom_feed_url
19
14
 
20
- def href_from(xml)
21
- xml.first.attribute('href').value unless xml.empty?
15
+ begin
16
+ doc = Nokogiri::XML(http_fetcher.get_response_body(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
22
27
  end
23
28
  end
24
29
  end
@@ -0,0 +1,49 @@
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
@@ -1,3 +1,4 @@
1
1
  require 'go_api_client/atom/author'
2
2
  require 'go_api_client/atom/entry'
3
+ require 'go_api_client/atom/feed_page'
3
4
  require 'go_api_client/atom/feed'
@@ -0,0 +1,30 @@
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
@@ -0,0 +1,11 @@
1
+ module GoApiClient
2
+ module Helpers
3
+ module SimpleAttributesSupport
4
+ def initialize(attributes={})
5
+ attributes.each do |name, value|
6
+ send("#{name}=", value) unless value.to_s.empty?
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1 @@
1
+ require 'go_api_client/helpers/simple_attribute_support'
@@ -0,0 +1,41 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+
4
+ module GoApiClient
5
+ class HttpFetcher
6
+
7
+ def initialize(options={})
8
+ @username = options[:username]
9
+ @password = options[:password]
10
+ end
11
+
12
+ def get(url, options={})
13
+ uri = URI.parse(url)
14
+
15
+ password = options[:password] || uri.password || @password
16
+ username = options[:username] || uri.user || @username
17
+ params = options[:params] || {}
18
+
19
+ uri.query = URI.encode_www_form(params) if params.any?
20
+
21
+ http = Net::HTTP.new(uri.host, uri.port)
22
+ http.use_ssl = uri.scheme == 'https'
23
+
24
+ res = http.start do |http|
25
+ req = Net::HTTP::Get.new(uri.request_uri)
26
+ req.basic_auth(username, password) if username || password
27
+ http.request(req)
28
+ end
29
+
30
+ case res
31
+ when Net::HTTPSuccess
32
+ return res
33
+ end
34
+ res.error!
35
+ end
36
+
37
+ def get_response_body(url, options={})
38
+ get(url, options).body
39
+ end
40
+ end
41
+ end
@@ -1,18 +1,64 @@
1
1
  module GoApiClient
2
2
  class Job
3
- attr_reader :artifacts_uri, :console_log_url
4
-
5
- def self.build(stage, links)
6
- @stage = stage
7
- links.collect do |link|
8
- job = Nokogiri::XML(open(link))
9
- self.new(job.xpath("//artifacts").first.attributes["baseUri"].value)
3
+ attr_accessor :artifacts_uri, :console_log_url, :url, :identifier, :http_fetcher, :name
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_response_body(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
+ PROPERTIES.each do |variable, property_name|
39
+ property_value = @root.xpath("./properties/property[@name='#{property_name}']").first.content rescue nil
40
+
41
+ next if property_value.nil? || property_value.empty?
42
+
43
+ if property_name =~ /timestamp/
44
+ property_value = Time.parse(property_value).utc
45
+ elsif property_value =~ /^\d+$/
46
+ property_value = property_value.to_i
47
+ end
48
+ self.send("#{variable}=", property_value)
10
49
  end
50
+
51
+ @root = nil
52
+ self
53
+ end
54
+
55
+ def console_log_url
56
+ @console_log_url ||= "#{artifacts_uri}/cruise-output/console.log"
11
57
  end
12
58
 
13
- def initialize(artifacts_uri)
14
- @artifacts_uri = artifacts_uri
15
- @console_log_url = "#{artifacts_uri}/cruise-output/console.log"
59
+ private
60
+ def href_from(xml)
61
+ xml.first.attribute('href').value unless xml.empty?
16
62
  end
17
63
  end
18
64
  end
@@ -1,24 +1,48 @@
1
1
  module GoApiClient
2
2
  class Pipeline
3
- attr_reader :details_link, :id, :commit_messages, :label
4
- attr_accessor :stages
3
+ attr_accessor :url, :commits, :label, :counter, :authors, :stages, :name, :http_fetcher, :identifier, :schedule_time
5
4
 
6
- def initialize(details_link)
7
- @details_link = details_link
8
- @stages = []
5
+ include GoApiClient::Helpers::SimpleAttributesSupport
6
+
7
+ def initialize(root, attributes={})
8
+ @root = root
9
+ super(attributes)
10
+ end
11
+
12
+ class << self
13
+ def from(url, attributes = {})
14
+ attributes[:http_fetcher] ||= GoApiClient::HttpFetcher.new
15
+ doc = Nokogiri::XML(attributes[:http_fetcher].get_response_body(url))
16
+ self.new(doc.root, attributes).parse!
17
+ end
18
+ end
19
+
20
+ def stages
21
+ @stages ||= []
9
22
  end
10
23
 
11
- def fetch
12
- doc = Nokogiri::XML(open(self.details_link))
13
- @label = doc.root.attributes["label"].value
14
- @id = doc.root.xpath("//id").first.content
15
- @commit_messages = doc.root.xpath("//message").map(&:content)
24
+ def parse!
25
+ self.name = @root.attributes["name"].value
26
+ self.label = @root.attributes["label"].value
27
+ self.counter = @root.attributes["counter"].value.to_i
28
+ self.url = href_from(@root.xpath("./link[@rel='self']"))
29
+ self.identifier = @root.xpath("./id").first.content
30
+ self.schedule_time = Time.parse(@root.xpath('./scheduleTime').first.content).utc
31
+ self.commits = @root.xpath('./materials/material[@type = "GitMaterial"]/modifications/changeset').collect do |changeset|
32
+ Commit.new(changeset).parse!
33
+ end
34
+
35
+ @root = nil
16
36
  self
17
37
  end
18
38
 
19
39
  def authors
20
- authors = stages.map(&:authors).flatten
21
- authors.map(&:name).flatten.uniq.join(", ")
40
+ @authors ||= stages.first.authors
41
+ end
42
+
43
+ private
44
+ def href_from(xml)
45
+ xml.first.attribute('href').value unless xml.empty?
22
46
  end
23
47
 
24
48
  end
@@ -1,28 +1,57 @@
1
+ require 'time'
1
2
  module GoApiClient
2
3
  class Stage
3
- attr_accessor :authors, :stage_link, :name, :result, :jobs, :pipeline
4
+ attr_accessor :authors, :url, :name, :result, :jobs, :pipeline, :completed_at, :pipeline_cache, :http_fetcher, :counter, :identifier
4
5
 
5
- def initialize(entry, pipelines)
6
- @authors = entry.authors
7
- @stage_link = entry.stage_href
8
- @pipelines = pipelines
6
+ include GoApiClient::Helpers::SimpleAttributesSupport
7
+
8
+ def initialize(root, attributes={})
9
+ @root = root
10
+ super(attributes)
11
+ end
12
+
13
+ class << self
14
+ def from(url, attributes = {})
15
+ attributes[:http_fetcher] ||= GoApiClient::HttpFetcher.new
16
+ doc = Nokogiri::XML(attributes[:http_fetcher].get_response_body(url))
17
+ self.new(doc.root, attributes).parse!
18
+ end
9
19
  end
10
20
 
11
- def fetch
12
- doc = Nokogiri::XML(open(self.stage_link))
13
- @name = doc.root.xpath("@name").first.value
14
- @result = doc.root.xpath("//result").first.content
15
- job_detail_links = doc.root.xpath("//job").collect{|job| job.attributes["href"]}
16
- @jobs = Job.build(self, job_detail_links)
21
+ def parse!
22
+ self.name = @root.attributes['name'].value
23
+ self.counter = @root.attributes['counter'].value.to_i
24
+ self.url = href_from(@root.xpath("./link[@rel='self']"))
25
+ self.result = @root.xpath("./result").first.content
26
+ self.completed_at = Time.parse(@root.xpath("./updated").first.content).utc
27
+ self.jobs = @root.xpath("./jobs/job").collect do |job_element|
28
+ Job.from(job_element.attributes["href"].value, :http_fetcher => http_fetcher)
29
+ end
30
+ self.identifier = @root.xpath('./id').first.content
17
31
 
18
- pipeline_link = doc.root.xpath("//pipeline").first.attributes["href"].value
32
+ pipeline_link = @root.xpath("./pipeline").first.attributes["href"].value
19
33
 
20
- pipeline = @pipelines[pipeline_link] || Pipeline.new(pipeline_link).fetch
34
+ pipeline = @pipeline_cache[pipeline_link] || Pipeline.from(pipeline_link, :http_fetcher => http_fetcher)
21
35
  pipeline.stages << self
22
36
 
23
- @pipelines[pipeline_link] ||= pipeline
37
+ self.pipeline_cache[pipeline_link] ||= pipeline
38
+ @root = nil
24
39
  self
25
40
  end
41
+
42
+ def failed?
43
+ "Failed" == @result
44
+ end
45
+
46
+ def passed?
47
+ !failed?
48
+ end
49
+
50
+ private
51
+ def href_from(xml)
52
+ xml.first.attribute('href').value unless xml.empty?
53
+ end
54
+
26
55
  end
27
56
  end
28
57
 
@@ -0,0 +1,36 @@
1
+ module GoApiClient
2
+ class User
3
+
4
+ attr_accessor :name, :email
5
+
6
+ def initialize(name, email)
7
+ @name = name
8
+ @email = email
9
+ end
10
+
11
+ def ==(other)
12
+ other && self.class.equal?(other.class) &&
13
+ name == other.name &&
14
+ email == other.email
15
+ end
16
+
17
+ def hash
18
+ self.class.hash ^ name.hash ^ email.hash
19
+ end
20
+
21
+ def to_s
22
+ "#{name} <#{email}>"
23
+ end
24
+
25
+ def inspect
26
+ "User(#{to_s})"
27
+ end
28
+
29
+ class << self
30
+ def parse(str)
31
+ _, name, email = *str.match(/(.*) <(.+?)>/)
32
+ self.new(name.strip, email.strip)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,9 @@
1
1
  module GoApiClient
2
- VERSION = "0.0.8"
2
+ module Version
3
+ MAJOR = 0
4
+ MINOR = 3
5
+ PATCH = 0
6
+ RELEASE = ENV['GO_PIPELINE_COUNTER']
7
+ VERSION = [MAJOR, MINOR, PATCH, RELEASE].compact.join('.')
8
+ end
3
9
  end