class Stash::Client

Constants

VERSION

Attributes

url[R]

Public Class Methods

new(opts = {}) click to toggle source
# File lib/stash/client.rb, line 11
def initialize(opts = {})
  if opts[:client]
    @client = opts[:client]
  else
    if opts[:host] && opts[:scheme]
      @url = Addressable::URI.parse(opts[:scheme] + '://' + opts[:host] + '/rest/api/1.0/')
    elsif opts[:host]
      @url = Addressable::URI.parse('http://' + opts[:host] + '/rest/api/1.0/')
    elsif opts[:url]
      @url = Addressable::URI.parse(opts[:url])
    elsif opts[:uri] && opts[:uri].kind_of?(Addressable::URI)
      @url = opts[:uri]
    else
      raise ArgumentError, "must provide :url or :host"
    end

    @url.userinfo = opts[:credentials] if opts[:credentials]

    @client = Faraday.new(@url.site)
  end

end

Public Instance Methods

changes_for(repo, sha, opts = {}) click to toggle source
# File lib/stash/client.rb, line 91
def changes_for(repo, sha, opts = {})
  path = remove_leading_slash repo.fetch('link').fetch('url').sub('browse', 'changes')
  uri = @url.join(path)

  query_values = { 'until' =>  sha }
  query_values['since'] = opts[:parent] if opts[:parent]
  query_values['limit'] = opts[:limit] if opts[:limit]

  uri.query_values = query_values

  if query_values['limit']
    fetch(uri).fetch('values')
  else
    fetch_all(uri)
  end
end
commits_for(repo, opts = {}) click to toggle source
# File lib/stash/client.rb, line 67
def commits_for(repo, opts = {})
  query_values = {}

  path = remove_leading_slash repo.fetch('link').fetch('url').sub('browse', 'commits')
  uri = @url.join(path)

  query_values['since'] = opts[:since] if opts[:since]
  query_values['until'] = opts[:until] if opts[:until]
  query_values['limit'] = Integer(opts[:limit]) if opts[:limit]

  if query_values.empty?
    # default limit to 100 commits
    query_values['limit'] = 100
  end

  uri.query_values = query_values

  if query_values['limit'] && query_values['limit'] < 100
    fetch(uri).fetch('values')
  else
    fetch_all(uri)
  end
end
create_project(opts={}) click to toggle source
# File lib/stash/client.rb, line 38
def create_project(opts={})
  post @url.join('projects'), opts
end
delete_project(project) click to toggle source
# File lib/stash/client.rb, line 47
def delete_project(project)
  relative_project_path = project.fetch('link').fetch('url')
  delete @url.join(remove_leading_slash(relative_project_path))
end
project_named(name) click to toggle source
# File lib/stash/client.rb, line 59
def project_named(name)
  projects.find { |e| e['name'] == name }
end
projects() click to toggle source
# File lib/stash/client.rb, line 34
def projects
  fetch_all @url.join('projects')
end
repositories() click to toggle source
# File lib/stash/client.rb, line 52
def repositories
  projects.map do |project|
    relative_project_path = project.fetch('link').fetch('url') + '/repos'
    fetch_all @url.join(remove_leading_slash(relative_project_path))
  end.flatten
end
repository_named(name) click to toggle source
# File lib/stash/client.rb, line 63
def repository_named(name)
  repositories.find { |e| e['name'] == name }
end
update_project(project, opts={}) click to toggle source
# File lib/stash/client.rb, line 42
def update_project(project, opts={})
  relative_project_path = project.fetch('link').fetch('url')
  put @url.join(remove_leading_slash(relative_project_path)), opts
end

Private Instance Methods

delete(uri) click to toggle source
# File lib/stash/client.rb, line 157
def delete(uri)
  res = @client.delete { |req|
    req.url uri.to_s
    req.headers['Accpet']       = 'application/json'
  }

  res.body
end
fetch(uri) click to toggle source
# File lib/stash/client.rb, line 124
def fetch(uri)
  res = @client.get { |req|
    req.url uri.to_s
    req.headers['Accept'] = 'application/json'
  }

  parse(res.body)
end
fetch_all(uri) click to toggle source
# File lib/stash/client.rb, line 110
def fetch_all(uri)
  response, result = {}, []

  until response['isLastPage']
    response = fetch(uri)
    result += response['values']

    next_page_start = response['nextPageStart'] || (response['start'] + response['size'])
    uri.query_values = (uri.query_values || {}).merge('start' => next_page_start)
  end

  result
end
parse(str) click to toggle source
# File lib/stash/client.rb, line 166
def parse(str)
  JSON.parse(str)
rescue Encoding::InvalidByteSequenceError
  # HACK
  JSON.parse(str.force_encoding("UTF-8"))
end
post(uri, data) click to toggle source
# File lib/stash/client.rb, line 133
def post(uri, data)
  res = @client.post { |req|
    req.url uri.to_s
    req.body = data.to_json

    req.headers['Content-Type'] = 'application/json'
    req.headers['Accpet']       = 'application/json'
  }

  parse(res.body)
end
put(uri, data) click to toggle source
# File lib/stash/client.rb, line 145
def put(uri, data)
  res = @client.put { |req|
    req.url uri.to_s
    req.body = data.to_json

    req.headers['Content-Type'] = 'application/json'
    req.headers['Accpet']       = 'application/json'
  }

  parse(res.body)
end
remove_leading_slash(str) click to toggle source
# File lib/stash/client.rb, line 173
def remove_leading_slash(str)
  str.sub(/\A\//, '')
end