testdroid-api-client 0.1.2 → 0.1.3

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +44 -9
  3. data/lib/testdroid-api-client.rb +1 -1
  4. data/lib/testdroid_api/client.rb +74 -73
  5. data/lib/testdroid_api/cloud_list_resource.rb +74 -74
  6. data/lib/testdroid_api/cloud_resource.rb +65 -60
  7. data/lib/testdroid_api/device_groups.rb +8 -8
  8. data/lib/testdroid_api/device_runs.rb +17 -17
  9. data/lib/testdroid_api/device_sessions.rb +10 -10
  10. data/lib/testdroid_api/devices.rb +9 -9
  11. data/lib/testdroid_api/file_sets.rb +12 -0
  12. data/lib/testdroid_api/files.rb +50 -50
  13. data/lib/testdroid_api/label_groups.rb +9 -9
  14. data/lib/testdroid_api/labels.rb +9 -9
  15. data/lib/testdroid_api/projects.rb +1 -1
  16. data/lib/testdroid_api/runs.rb +8 -8
  17. data/lib/testdroid_api/user.rb +3 -3
  18. data/pkg/testdroid-api-client-0.1.2.gem +0 -0
  19. data/spec/client_spec.rb +1 -1
  20. data/spec/device_groups_spec.rb +3 -3
  21. data/spec/device_runs_spec.rb +2 -2
  22. data/spec/file_sets_spec.rb +47 -0
  23. data/spec/files_spec.rb +2 -2
  24. data/spec/fixtures/cassettes/f_add_file_set.json +1 -0
  25. data/spec/fixtures/cassettes/f_file_sets.json +1 -0
  26. data/spec/fixtures/cassettes/fs_add_file_set.json +1 -0
  27. data/spec/fixtures/cassettes/fs_add_file_to_fileset.json +1 -0
  28. data/spec/fixtures/cassettes/fs_delete_file_set.json +1 -0
  29. data/spec/fixtures/cassettes/fs_file_sets.json +1 -0
  30. data/spec/fixtures/cassettes/fs_get_file_set.json +1 -0
  31. data/spec/fixtures/cassettes/fs_oauth2_auth_files.json +1 -0
  32. data/spec/fixtures/cassettes/fs_update_file_set.json +1 -0
  33. data/spec/fixtures/cassettes/p_create_project.json +1 -0
  34. data/spec/fixtures/cassettes/p_oauth2_local.json +1 -0
  35. data/spec/label_groups_spec.rb +3 -3
  36. data/spec/project_spec.rb +17 -4
  37. data/spec/run_spec.rb +2 -2
  38. data/spec/spec_helper.rb +3 -2
  39. data/testdroid-api-client.gemspec +3 -2
  40. metadata +45 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5e0ff2bf024b09f9f3422d8a394b7b7c498c2719
4
- data.tar.gz: 916e80c7b3a90104088ffc51ce9d7c364e27801b
3
+ metadata.gz: d02abbd4ba89be9aba2b1c88c23d148b8fc1b892
4
+ data.tar.gz: 60e430d6b84cfbb80301e349aa26113b43953f22
5
5
  SHA512:
6
- metadata.gz: de1810b4face007df131918f1903906355f725b8089b81ac001680b948e1da04ec820f64538a357c8cc82318f71300423f88dc5f2eeab4a81d647af05543d841
7
- data.tar.gz: bbeca5dbc98e184894baf73d18ff8d168f2a873273f3534cd525fda31cbedf3a1c2e2ab2080103eb231ad48cb9256c840a30d2d682c53c611d0b85a8baca84c2
6
+ metadata.gz: 556edc82403e13452d74aed3f0950aaa27aabb4e8a2cc5b23c469c38d297f2eea865cc22c531907a641ec02034e8bb2091528d99ff9e962de6a2dc25b943f5aa
7
+ data.tar.gz: 21693e39ae96d8f405858acc27034fd24ed88fdb3c547699fd2cf50302dfe08d524c55711f6025da4ba11655d92d8f246c1cc11502d4cd73dc734611d1d76b07
data/README.md CHANGED
@@ -1,29 +1,53 @@
1
- testdroid-api-client-ruby
1
+ Testdroid API Client for Ruby
2
2
  =========================
