cider_client 0.1.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.
- checksums.yaml +7 -0
- data/lib/cider_client.rb +131 -0
- metadata +73 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b7badeb8e7fe4e1f1e5f92fd2d3c77c68dc43298
|
4
|
+
data.tar.gz: cbad76cedde3f4e55a34bc990a058036e1864feb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3992118565cb51083efcc34725ccbaf25caef0c53421d15d16818aee452b66e2738aca2516dfba83fb80b93f88a9a9d29b2e062502b3dca2281edf129c243774
|
7
|
+
data.tar.gz: 7dc8046005962131739117bb2217fe0788e954c1613291920061e24bfb625c5a91f14b367f6e00f85841b175acd6c37fa4cd936c5a1cba8402f188cc002a7878
|
data/lib/cider_client.rb
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
require 'json'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
# Allows you to query a Cider CI server using Ruby. Wraps the responses
|
6
|
+
# in Ruby data structures (usually hashes)
|
7
|
+
class CiderClient
|
8
|
+
attr_accessor :execution_id, :host
|
9
|
+
attr_writer :username, :password
|
10
|
+
|
11
|
+
def initialize(options = {})
|
12
|
+
@host = options.fetch(:host)
|
13
|
+
@username = options.fetch(:username)
|
14
|
+
@password = options.fetch(:password)
|
15
|
+
fail "The server at #{@host} does not provide the\
|
16
|
+
correct API version. v2 is required." unless api_compatible?
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the base URL including usernames and passwords. Always uses usernames
|
20
|
+
# and passwords, because you can't do anything on Cider without basic auth anyhow.
|
21
|
+
# Is used in all further url_* methods.
|
22
|
+
def base_url
|
23
|
+
"http://#{@username}:#{@password}@#{@host}"
|
24
|
+
end
|
25
|
+
|
26
|
+
# URL starting from the base URL root, with the passed path appended
|
27
|
+
def url(path)
|
28
|
+
"#{base_url}#{path}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def api_url(path = '')
|
32
|
+
url("/cider-ci/api/v2/#{path}")
|
33
|
+
end
|
34
|
+
|
35
|
+
# URL starting from the execution, with the passed path appended
|
36
|
+
# TODO: Stick these *_url methods into something like url_for(:execution, 'foo')
|
37
|
+
def execution_url(path)
|
38
|
+
api_url("execution/#{@execution_id}/#{path}")
|
39
|
+
end
|
40
|
+
|
41
|
+
def api_compatible?
|
42
|
+
begin
|
43
|
+
# Try to get the API root URL. If it 404s out, this server probably
|
44
|
+
# doesn't offer that API version.
|
45
|
+
RestClient.get(api_url)
|
46
|
+
api_version_matches = true
|
47
|
+
rescue RestClient::ResourceNotFound
|
48
|
+
api_version_matches = false
|
49
|
+
end
|
50
|
+
api_version_matches
|
51
|
+
end
|
52
|
+
|
53
|
+
def recurse_tasks(tasks, data)
|
54
|
+
if data['_links']['cici:task']
|
55
|
+
tasks = tasks.concat(data['_links']['cici:task'])
|
56
|
+
end
|
57
|
+
if data['_links']['next']
|
58
|
+
puts "Retrieved #{tasks.count} tasks total so far."
|
59
|
+
data = JSON.parse(RestClient.get(url(data['_links']['next']['href'])))
|
60
|
+
tasks = recurse_tasks(tasks, data)
|
61
|
+
end
|
62
|
+
tasks
|
63
|
+
end
|
64
|
+
|
65
|
+
def tasks
|
66
|
+
tasks = []
|
67
|
+
recurse_tasks(tasks,
|
68
|
+
JSON.parse(RestClient.get(execution_url('tasks'))))
|
69
|
+
end
|
70
|
+
|
71
|
+
# I've got a long thing, what can I say...
|
72
|
+
# rubocop:disable Metrics/MethodLength
|
73
|
+
def trials
|
74
|
+
trials = []
|
75
|
+
tasks.each do |task|
|
76
|
+
task_url = url(task['href'])
|
77
|
+
details = JSON.parse(RestClient.get(task_url))
|
78
|
+
trials_url = url(details['_links']['cici:trials']['href'])
|
79
|
+
puts "Need to retrieve all trials for #{details['_links']['cici:trials']['href']}"
|
80
|
+
single_trial = JSON.parse(RestClient.get(trials_url))
|
81
|
+
single_trial['_links']['cici:trial'].each do |st|
|
82
|
+
trials << st
|
83
|
+
end
|
84
|
+
end
|
85
|
+
trials
|
86
|
+
end
|
87
|
+
|
88
|
+
# Misguided idea: We thought we could retrieve all attachments
|
89
|
+
# based on a commit SHA traced to its tree id, but you do need
|
90
|
+
# an execution ID
|
91
|
+
# def tree_id_from_commit(commit_sha)
|
92
|
+
# `git show #{commit_sha} --format=%T | head -1`.chomp
|
93
|
+
# end
|
94
|
+
|
95
|
+
def trial_attachment_groups
|
96
|
+
puts 'Retrieving trial details to find all attachments, this may take a long time.'
|
97
|
+
trial_attachment_groups = []
|
98
|
+
trials.each do |trial|
|
99
|
+
trial_url = url(trial['href'])
|
100
|
+
puts "Retrieving trial details for #{trial_url}."
|
101
|
+
single_trial = JSON.parse(RestClient.get(trial_url))
|
102
|
+
trial_attachment_groups << \
|
103
|
+
single_trial['_links']['cici:trial-attachments']
|
104
|
+
end
|
105
|
+
trial_attachment_groups
|
106
|
+
end
|
107
|
+
|
108
|
+
# Takes a regex pattern and returns only hrefs of the attachments
|
109
|
+
# that matched the regex.
|
110
|
+
def trial_attachment_hrefs(pattern = /.*/)
|
111
|
+
matching_tas = []
|
112
|
+
trial_attachment_groups.each do |tag|
|
113
|
+
trial_attachment_url = url(tag['href'])
|
114
|
+
trial_attachment_details = JSON.parse(RestClient.get(trial_attachment_url))
|
115
|
+
matching_tas << trial_attachment_details['_links']['cici:trial-attachment'].select do |ta|
|
116
|
+
ta if ta['href'].match(pattern)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
matching_tas.flatten.map { |ta| ta['href'] }
|
120
|
+
end
|
121
|
+
|
122
|
+
def attachment_data(href)
|
123
|
+
attachment_details = JSON.parse(RestClient.get(url(href)))
|
124
|
+
stream_url = attachment_details['_links']['data-stream']['href']
|
125
|
+
|
126
|
+
# Stupid fix because the CI hosts seem to return their own IP instead of hostname
|
127
|
+
# in these responses
|
128
|
+
stream_url.gsub!('https://195.176.254.43', base_url)
|
129
|
+
RestClient.get(stream_url)
|
130
|
+
end
|
131
|
+
end
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cider_client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ramón Cahenzli
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-10-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.8'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.8'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rest-client
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.7'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.7'
|
41
|
+
description: Rudimentary library that wraps the Cider CI API in Ruby objects.
|
42
|
+
email: rca@psy-q.ch
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- lib/cider_client.rb
|
48
|
+
homepage: https://github.com/psy-q/cider_client
|
49
|
+
licenses:
|
50
|
+
- MIT
|
51
|
+
metadata: {}
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options: []
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
requirements: []
|
67
|
+
rubyforge_project:
|
68
|
+
rubygems_version: 2.2.2
|
69
|
+
signing_key:
|
70
|
+
specification_version: 4
|
71
|
+
summary: A client library for the Cider CI API
|
72
|
+
test_files: []
|
73
|
+
has_rdoc:
|