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