3
3
 
4
+
5
+ ## Installation
6
+
7
+ ```ruby
8
+ # Gemfile
9
+ gem "testdroid-api-client"
4
10
  ```
11
+
12
+ ```bash
13
+ > bundle install
14
+ ```
15
+ ## Sample client usage - Authenticate
16
+ ```ruby
5
17
  require 'testdroid-api-client'
6
- #Authenticate
7
- client = TestdroidAPI::Client.new('admin@localhost', 'admin')
18
+
19
+ client = TestdroidAPI::Client.new('admin@localhost', 'admin')
20
+ ```
21
+ ## Sample usage - get projects
22
+ ```ruby
8
23
  @user = client.authorize
9
- #get Projects
10
24
  projects = @user.projects.list
11
-
12
- #get project by id
25
+ ```
26
+ ## Get project by id
27
+ ```ruby
13
28
  project_id = 123
14
29
  project123 = @user.projects.get(project_id)
15
30
  #output project name
16
31
  p "Project name #{project123.name}"
32
+ ```
17
33
 
18
- #run project
34
+ ## Start project
35
+ ```ruby
19
36
  test_run = project123.run
37
+ ```
20
38
 
21
- #check test run status
39
+ ## Check test run status
40
+ ```ruby
22
41
  p "Project state #{test_run.state}"
23
42
 
24
- #download all logs from test run
43
+ ```
44
+ ## Download all logs from test run
45
+ ```ruby
25
46
  test_run.device_runs.list({:params => {:limit => 100}}).each { |drun| drun.download_logs("#{drun.id}_log") }
47
+ ```
26
48
 
49
+ ## Using device labels
50
+ ```ruby
27
51
  #Get label for android os version 2.1
28
52
  lg_android_version_2_1 = client.label_groups.list.detect {|lg| lg.display_name.casecmp("android version") == 0 }
29
53
 
@@ -34,6 +58,17 @@ os_v2_1 = client.label_groups.get(lg_android_versions.id).labels.list.detect {|
34
58
  #get spefici device from devices list
35
59
  lenovo_a820 = devices.list.detect {|d| d.display_name == "Lenovo A820"}
36
60
 
61
+
62
+ ```
63
+ Device Sessions
64
+ ----
65
+ ```
66
+ To create a new device session:
67
+ device_session = user.device_sessions.create({:params => {'deviceModelId' => '1'}})
68
+
69
+ To release device session:
70
+ device_session.release()
37
71
 
38
72
  ```
73
+
39
74
  See https://cloud.testdroid.com/swagger/index.html for more details about API V2
@@ -13,7 +13,7 @@ require 'testdroid_api/labels'
13
13
  require 'testdroid_api/files'
14
14
  require 'testdroid_api/devices'
15
15
  require 'testdroid_api/device_sessions'
16
-
16
+ require 'testdroid_api/file_sets'
17
17
 
18
18
  require 'oauth2'
19
19
  require 'logger'
@@ -10,9 +10,9 @@ module TestdroidAPI
10
10
  ACCEPT_HEADERS={'Accept' => 'application/json'}
11
11
 
12
12
  def initialize(username, password, cloud_url = CLOUD_ENDPOINT, logger = nil)
13
- # Instance variables
14
- @username = username
15
- @password = password
13
+ # Instance variables
14
+ @username = username
15
+ @password = password
16
16
  @cloud_url = cloud_url
17
17
  @logger = logger
18
18
 
@@ -20,52 +20,52 @@ module TestdroidAPI
20
20
  @logger = Logger.new(STDOUT)
21
21
  @logger.info("Logger is not defined => output to STDOUT")
22
22
  end
23
- end
23
+ end
24
24
  def label_groups
25
- label_groups = TestdroidAPI::LabelGroups.new( "/#{API_VERSION}/label-groups", self )
26
- label_groups.list
27
- label_groups
25
+ label_groups = TestdroidAPI::LabelGroups.new( "/#{API_VERSION}/label-groups", self )
26
+ label_groups.list
27
+ label_groups
28
28
  end
29
29
  def devices
