lib/gitlab_api.rb (50 lines of code) (raw):

require 'httparty' require 'addressable' class GitlabApi ENDPOINT = 'https://gitlab.com/api/v4' UpdateFailed = Class.new(StandardError) def initialize(token: nil) @token = token end def count(path) get(path).headers['X-Total'] end def get(path) path = "#{ENDPOINT}/#{path}" unless path.start_with?(ENDPOINT) options = { headers: { 'Private-Token': token } } url = Addressable::URI.parse(path) existing_query_values = url.query_values || {} existing_query_values['per_page'] ||= 50 url.query_values = existing_query_values HTTParty.get(url.to_s, options).tap do |response| check_response_code!(:get, url, response) end end def post(path, body:) post_or_put(path, body: body, method: :post) end def put(path, body:) post_or_put(path, body: body, method: :put) end private attr_reader :token def post_or_put(path, body:, method:) path = "#{ENDPOINT}/#{path}" unless path.start_with?(ENDPOINT) options = { body: body, headers: { 'Private-Token': token } } HTTParty.send(method, path, options).tap do |response| expected_code = method == :post ? 201 : 200 check_response_code!(method, path, response, expected_code: expected_code) end end def check_response_code!(method, path, response, expected_code: 200) return if response.code == expected_code puts "#{method.to_s.upcase} to #{path} failed!" puts '' puts "Response code: #{response.code}. Body:" puts response.body raise UpdateFailed end end