testdroid-api-client 0.2.3 → 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.
- checksums.yaml +4 -4
- data/.gitignore +5 -0
- data/Gemfile.lock +48 -22
- data/lib/testdroid-api-client.rb +22 -6
- data/lib/testdroid-api-filter-builder.rb +145 -0
- data/lib/testdroid_api/admin.rb +25 -0
- data/lib/testdroid_api/admin_device_models.rb +10 -0
- data/lib/testdroid_api/admin_device_problems.rb +9 -0
- data/lib/testdroid_api/admin_device_statuses.rb +12 -0
- data/lib/testdroid_api/admin_devices.rb +10 -0
- data/lib/testdroid_api/apikey_client.rb +120 -0
- data/lib/testdroid_api/client.rb +166 -123
- data/lib/testdroid_api/cloud_list_resource.rb +73 -70
- data/lib/testdroid_api/cloud_resource.rb +83 -71
- data/lib/testdroid_api/config.rb +7 -7
- data/lib/testdroid_api/device_groups.rb +8 -9
- data/lib/testdroid_api/device_runs.rb +4 -2
- data/lib/testdroid_api/device_session_connections.rb +10 -0
- data/lib/testdroid_api/device_sessions.rb +12 -12
- data/lib/testdroid_api/devices.rb +8 -11
- data/lib/testdroid_api/file_sets.rb +8 -9
- data/lib/testdroid_api/files.rb +57 -58
- data/lib/testdroid_api/label_groups.rb +9 -10
- data/lib/testdroid_api/labels.rb +9 -10
- data/lib/testdroid_api/parameters.rb +7 -8
- data/lib/testdroid_api/projects.rb +13 -15
- data/lib/testdroid_api/properties.rb +13 -0
- data/lib/testdroid_api/runs.rb +13 -12
- data/lib/testdroid_api/services.rb +18 -0
- data/lib/testdroid_api/user.rb +6 -6
- data/sample/sample.rb +16 -11
- data/testdroid-api-client.gemspec +4 -2
- metadata +53 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5c7a42a956383ae541715024734d6b399371345
|
4
|
+
data.tar.gz: ea7415755cc3ac14aef3974529b65978a0a8cd2f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9bd34e6151d413790e579c28223c5de4529c0c734cbf2908bb5b205576bcbaf202ce15416fb4ffeb9039f7ed99b06a0d521fe920dbf4b0203db5cd99d2749f9
|
7
|
+
data.tar.gz: b0b7417c78b9676670be5cb3c5193a4b994bc134f826c44161f0688a7ce39febad8bf2b9ab201fdbd340e4a128648ff6680be76439408e453c6e845d39e3f735
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,52 +1,75 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
testdroid-api-client (0.
|
4
|
+
testdroid-api-client (0.3.0)
|
5
|
+
deep_merge (~> 1.1, >= 1.1.1)
|
5
6
|
faraday (~> 0.8.8, >= 0.8.8)
|
6
7
|
oauth2 (~> 0.9)
|
8
|
+
rest-client (~> 2.0, >= 2.0.0)
|
7
9
|
|
8
10
|
GEM
|
9
11
|
remote: https://rubygems.org/
|
10
12
|
specs:
|
11
|
-
addressable (2.
|
12
|
-
|
13
|
-
|
13
|
+
addressable (2.5.0)
|
14
|
+
public_suffix (~> 2.0, >= 2.0.2)
|
15
|
+
bump (0.5.3)
|
16
|
+
crack (0.4.3)
|
14
17
|
safe_yaml (~> 1.0.0)
|
18
|
+
deep_merge (1.1.1)
|
15
19
|
diff-lcs (1.2.5)
|
16
|
-
|
20
|
+
domain_name (0.5.20161021)
|
21
|
+
unf (>= 0.0.5, < 1.0.0)
|
22
|
+
faraday (0.8.11)
|
17
23
|
multipart-post (~> 1.2.0)
|
18
|
-
|
19
|
-
|
24
|
+
hashdiff (0.3.0)
|
25
|
+
http-cookie (1.0.3)
|
26
|
+
domain_name (~> 0.5)
|
27
|
+
jwt (1.5.6)
|
28
|
+
mime-types (3.1)
|
29
|
+
mime-types-data (~> 3.2015)
|
30
|
+
mime-types-data (3.2016.0521)
|
31
|
+
multi_json (1.12.1)
|
20
32
|
multi_xml (0.5.5)
|
21
33
|
multipart-post (1.2.0)
|
34
|
+
netrc (0.11.0)
|
22
35
|
oauth2 (0.9.4)
|
23
36
|
faraday (>= 0.8, < 0.10)
|
24
37
|
jwt (~> 1.0)
|
25
38
|
multi_json (~> 1.3)
|
26
39
|
multi_xml (~> 0.5)
|
27
40
|
rack (~> 1.2)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
41
|
+
public_suffix (2.0.4)
|
42
|
+
rack (1.6.5)
|
43
|
+
rake (11.3.0)
|
44
|
+
rest-client (2.0.0)
|
45
|
+
http-cookie (>= 1.0.2, < 2.0)
|
46
|
+
mime-types (>= 1.16, < 4.0)
|
47
|
+
netrc (~> 0.8)
|
48
|
+
rspec (3.5.0)
|
49
|
+
rspec-core (~> 3.5.0)
|
50
|
+
rspec-expectations (~> 3.5.0)
|
51
|
+
rspec-mocks (~> 3.5.0)
|
34
52
|
rspec-collection_matchers (1.1.2)
|
35
53
|
rspec-expectations (>= 2.99.0.beta1)
|
36
|
-
rspec-core (3.
|
37
|
-
rspec-support (~> 3.
|
38
|
-
rspec-expectations (3.
|
54
|
+
rspec-core (3.5.4)
|
55
|
+
rspec-support (~> 3.5.0)
|
56
|
+
rspec-expectations (3.5.0)
|
39
57
|
diff-lcs (>= 1.2.0, < 2.0)
|
40
|
-
rspec-support (~> 3.
|
41
|
-
rspec-mocks (3.
|
42
|
-
|
43
|
-
|
58
|
+
rspec-support (~> 3.5.0)
|
59
|
+
rspec-mocks (3.5.0)
|
60
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
61
|
+
rspec-support (~> 3.5.0)
|
62
|
+
rspec-support (3.5.0)
|
44
63
|
safe_yaml (1.0.4)
|
64
|
+
unf (0.1.4)
|
65
|
+
unf_ext
|
66
|
+
unf_ext (0.0.7.2)
|
45
67
|
vcr (2.9.3)
|
46
|
-
webmock (1.
|
68
|
+
webmock (1.24.6)
|
47
69
|
addressable (>= 2.3.6)
|
48
70
|
crack (>= 0.3.2)
|
49
|
-
|
71
|
+
hashdiff
|
72
|
+
yard (0.9.5)
|
50
73
|
|
51
74
|
PLATFORMS
|
52
75
|
ruby
|
@@ -60,3 +83,6 @@ DEPENDENCIES
|
|
60
83
|
vcr (~> 2.9)
|
61
84
|
webmock (~> 1.9)
|
62
85
|
yard (~> 0.8)
|
86
|
+
|
87
|
+
BUNDLED WITH
|
88
|
+
1.11.2
|
data/lib/testdroid-api-client.rb
CHANGED
@@ -1,21 +1,37 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
require 'json'
|
3
|
+
require 'logger'
|
4
|
+
require 'rest-client'
|
5
|
+
require 'deep_merge'
|
6
|
+
require 'oauth2'
|
7
|
+
|
3
8
|
require 'testdroid_api/client'
|
9
|
+
require 'testdroid_api/apikey_client'
|
10
|
+
|
4
11
|
require 'testdroid_api/cloud_resource'
|
5
12
|
require 'testdroid_api/cloud_list_resource'
|
13
|
+
|
6
14
|
require 'testdroid_api/user'
|
7
|
-
require 'testdroid_api/device_groups'
|
8
15
|
require 'testdroid_api/projects'
|
9
16
|
require 'testdroid_api/runs'
|
17
|
+
require 'testdroid_api/devices'
|
18
|
+
require 'testdroid_api/device_groups'
|
10
19
|
require 'testdroid_api/device_runs'
|
11
|
-
require 'testdroid_api/
|
20
|
+
require 'testdroid_api/device_sessions'
|
21
|
+
require 'testdroid_api/device_session_connections'
|
12
22
|
require 'testdroid_api/labels'
|
23
|
+
require 'testdroid_api/label_groups'
|
13
24
|
require 'testdroid_api/files'
|
14
|
-
require 'testdroid_api/devices'
|
15
|
-
require 'testdroid_api/device_sessions'
|
16
25
|
require 'testdroid_api/file_sets'
|
17
26
|
require 'testdroid_api/config'
|
18
27
|
require 'testdroid_api/parameters'
|
28
|
+
require 'testdroid_api/properties'
|
29
|
+
require 'testdroid_api/services'
|
19
30
|
|
20
|
-
require '
|
21
|
-
require '
|
31
|
+
require 'testdroid_api/admin'
|
32
|
+
require 'testdroid_api/admin_devices'
|
33
|
+
require 'testdroid_api/admin_device_models'
|
34
|
+
require 'testdroid_api/admin_device_statuses'
|
35
|
+
require 'testdroid_api/admin_device_problems'
|
36
|
+
|
37
|
+
require 'testdroid-api-filter-builder'
|
@@ -0,0 +1,145 @@
|
|
1
|
+
module TestdroidAPI
|
2
|
+
class FilterBuilder
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@filters = []
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
def check_type(subject)
|
10
|
+
if !!subject == subject # check if it's boolean
|
11
|
+
return 'b'
|
12
|
+
elsif (/^[0-9]{13}$/ =~ subject) != nil # check if it's timestamp
|
13
|
+
return 'd'
|
14
|
+
elsif (/^[0-9]+(?:\.[0-9]+)?$/ =~ subject) != nil # check if it's number
|
15
|
+
return 'n'
|
16
|
+
else
|
17
|
+
return 's'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def add(name, value, operand, type, check_nil=false)
|
22
|
+
unless value.is_a? Array
|
23
|
+
value = [value]
|
24
|
+
end
|
25
|
+
|
26
|
+
if value.length == 0
|
27
|
+
return self
|
28
|
+
end
|
29
|
+
|
30
|
+
# auto-convert
|
31
|
+
value.each_with_index do |val, index|
|
32
|
+
if val.is_a? Time
|
33
|
+
value[index] = val.to_i.to_s
|
34
|
+
elsif val.is_a? Fixnum
|
35
|
+
value[index] = val.to_s
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# auto-check type
|
40
|
+
if type.nil?
|
41
|
+
value.each do |val|
|
42
|
+
next if val.nil?
|
43
|
+
type = check_type(val)
|
44
|
+
break
|
45
|
+
end
|
46
|
+
|
47
|
+
if operand == 'in'
|
48
|
+
type = 'l'+type
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# check nil existance
|
53
|
+
if check_nil
|
54
|
+
is_nil = false
|
55
|
+
value.each do |val|
|
56
|
+
next unless val.nil?
|
57
|
+
is_nil = true
|
58
|
+
end
|
59
|
+
|
60
|
+
if is_nil
|
61
|
+
value = value.select { |item| !item.nil? }
|
62
|
+
operand += 'ornull'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# add filter
|
67
|
+
@filters.push(FilterItem.new(name, value, operand, type))
|
68
|
+
end
|
69
|
+
|
70
|
+
public
|
71
|
+
def gt(name, value)
|
72
|
+
add(name, value, 'gt', 'n')
|
73
|
+
end
|
74
|
+
|
75
|
+
def lt(name, value)
|
76
|
+
add(name, value, 'lt', 'n')
|
77
|
+
end
|
78
|
+
|
79
|
+
def after(name, value)
|
80
|
+
add(name, value, 'after', 'd', true)
|
81
|
+
end
|
82
|
+
|
83
|
+
def before(name, value)
|
84
|
+
add(name, value, 'before', 'd', true)
|
85
|
+
end
|
86
|
+
|
87
|
+
def on(name, value)
|
88
|
+
add(name, value, 'on', 'd')
|
89
|
+
end
|
90
|
+
|
91
|
+
def eq(name, value)
|
92
|
+
add(name, value, 'eq', nil)
|
93
|
+
end
|
94
|
+
|
95
|
+
def contains(name, value)
|
96
|
+
add(name, value, 'contains', 's')
|
97
|
+
end
|
98
|
+
|
99
|
+
def like(name, value)
|
100
|
+
nil # TODO (waiting for BE support)
|
101
|
+
end
|
102
|
+
|
103
|
+
def empty(name, value)
|
104
|
+
nil # TODO (waiting for BE support)
|
105
|
+
end
|
106
|
+
|
107
|
+
def isnull(name, operand)
|
108
|
+
add(name, nil, 'isnull', operand)
|
109
|
+
end
|
110
|
+
|
111
|
+
def in(name, value)
|
112
|
+
add(name, value, 'in', nil, true)
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
def to_s
|
117
|
+
parts = []
|
118
|
+
@filters.each do |filter|
|
119
|
+
val = ''
|
120
|
+
if filter.value.length > 1 or not filter.value.nil?
|
121
|
+
val = '_' + filter.values
|
122
|
+
end
|
123
|
+
parts.push( filter.to_s + val )
|
124
|
+
end
|
125
|
+
parts.join(';')
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
class FilterItem
|
131
|
+
attr_accessor :name, :value, :operand, :type
|
132
|
+
|
133
|
+
def initialize(name, value, operand, type)
|
134
|
+
@name, @value, @operand, @type = name, value, operand, type
|
135
|
+
end
|
136
|
+
|
137
|
+
def values
|
138
|
+
@value.join('|')
|
139
|
+
end
|
140
|
+
|
141
|
+
def to_s
|
142
|
+
"#{@type}_#{@name}_#{@operand}"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module TestdroidAPI
|
2
|
+
class Admin < CloudResource
|
3
|
+
def initialize(uri, client, params= {})
|
4
|
+
super uri, client, "admin", params
|
5
|
+
@uri, @client = uri, client
|
6
|
+
end
|
7
|
+
|
8
|
+
def device_statuses
|
9
|
+
AdminDeviceStatuses.new(@uri+"/device/statuses", @client)
|
10
|
+
end
|
11
|
+
|
12
|
+
def device_problems
|
13
|
+
AdminDeviceProblems.new(@uri+"/device-problems", @client)
|
14
|
+
end
|
15
|
+
|
16
|
+
def device_models
|
17
|
+
AdminDeviceModels.new(@uri+"/device-models", @client)
|
18
|
+
end
|
19
|
+
|
20
|
+
def devices
|
21
|
+
AdminDevices.new(@uri+"/devices", @client)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module TestdroidAPI
|
2
|
+
class AdminDeviceStatuses < CloudListResource
|
3
|
+
def initialize(uri, client)
|
4
|
+
super uri, client, "AdminDeviceStatus"
|
5
|
+
end
|
6
|
+
end
|
7
|
+
class AdminDeviceStatus < CloudResource
|
8
|
+
def initialize(uri, client, params= {})
|
9
|
+
super uri, client, "adminDeviceStatus", params
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module TestdroidAPI
|
2
|
+
class ApikeyClient < Client
|
3
|
+
|
4
|
+
attr_reader :config
|
5
|
+
attr_accessor :logger
|
6
|
+
|
7
|
+
API_VERSION = 'api/v2'
|
8
|
+
CLOUD_ENDPOINT = 'https://cloud.testdroid.com'
|
9
|
+
ACCEPT_HEADERS = {'Accept' => 'application/json'}
|
10
|
+
|
11
|
+
def initialize(api_key, cloud_url = CLOUD_ENDPOINT, logger = nil)
|
12
|
+
# Instance variables
|
13
|
+
@api_key = api_key
|
14
|
+
@cloud_url = cloud_url
|
15
|
+
@logger = logger
|
16
|
+
|
17
|
+
if @logger.nil?
|
18
|
+
@logger = Logger.new(STDOUT)
|
19
|
+
@logger.info("Logger is not defined => output to STDOUT")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def authorize
|
24
|
+
|
25
|
+
if (@cloud_user.nil?)
|
26
|
+
@cloud_user = TestdroidAPI::User.new( "/#{API_VERSION}/me", self ).refresh
|
27
|
+
@cloud_user = TestdroidAPI::User.new( "/#{API_VERSION}/users/#{@cloud_user.id}", self ).refresh
|
28
|
+
|
29
|
+
end
|
30
|
+
@cloud_user
|
31
|
+
end
|
32
|
+
# Basic methods
|
33
|
+
|
34
|
+
def request_factory(method, uri, http_params = {})
|
35
|
+
default_http_params = {
|
36
|
+
:method => method,
|
37
|
+
:url => uri,
|
38
|
+
:user => @api_key,
|
39
|
+
:password => "",
|
40
|
+
:headers => ACCEPT_HEADERS
|
41
|
+
}
|
42
|
+
request_http_params = default_http_params.deep_merge!(http_params)
|
43
|
+
|
44
|
+
RestClient::Request.new(request_http_params)
|
45
|
+
end
|
46
|
+
|
47
|
+
def get(uri, params={}, http_params={})
|
48
|
+
uri = @cloud_url+uri
|
49
|
+
begin
|
50
|
+
http_params = http_params.deep_merge({ :headers => {:params => params} })
|
51
|
+
request = self.request_factory(:get, uri, http_params)
|
52
|
+
resp = request.execute
|
53
|
+
rescue => e
|
54
|
+
@logger.error "Failed to get resource #{uri} #{e}"
|
55
|
+
return nil
|
56
|
+
end
|
57
|
+
JSON.parse(resp.body)
|
58
|
+
end
|
59
|
+
|
60
|
+
def post(uri, params={}, http_params={})
|
61
|
+
uri = @cloud_url+uri
|
62
|
+
begin
|
63
|
+
http_params = http_params.deep_merge({ :payload => params })
|
64
|
+
request = self.request_factory(:post, uri, http_params)
|
65
|
+
resp = request.execute
|
66
|
+
rescue => e
|
67
|
+
@logger.error "Failed to post resource #{uri} #{e}"
|
68
|
+
return nil
|
69
|
+
end
|
70
|
+
|
71
|
+
if resp.body.nil? || resp.body.length == 0
|
72
|
+
return nil
|
73
|
+
end
|
74
|
+
|
75
|
+
JSON.parse(resp.body)
|
76
|
+
end
|
77
|
+
|
78
|
+
def delete(uri)
|
79
|
+
uri = @cloud_url+uri
|
80
|
+
begin
|
81
|
+
request = self.request_factory(:delete, uri)
|
82
|
+
resp = request.execute
|
83
|
+
rescue => e
|
84
|
+
@logger.error "Failed to delete resource #{uri} #{e}"
|
85
|
+
return nil
|
86
|
+
end
|
87
|
+
|
88
|
+
if (resp.status != 204)
|
89
|
+
@logger.error "Failed to delete resource #{uri} #{e}"
|
90
|
+
return nil
|
91
|
+
else
|
92
|
+
@logger.info "response: #{resp.status}"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def upload(uri, file_name)
|
97
|
+
self.post(uri, {
|
98
|
+
:multipart => true,
|
99
|
+
:file => File.new(file_name, 'rb')
|
100
|
+
})
|
101
|
+
end
|
102
|
+
|
103
|
+
def download(uri, file_name, params={}, http_params={})
|
104
|
+
begin
|
105
|
+
File.open(file_name, "w+b") do |file|
|
106
|
+
http_params = http_params.deep_merge({ :headers => {:params => params} })
|
107
|
+
request = self.request_factory(:get, @cloud_url+"#{uri}", http_params)
|
108
|
+
resp = request.execute
|
109
|
+
file.write(resp.body)
|
110
|
+
end
|
111
|
+
rescue => e
|
112
|
+
@logger.error "Failed to get resource #{uri} #{e}"
|
113
|
+
return nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|