30
- devices = TestdroidAPI::Devices.new( "/#{API_VERSION}/devices", self )
31
- devices.list
32
- devices
33
- end
30
+ devices = TestdroidAPI::Devices.new( "/#{API_VERSION}/devices", self )
31
+ devices.list
32
+ devices
33
+ end
34
34
  def authorize
35
35
 
36
36
  @client = OAuth2::Client.new('testdroid-cloud-api', nil, :site => @cloud_url, :authorize_url => 'oauth/authorize',
37
- :token_url => 'oauth/token', :headers => ACCEPT_HEADERS) do |faraday|
38
- faraday.request :multipart
39
- faraday.request :url_encoded
40
- faraday.response :logger, @logger
41
- faraday.adapter Faraday.default_adapter
42
- end
43
-
37
+ :token_url => 'oauth/token', :headers => ACCEPT_HEADERS) do |faraday|
38
+ faraday.request :multipart
39
+ faraday.request :url_encoded
40
+ faraday.response :logger, @logger
41
+ faraday.adapter Faraday.default_adapter
42
+ end
43
+
44
44
  @token = @client.password.get_token(@username, @password, :headers => ACCEPT_HEADERS)
45
-
45
+
46
46
  if (@cloud_user.nil?)
47
- @cloud_user = TestdroidAPI::User.new( "/#{API_VERSION}/me", self ).refresh
48
- @cloud_user = TestdroidAPI::User.new( "/#{API_VERSION}/users/#{@cloud_user.id}", self ).refresh
47
+ @cloud_user = TestdroidAPI::User.new( "/#{API_VERSION}/me", self ).refresh
48
+ @cloud_user = TestdroidAPI::User.new( "/#{API_VERSION}/users/#{@cloud_user.id}", self ).refresh
49
49
 
50
- end
50
+ end
51
51
  @cloud_user
52
52
  end
53
- def upload(uri, filename, file_type)
54
- begin
55
-
56
- connection = @token.client.connection
57
- payload = {:file => Faraday::UploadIO.new(filename, file_type) }
58
- headers = ACCEPT_HEADERS.merge(@token.headers)
59
- response = connection.post(@cloud_url+"#{uri}",payload, headers)
60
- rescue => e
61
- @logger.error e
62
- return nil
63
- end
64
- JSON.parse(response.body)
53
+ def upload(uri, filename, file_type)
54
+ begin
55
+ @token.refresh!(:headers => ACCEPT_HEADERS) if @token.expired?
56
+ connection = @token.client.connection
57
+ payload = {:file => Faraday::UploadIO.new(filename, file_type) }
58
+ headers = ACCEPT_HEADERS.merge(@token.headers)
59
+ response = connection.post(@cloud_url+"#{uri}",payload, headers)
60
+ rescue => e
61
+ @logger.error e
62
+ return nil
63
+ end
64
+ JSON.parse(response.body)
65
65
  end
66
- def post(uri, params)
67
-
68
- @token = @client.password.get_token(@username, @password) if @token.expired?
66
+ def post(uri, params)
67
+
68
+ @token.refresh!(:headers => ACCEPT_HEADERS) if @token.expired?
69
69
 
70
70
  begin
71
71
  resp = @token.post("#{@cloud_url}#{uri}", params.merge(:headers => ACCEPT_HEADERS))
@@ -73,44 +73,45 @@ module TestdroidAPI
73
73
  @logger.error "Failed to post resource #{uri} #{e}"
74
74
  return nil
75
75
  end
76
- JSON.parse(resp.body)
77
- end
78
- def get(uri, params={})
79
-
80
- @logger.error "token expired" if @token.expired?
81
-
82
- @token = @client.password.get_token(@username, @password) if @token.expired?
83
-
84
- begin
85
- resp = @token.get(@cloud_url+"#{uri}", params.merge(:headers => ACCEPT_HEADERS))
86
- rescue => e
87
- @logger.error "Failed to get resource #{uri} #{e}"
88
- return nil
89
- end
90
- JSON.parse(resp.body)
76
+ JSON.parse(resp.body)
91
77
  end
