lib/octopi.rb in fcoury-octopi-0.0.6 vs lib/octopi.rb in fcoury-octopi-0.0.7

- old
+ new

@@ -5,10 +5,24 @@ module Octopi class Api; end ANONYMOUS_API = Api.new + def authenticated(*args, &block) + opts = args.last.is_a?(Hash) ? args.last : {} + config = read_gitconfig + login = config["github"]["user"] + token = config["github"]["token"] + + api = Api.new(login, token) + api.trace_level = opts[:trace] + + puts "=> Trace on: #{api.trace_level}" if api.trace_level + + yield api + end + def authenticated_with(*args, &block) opts = args.last.is_a?(Hash) ? args.last : {} if opts[:config] config = File.open(opts[:config]) { |yf| YAML::load(yf) } raise "Missing config #{opts[:config]}" unless config @@ -21,24 +35,41 @@ end puts "=> Trace on: #{trace}" if trace api = Api.new(login, token) - api.trace = trace if trace + api.trace_level = trace if trace yield api end + def read_gitconfig + config = {} + group = nil + File.foreach("#{ENV['HOME']}/.gitconfig") do |line| + line.strip! + if line[0] != ?# and line =~ /\S/ + if line =~ /^\[(.*)\]$/ + group = $1 + else + key, value = line.split("=") + (config[group]||={})[key.strip] = value.strip + end + end + end + config + end + class Api include HTTParty CONTENT_TYPE = { 'yaml' => 'application/x-yaml', 'json' => 'application/json', 'xml' => 'application/sml' } base_uri "http://github.com/api/v2" - attr_accessor :format, :login, :token, :trace, :read_only + attr_accessor :format, :login, :token, :trace_level, :read_only def initialize(login = nil, token = nil, format = "yaml") @format = format @read_only = true @@ -64,11 +95,11 @@ def open_issue(user, repo, params) Issue.open(user, repo, params, self) end def repository(name) - repo = Repository.find(login, name) + repo = Repository.find(user, name, self) repo.api = self repo end alias_method :repo, :repository @@ -89,31 +120,36 @@ def get_raw(path, params) get(path, params, 'plain') end def post(path, params = {}, format = "yaml") - trace "POST", path, params + trace "POST", "/#{format}#{path}", params submit(path, params, format) do |path, params, format| resp = self.class.post "/#{format}#{path}", :query => params resp end end private def submit(path, params = {}, format = "yaml", &block) - params.each_pair { |k,v| path = path.gsub(":#{k.to_s}", v) } + params.each_pair do |k,v| + if path =~ /:#{k.to_s}/ + params.delete(k) + path = path.gsub(":#{k.to_s}", v) + end + end query = login ? { :login => login, :token => token } : {} query.merge!(params) - if @trace - case @trace + if @trace_level + case @trace_level when "curl" query_trace = [] query.each_pair { |k,v| query_trace << "-F '#{k}=#{v}'" } puts "===== [curl version]" - puts "curl #{query_trace.join(" ")} #{self.class.base_uri}#{path}" - puts "===================" + puts "curl #{query_trace.join(" ")} #{self.class.base_uri}/#{format}#{path}" + puts "====================" end end resp = yield(path, query, format) raise APIError, @@ -128,17 +164,17 @@ end resp end def get(path, params = {}, format = "yaml") - trace "GET", path, params + trace "GET [#{format}]", "/#{format}#{path}", params submit(path, params, format) do |path, params, format| self.class.get "/#{format}#{path}" end end def trace(oper, url, params) - return unless @trace + return unless trace_level par_str = " params: " + params.map { |p| "#{p[0]}=#{p[1]}" }.join(", ") if params and !params.empty? puts "#{oper}: #{url}#{par_str}" end end