class Pebbles::API

Constants

HEADERS
OPTIONS

Public Class Methods

new(options={}) click to toggle source
# File lib/pebbles/api.rb, line 35
def initialize(options={})
  options = OPTIONS.merge(options)
  options[:headers] = HEADERS.merge(options[:headers])

  @api_key = options.delete(:api_key) || ENV['PEBBLES_API_KEY']
  if !@api_key && options.has_key?(:username) && options.has_key?(:password)
    username = options.delete(:username)
    password = options.delete(:password)
    @connection = Excon.new("#{options[:scheme]}://#{options[:host]}", options)
    @api_key = self.post_login(username, password).body["api_key"]
  end

  @connection = Excon.new("#{options[:scheme]}://#{options[:host]}", options)
end

Public Instance Methods

delete_app(app) click to toggle source

DELETE /apps/:app

# File lib/pebbles/api/apps.rb, line 5
def delete_app(app)
  request(
    :expects  => 200,
    :method   => :delete,
    :path     => "/apps/#{app}"
  )
end
delete_config_var(app, key) click to toggle source

DELETE /apps/:app/config_vars/:key

# File lib/pebbles/api/config_vars.rb, line 5
def delete_config_var(app, key)
  request(
    :expects  => 200,
    :method   => :delete,
    :path     => "/apps/#{app}/config_vars/#{escape(key)}"
  )
end
get_app(app) click to toggle source

GET /apps/:app

# File lib/pebbles/api/apps.rb, line 23
def get_app(app)
  request(
    :expects  => 200,
    :method   => :get,
    :path     => "/apps/#{app}"
  )
end
get_app_maintenance(app) click to toggle source

GET /apps/:app/server/maintenance

# File lib/pebbles/api/apps.rb, line 32
def get_app_maintenance(app)
  request(
    :expects  => 200,
    :method   => :get,
    :path     => "/apps/#{app}/server/maintenance"
  )
end
get_apps() click to toggle source

GET /apps

# File lib/pebbles/api/apps.rb, line 14
def get_apps
  request(
    :expects  => 200,
    :method   => :get,
    :path     => "/apps"
  )
end
get_config_vars(app) click to toggle source

GET /apps/:app/config_vars

# File lib/pebbles/api/config_vars.rb, line 14
def get_config_vars(app)
  request(
    :expects  => 200,
    :method   => :get,
    :path     => "/apps/#{app}/config_vars"
  )
end
get_release(app, release) click to toggle source

GET /apps/:app/releases/:release

# File lib/pebbles/api/releases.rb, line 14
def get_release(app, release)
  request(
    :expects  => 200,
    :method   => :get,
    :path     => "/apps/#{app}/releases/#{release}"
  )
end
get_releases(app) click to toggle source

GET /apps/:app/releases

# File lib/pebbles/api/releases.rb, line 5
def get_releases(app)
  request(
    :expects  => 200,
    :method   => :get,
    :path     => "/apps/#{app}/releases"
  )
end
get_user() click to toggle source

GET /user

# File lib/pebbles/api/user.rb, line 5
def get_user
  request(
    :expects  => 200,
    :method   => :get,
    :path     => "/user"
  )
end
post_app(params={}) click to toggle source

POST /apps

# File lib/pebbles/api/apps.rb, line 41
def post_app(params={})
  request(
    :expects  => 201,
    :method   => :post,
    :path     => '/apps',
    :query    => app_params(params)
  )
end
post_app_maintenance(app, maintenance_mode) click to toggle source

POST /apps/:app/server/maintenance

# File lib/pebbles/api/apps.rb, line 51
def post_app_maintenance(app, maintenance_mode)
  request(
    :expects  => 200,
    :method   => :post,
    :path     => "/apps/#{app}/server/maintenance",
    :query    => {'maintenance_mode' => maintenance_mode}
  )
end
post_login(username, password) click to toggle source
# File lib/pebbles/api/login.rb, line 4
def post_login(username, password)
  request(
    :expects  => 200,
    :method   => :post,
    :path     => '/login',
    :query    => { 'username' => username, 'password' => password }
  )
end
post_release(app, release=nil) click to toggle source

POST /apps/:app/releases/:release

# File lib/pebbles/api/releases.rb, line 23
def post_release(app, release=nil)
  request(
    :expects  => 200,
    :method   => :post,
    :path     => "/apps/#{app}/releases",
    :query    => {'rollback' => release}
  )
end
put_app(app, params) click to toggle source

PUT /apps/:app

# File lib/pebbles/api/apps.rb, line 61
def put_app(app, params)
  request(
    :expects  => 200,
    :method   => :put,
    :path     => "/apps/#{app}",
    :query    => app_params(params)
  )
end
put_config_vars(app, vars) click to toggle source

PUT /apps/:app/config_vars

# File lib/pebbles/api/config_vars.rb, line 23
def put_config_vars(app, vars)
  request(
    :body     => MultiJson.dump(vars),
    :expects  => 200,
    :method   => :put,
    :path     => "/apps/#{app}/config_vars"
  )
end
request(params, &block) click to toggle source
# File lib/pebbles/api.rb, line 50
def request(params, &block)
  if @api_key
    params[:query] = {
      'api_key' => @api_key,
    }.merge(params[:query] || {})
  end
  
  begin
    response = @connection.request(params, &block)
  rescue Excon::Errors::HTTPStatusError => error
    klass = case error.response.status
      when 401 then Pebbles::API::Errors::Unauthorized
      when 402 then Pebbles::API::Errors::VerificationRequired
      when 403 then Pebbles::API::Errors::Forbidden
      when 404
        if error.request[:path].match /\/apps\/\/.*/
          Pebbles::API::Errors::NilApp
        else
          Pebbles::API::Errors::NotFound
        end
      when 408 then Pebbles::API::Errors::Timeout
      when 422 then Pebbles::API::Errors::RequestFailed
      when 423 then Pebbles::API::Errors::Locked
      when 429 then Pebbles::API::Errors::RateLimitExceeded
      when /50./ then Pebbles::API::Errors::RequestFailed
      else Pebbles::API::Errors::ErrorWithResponse
    end

    decompress_response!(error.response)
    reerror = klass.new(error.message, error.response)
    reerror.set_backtrace(error.backtrace)
    raise(reerror)
  end

  if response.body && !response.body.empty?
    decompress_response!(response)
    begin
      response.body = MultiJson.load(response.body)
    rescue
      # leave non-JSON body as is
    end
  end

  # reset (non-persistent) connection
  @connection.reset
  
  if response.headers.has_key?('X-Pebbles-Warning')
    Pebbles::Command.warnings.concat(response.headers['X-Pebbles-Warning'].split("\n"))
  end
      
  response
end

Private Instance Methods

app_params(params) click to toggle source
# File lib/pebbles/api.rb, line 110
def app_params(params)
  app_params = {}
  params.each do |key, value|
    app_params["app[#{key}]"] = value
  end
  app_params
end
decompress_response!(response) click to toggle source
# File lib/pebbles/api.rb, line 105
def decompress_response!(response)
  return unless response.headers['Content-Encoding'] == 'gzip'
  response.body = Zlib::GzipReader.new(StringIO.new(response.body)).read
end
escape(string) click to toggle source
# File lib/pebbles/api.rb, line 118
def escape(string)
  CGI.escape(string).gsub('.', '%2E')
end