92
- def delete(uri)
93
-
94
- @logger.error "token expired" if @token.expired?
95
-
96
- @token = @client.password.get_token(@username, @password) if @token.expired?
97
-
98
- begin
99
- resp = @token.delete(@cloud_url+"#{uri}", :headers => ACCEPT_HEADERS )
100
- rescue => e
101
- @logger.error "Failed to delete resource #{uri} #{e}"
102
- return nil
103
- end
78
+ def get(uri, params={})
104
79
 
105
- if (resp.status != 204)
106
- @logger.error "Failed to delete resource #{uri} #{e}"
107
- return nil
108
- else
109
- @logger.info "response: #{resp.status}"
110
- end
80
+ @logger.error "token expired" if @token.expired?
81
+
82
+ @token.refresh!(:headers => ACCEPT_HEADERS) if @token.expired?
83
+
84
+ begin
85
+ resp = @token.get(@cloud_url+"#{uri}", params.merge(:headers => ACCEPT_HEADERS))
86
+ rescue => e
87
+ @logger.error "Failed to get resource #{uri} #{e}"
88
+ return nil
89
+ end
90
+ JSON.parse(resp.body)
91
+ end
92
+ def delete(uri)
93
+
94
+ @logger.error "token expired" if @token.expired?
95
+
96
+ @token.refresh!(:headers => ACCEPT_HEADERS) if @token.expired?
97
+
98
+ begin
99
+ resp = @token.delete(@cloud_url+"#{uri}", :headers => ACCEPT_HEADERS )
100
+ rescue => e
101
+ @logger.error "Failed to delete resource #{uri} #{e}"
102
+ return nil
103
+ end
104
+
105
+ if (resp.status != 204)
106
+ @logger.error "Failed to delete resource #{uri} #{e}"
107
+ return nil
108
+ else
109
+ @logger.info "response: #{resp.status}"
110
+ end
111
111
  end
112
112
  def download(uri, file_name)
113
- begin
113
+ begin
114
+ @token.refresh!(:headers => ACCEPT_HEADERS) if @token.expired?
114
115
  File.open(file_name, "w+b") do |file|
115
116
  resp = @token.get("#{@cloud_url}/#{uri}", :headers => ACCEPT_HEADERS)
116
117
  file.write(resp.body)
@@ -119,6 +120,6 @@ module TestdroidAPI
119
120
  @logger.error "Failed to get resource #{uri} #{e}"
120
121
  return nil
121
122
  end
122
- end
123
+ end
123
124
  end
124
- end
125
+ end
@@ -1,83 +1,83 @@
1
1
 
2
2
  module TestdroidAPI
3
- class CloudListResource
4
-
5
- def initialize(uri, client)
6
- @uri, @client = uri, client
7
- resource_name = self.class.name.split('::')[-1]
8
- @instance_class = TestdroidAPI.const_get resource_name.chop
9
- @list_key, @instance_id_key = resource_name.gsub!(/\b\w/) { $&.downcase } , 'id'
10
- end
11
- def get(resource_id)
12
- @instance_class.new( "#{@uri}/#{resource_id}", @client)
3
+ class CloudListResource
4
+
5
+ def initialize(uri, client)
6
+ @uri, @client = uri, client
7
+ resource_name = self.class.name.split('::')[-1]
8
+ @instance_class = TestdroidAPI.const_get resource_name.chop
9
+ @list_key, @instance_id_key = resource_name.gsub!(/\b\w/) { $&.downcase } , 'id'
10
+ end
11
+ def get(resource_id)
12
+ @instance_class.new( "#{@uri}/#{resource_id}", @client)
13
+ end
14
+ def total
15
+
16
+ @client.get(@uri)['total']
17
+ end
18
+ def create(params={})
19
+ raise "Can't create a resource without a REST Client" unless @client
20
+ response = @client.post @uri, params
21
+ @instance_class.new "#{@uri}/#{response[@instance_id_key]}", @client,
22
+ response
23
+ end
24
+ def list_all()
25
+ raise "Can't get a resource list without a REST Client" unless @client
26
+
27
+ response = @client.get("#{@uri}?limit=355043550", {})
28
+
29
+ if response['data'].is_a?(Array)
30
+ client = @client
31
+ class_list = []
32
+ list_class = self.class
33
+ instance_uri = @uri
34
+ response['data'].each do |val|
35
+
36
+ class_list << @instance_class.new( "#{instance_uri}/#{val[@instance_id_key]}", @client, val)
37
+ end
13
38
  end
