class SauceOverage::Account

Constants

MUTEX

Attributes

key[R]
user[R]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/sauce_overage/account.rb, line 5
def initialize(opts = {})
  @user = opts.fetch(:user, sauce_user)
  fail 'Must provide user' unless user
  @user = user.strip

  @key = opts.fetch(:key, sauce_key)
  fail 'Must provide key' unless key
  @key = key.strip
end

Public Instance Methods

check(minutes_limit = nil) click to toggle source
# File lib/sauce_overage/account.rb, line 53
def check minutes_limit = nil
  unless minutes_limit
    env           = ENV['SAUCE_OVERAGE_LIMIT']
    minutes_limit = env.to_i if env && !env.strip.empty?
  end

  fail 'minutes limit must be set' unless minutes_limit
  fail 'minutes limit must be an int' unless minutes_limit.is_a?(Integer)

  remaining_minutes = minutes

  if remaining_minutes < minutes_limit
    fail "#{minutes_limit} minute limit breached (#{remaining_minutes} remaining)"
  end

  nil
end
get_user() click to toggle source
# File lib/sauce_overage/account.rb, line 45
def get_user
  wait(2 * 60) { hurley_client.get("users/#{user}").body }
end
hurley_client() click to toggle source
# File lib/sauce_overage/account.rb, line 17
def hurley_client
  MUTEX.synchronize do
    return @hurley_client if @hurley_client
    client                              = @hurley_client = Hurley::Client.new 'https://saucelabs.com/rest/v1/'
    client.header[:content_type]        = 'application/json'
    client.request_options.timeout      = 2 * 60
    client.request_options.open_timeout = 2 * 60
    client.url.user                     = user
    client.url.password                 = key

    # Ensure body JSON string is parsed into a hash
    # Detect errors and fail so wait_true will retry the request
    client.after_call do |response|
      response.body = MultiJson.load(response.body) rescue {}

      client_server_error = %i(client_error server_error).include? response.status_type
      body_error          = response.body['error']

      if client_server_error || body_error
        response_error = body_error || ''
        fail(::Errno::ECONNREFUSED, response_error)
      end
    end

    @hurley_client
  end
end
minutes() click to toggle source
# File lib/sauce_overage/account.rb, line 49
def minutes
  get_user['minutes'].to_i
end