Class: Fastlane::Saucectl::Api

Inherits:
Object
  • Object
show all
Defined in:
lib/fastlane/plugin/saucectl/helper/api.rb

Overview

This class provides the functions required to interact with the saucectl api for more information see: docs.saucelabs.com/dev/api/storage/

Constant Summary collapse

UI =
FastlaneCore::UI

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ Api

Returns a new instance of Api.



21
22
23
24
25
# File 'lib/fastlane/plugin/saucectl/helper/api.rb', line 21

def initialize(config)
  @config = config
  @encoded_auth_string = Base64.strict_encode64("#{@config[:sauce_username]}:#{@config[:sauce_access_key]}")
  @messages = YAML.load_file("#{__dir__}/../strings/messages.yml")
end

Instance Method Details

#available_devicesObject



27
28
29
30
31
32
33
34
35
36
# File 'lib/fastlane/plugin/saucectl/helper/api.rb', line 27

def available_devices
  path = 'v1/rdc/devices/available'
  https, url = build_http_request_for(path)
  request = Net::HTTP::Get.new(url)
  request['Authorization'] = "Basic #{@encoded_auth_string}"
  response = https.request(request)
  UI.user_error!("❌ Request failed: #{response.code} #{response.message}") unless response.kind_of?(Net::HTTPOK)

  JSON.parse(response.body)
end

#base_url(region) ⇒ Object



110
111
112
# File 'lib/fastlane/plugin/saucectl/helper/api.rb', line 110

def base_url(region)
  "https://api.#{region}.saucelabs.com"
end

#base_url_for_regionObject



95
96
97
98
99
100
101
# File 'lib/fastlane/plugin/saucectl/helper/api.rb', line 95

def base_url_for_region
  case @config[:region]
  when 'eu' then base_url('eu-central-1')
  when 'us' then base_url('us-west-1')
  else UI.user_error!("#{@config[:region]} is an invalid region ❌. Available: #{@messages['supported_regions']}")
  end
end

#build_http_request_for(path) ⇒ Object



103
104
105
106
107
108
# File 'lib/fastlane/plugin/saucectl/helper/api.rb', line 103

def build_http_request_for(path)
  url = URI("#{base_url_for_region}/#{path}")
  https = Net::HTTP.new(url.host, url.port)
  https.use_ssl = true
  [https, url]
end

#delete_app(path) ⇒ Object



84
85
86
87
88
89
90
91
92
93
# File 'lib/fastlane/plugin/saucectl/helper/api.rb', line 84

def delete_app(path)
  https, url = build_http_request_for(path)
  request = Net::HTTP::Delete.new(url.path)
  request['Authorization'] = "Basic #{@encoded_auth_string}"
  response = https.request(request)
  UI.success("✅ Successfully deleted app from sauce labs storage: \n #{response.body}") if response.kind_of?(Net::HTTPOK)
  UI.user_error!("❌ Request failed: #{response.code} #{response.message}") unless response.kind_of?(Net::HTTPOK)

  response
end

#fetch_android_devicesObject



47
48
49
50
51
52
53
54
# File 'lib/fastlane/plugin/saucectl/helper/api.rb', line 47

def fetch_android_devices
  devices = []
  get_devices = available_devices
  get_devices.each do |device|
    devices << device unless device =~ /iPhone_.*/ || device =~ /iPad_.*/
  end
  devices
end

#fetch_ios_devicesObject



38
39
40
41
42
43
44
45
# File 'lib/fastlane/plugin/saucectl/helper/api.rb', line 38

def fetch_ios_devices
  devices = []
  get_devices = available_devices
  get_devices.each do |device|
    devices << device if device =~ /iPhone_.*/ || device =~ /iPad_.*/
  end
  devices
end

#retrieve_all_appsObject



56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/fastlane/plugin/saucectl/helper/api.rb', line 56

def retrieve_all_apps
  UI.message("retrieving all apps for \"#{@config[:query]}\".")
  path = "v1/storage/files?q=#{@config[:query]}&kind=#{@config[:platform]}"
  https, url = build_http_request_for(path)
  request = Net::HTTP::Get.new(url)
  request['Authorization'] = "Basic #{@encoded_auth_string}"
  response = https.request(request)

  UI.user_error!("❌ Request failed: #{response.code} #{response.message}") unless response.kind_of?(Net::HTTPOK)

  response
end

#uploadObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/fastlane/plugin/saucectl/helper/api.rb', line 69

def upload
  UI.message("⏳ Uploading \"#{@config[:app]}\" upload to Sauce Labs.")
  path = 'v1/storage/upload'
  https, url = build_http_request_for(path)
  request = Net::HTTP::Post.new(url)
  request['Authorization'] = "Basic #{@encoded_auth_string}"
  form_data = [['payload', File.open(@config[:file])], ['name', @config[:app]]]
  request.set_form(form_data, 'multipart/form-data')
  response = https.request(request)
  UI.success("✅ Successfully uploaded app to sauce labs: \n #{response.body}") if response.code.eql?('201')
  UI.user_error!("❌ Request failed: #{response.code} #{response.message}") unless response.code.eql?('201')

  response
end