14
- def total
15
-
16
- @client.get(@uri)['total']
17
- end
18
- def create(params={})
19
- raise "Can't create a resource without a REST Client" unless @client
20
- response = @client.post @uri, params
21
- @instance_class.new "#{@uri}/#{response[@instance_id_key]}", @client,
22
- response
23
- end
24
- def list_all()
25
- raise "Can't get a resource list without a REST Client" unless @client
26
-
27
- response = @client.get("#{@uri}?limit=355043550", {})
28
-
29
- if response['data'].is_a?(Array)
30
- client = @client
31
- class_list = []
32
- list_class = self.class
33
- instance_uri = @uri
34
- response['data'].each do |val|
35
-
36
- class_list << @instance_class.new( "#{instance_uri}/#{val[@instance_id_key]}", @client, val)
37
- end
39
+ class_list
40
+ end
41
+ def list(params={}, full_uri=false)
42
+ raise "Can't get a resource list without a REST Client" unless @client
43
+ @uri = full_uri ? @uri.split(@client.instance_variable_get(:@cloud_url))[1] : @uri
44
+
45
+ response = @client.get(@uri, params)
46
+
47
+ if response['data'].is_a?(Array)
48
+ client = @client
49
+ class_list = []
50
+ list_class = self.class
51
+ instance_uri = full_uri ? @uri.split('?')[0] : @uri
52
+ response['data'].each do |val|
53
+
54
+ class_list << @instance_class.new( "#{instance_uri}/#{val[@instance_id_key]}", @client, val)
38
55
  end
39
- class_list
40
- end
41
- def list(params={}, full_uri=false)
42
- raise "Can't get a resource list without a REST Client" unless @client
43
- @uri = full_uri ? @uri.split(@client.instance_variable_get(:@cloud_url))[1] : @uri
56
+ class_list.instance_eval do
57
+ eigenclass = class << self; self; end
58
+
59
+ eigenclass.send :define_method, :offset, &lambda {response['offset']}
60
+ eigenclass.send :define_method, :limit, &lambda {response['limit']}
61
+ eigenclass.send :define_method, :total, &lambda {response['total']}
62
+ eigenclass.send :define_method, :next_page, &lambda {
63
+ if response['next']
64
+
65
+ list_class.new(response['next'], client).list({}, true)
66
+ else
67
+ []
68
+ end
69
+ }
70
+ eigenclass.send :define_method, :previous_page, &lambda {
71
+ if response['previous']
44
72
 
45
- response = @client.get(@uri, params)
46
-
47
- if response['data'].is_a?(Array)
48
- client = @client
49
- class_list = []
50
- list_class = self.class
51
- instance_uri = full_uri ? @uri.split('?')[0] : @uri
52
- response['data'].each do |val|
53
-
54
- class_list << @instance_class.new( "#{instance_uri}/#{val[@instance_id_key]}", @client, val)
55
- end
56
- class_list.instance_eval do
57
- eigenclass = class << self; self; end
58
-
59
- eigenclass.send :define_method, :offset, &lambda {response['offset']}
60
- eigenclass.send :define_method, :limit, &lambda {response['limit']}
61
- eigenclass.send :define_method, :total, &lambda {response['total']}
62
- eigenclass.send :define_method, :next_page, &lambda {
63
- if response['next']
64
-
65
- list_class.new(response['next'], client).list({}, true)
66
- else
67
- []
68
- end
69
- }
70
- eigenclass.send :define_method, :previous_page, &lambda {
71
- if response['previous']
72
-
73
- list_class.new(response['previous'], client).list({}, true)
74
- else
75
- []
76
- end
77
- }
78
- end
73
+ list_class.new(response['previous'], client).list({}, true)
74
+ else
75
+ []
76
+ end
77
+ }
79
78
  end
80
- class_list
81
79
  end
80
+ class_list
81
+ end
82
82
  end
83
83
  end
@@ -1,72 +1,77 @@
1
1
 
2
2
  module TestdroidAPI
3
- class CloudResource
4
- def initialize(uri, client, resource_name=nil, params= {})
5
-
6
- @uri, @client, @resource_name = uri, client, resource_name
7
- set_up_properties_from( params )
8
- end
9
- def inspect # :nodoc:
10
- "<#{self.class} @uri=#{@uri}>"
11
- end
12
- def sub_items(*items)
13
- items.each do |item|
14
- resource = camel_case_it item
15
- uri = "#{@uri}/#{item.to_s.gsub('_', '-') }"
16
- resource_class = TestdroidAPI.const_get resource
17
- new_class = resource_class.new(uri, @client)
18
- instance_variable_set( "@#{item}", new_class )
19
- end
20
- self.class.instance_eval {attr_reader *items}
21
- end
22
- def method_missing(method, *args)
23
- super if @updated
24
- set_up_properties_from(@client.get(@uri))
25
- self.send method, *args
3
+ class CloudResource
4
+ def initialize(uri, client, resource_name=nil, params= {})
5
+
6
+ @uri, @client, @resource_name = uri, client, resource_name
7
+ set_up_properties_from( params )
8
+ end
9
+ def inspect # :nodoc:
10
+ "<#{self.class} @uri=#{@uri}>"
11
+ end
12
+ def sub_items(*items)
13
+ items.each do |item|
14
+ resource = camel_case_it item
15
+ uri = "#{@uri}/#{item.to_s.gsub('_', '-') }"
16
+ resource_class = TestdroidAPI.const_get resource
17
+ new_class = resource_class.new(uri, @client)
18
+ instance_variable_set( "@#{item}", new_class )
26
19
  end
27
- def set_up_properties_from(hash)
20
+ self.class.instance_eval {attr_reader *items}
21
+ end
22
+ def method_missing(method, *args)
23
+ super if @updated
24
+ set_up_properties_from(@client.get(@uri))
25
+ self.send method, *args
26
+ end
27
+ def update(params = {})
28
+ raise "Can't update a resource without a REST Client" unless @client
29
+ set_up_properties_from(@client.post(@uri, params))
30
+ self
31
+ end
32
+ def set_up_properties_from(hash)
33
+
34
+ eigenclass = class << self; self; end
35
+ hash.each do |p,v|
36
+ property = snake_case_it p
28
37
 
29
- eigenclass = class << self; self; end
30
- hash.each do |p,v|
31
- property = snake_case_it p
32
-
33
- unless ['uri', 'client', 'updated'].include? property
38
+ unless ['uri', 'client', 'updated'].include? property
34
39
  eigenclass.send :define_method, property.to_sym, &lambda {v}
35
- end
36
40
  end
37
- @updated = !hash.keys.empty?
38
- end
39
-
40
- def refresh
41
- raise "Can't refresh a resource without a REST Client" unless @client
42
- @updated = false
43
- set_up_properties_from(@client.get(@uri))
44
- self
45
41
  end
46
- def download_file(file_resource_name, target_file_name=nil)
47
- raise "Can't refresh a resource without a REST Client" unless @client
48
- target_file_name = file_resource_name unless target_file_name
49
- @client.download("#{@uri}/#{file_resource_name}", target_file_name)
50
- end
51
- def camel_case_it(something)
52
- if something.is_a? Hash
53
- Hash[*something.to_a.map {|a| [camel_case_it(a[0]).to_sym, a[1]]}.flatten]
54
- else
55
- something.to_s.split('_').map do |s|
42
+ @updated = !hash.keys.empty?
43
+ end
44
+
45
+ def refresh
46
+ raise "Can't refresh a resource without a REST Client" unless @client
47
+ @updated = false
48
+ set_up_properties_from(@client.get(@uri))
49
+ self
50
+ end
51
+ def download_file(file_resource_name, target_file_name=nil)
52
+ raise "Can't refresh a resource without a REST Client" unless @client
53
+ target_file_name = file_resource_name unless target_file_name
54
+ @client.download("#{@uri}/#{file_resource_name}", target_file_name)
55
+ end
56
+ def camel_case_it(something)
57
+ if something.is_a? Hash
58
+ Hash[*something.to_a.map {|a| [camel_case_it(a[0]).to_sym, a[1]]}.flatten]
59
+ else
60
+ something.to_s.split('_').map do |s|
56
61
  [s[0,1].capitalize, s[1..-1]].join
57
- end.join
58
- end
59
- end
60
- def snake_case_it(something)
61
- if something.is_a? Hash
62
- Hash[*something.to_a.map {|pair| [snake_case_it(pair[0]).to_sym, pair[1]]}.flatten]
63
- else
64
- something.to_s.gsub(/[A-Z][a-z]*/) {|s| "_#{s.downcase}"}.gsub(/^_/, '')
65
- end
62
+ end.join
66
63
  end
67
- def delete
68
- raise "Can't delete a resource without a REST Client" unless @client
69
- client.delete(@uri)
64
+ end
65
+ def snake_case_it(something)
66
+ if something.is_a? Hash
67
+ Hash[*something.to_a.map {|pair| [snake_case_it(pair[0]).to_sym, pair[1]]}.flatten]
68
+ else
69
+ something.to_s.gsub(/[A-Z][a-z]*/) {|s| "_#{s.downcase}"}.gsub(/^_/, '')
70
70
  end
71
71
  end
72
+ def delete
73
+ raise "Can't delete a resource without a REST Client" unless @client
74
+ client.delete(@uri)
75
+ end
76
+ end
72
77
  end
@@ -1,12 +1,12 @@
1
1
 
2
2
  module TestdroidAPI
3
- class DeviceGroups < CloudListResource
4
- end
5
- class DeviceGroup < CloudResource
6
- def initialize(uri, client, params= {})
7
- super uri, client,"deviceGroup", params
8
- @uri, @client = uri, client
9
- end
10
-
3
+ class DeviceGroups < CloudListResource
4
+ end
5
+ class DeviceGroup < CloudResource
6
+ def initialize(uri, client, params= {})
7
+ super uri, client,"deviceGroup", params
8
+ @uri, @client = uri, client
11
9
  end
10
+
11
+ end
12
12
  end
@@ -1,20 +1,20 @@
1
1
 
2
2
  module TestdroidAPI
3
- class DeviceRuns < CloudListResource
4
- end
5
- class DeviceRun < CloudResource
6
- def initialize(uri, client, params= {})
7
- super uri, client,"deviceRun", params
8
- @uri, @client = uri, client
9
- end
10
- def download_performance(file_name="performance_data.txt")
11
- @client.download("#{@uri}/performance", file_name)
12
- end
13
- def download_junit(file_name="junit.xml")
14
- @client.download("#{@uri}/junit.xml", file_name)
15
- end
16
- def download_logs(file_name="log.txt")
17
- @client.download("#{@uri}/logs", file_name)
18
- end
19
- end
3
+ class DeviceRuns < CloudListResource
4
+ end
5
+ class DeviceRun < CloudResource
6
+ def initialize(uri, client, params= {})
7
+ super uri, client,"deviceRun", params
8
+ @uri, @client = uri, client
9
+ end
10
+ def download_performance(file_name="performance_data.txt")
11
+ @client.download("#{@uri}/performance", file_name)
12
+ end
13
+ def download_junit(file_name="junit.xml")
14
+ @client.download("#{@uri}/junit.xml", file_name)
15
+ end
16
+ def download_logs(file_name="log.txt")
17
+ @client.download("#{@uri}/logs", file_name)
18
+ end
19
+ end
20
20
  end
@@ -1,15 +1,15 @@
1
1
 
2
2
  module TestdroidAPI
3
- class DeviceSessions < CloudListResource
3
+ class DeviceSessions < CloudListResource
4
+ end
5
+ class DeviceSession < CloudResource
6
+ def initialize(uri, client, params= {})
7
+ super uri, client,"deviceSession", params
8
+ @uri, @client = uri, client
4
9
  end
5
- class DeviceSession < CloudResource
6
- def initialize(uri, client, params= {})
7
- super uri, client,"deviceSession", params
8
- @uri, @client = uri, client
9
- end
10
- def release
11
- resp = @client.post("#{@uri}/release", params= {})
12
- DeviceSession.new("#{@uri}", @client, resp)
13
- end
10
+ def release
11
+ resp = @client.post("#{@uri}/release", params= {})
12
+ DeviceSession.new("#{@uri}", @client, resp)
14
13
  end
14
+ end
15
15
  end