lib/pilha.rb in pilha-0.1.1 vs lib/pilha.rb in pilha-0.1.2
- old
+ new
@@ -1,15 +1,18 @@
path = File.expand_path(File.dirname(__FILE__))
$LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
-require 'open-uri'
+require 'zlib'
require 'json'
+require 'open-uri'
require 'forwardable'
require 'pilha/stack_overflow/statistics'
require 'pilha/stack_overflow/badge'
require 'pilha/stack_overflow/user'
+require 'pilha/stack_overflow/answer'
+require 'pilha/stack_overflow/comment'
module StackExchange
module StackOverflow
class Client
@@ -20,37 +23,37 @@
attr_reader :api_version
attr_reader :api_key
class << self
def config &block
- options = {}
+ options = OpenStruct.new
yield options if block_given?
- client = new(options)
- include_client(client, Badge, Statistics, User)
+
+ client = Client.new(options)
+ include_client(client, Badge, Statistics, User, Answer, Comment)
end
def include_client(client, *classes)
classes.each do |klass|
klass.instance_variable_set(:@client, client)
end
end
end
- def initialize(options = {})
- @url = normalize(options[:url] || URL )
- @api_version = options[:api_version] || options[:version] || API_VERSION
- @api_key = options[:api_key] || options[:key]
+ def initialize(options = OpenStruct.new)
+ @url = normalize(options.url || URL )
+ @api_version = options.api_version || API_VERSION
+ @api_key = options.api_key
end
def api_method_path(pattern, options = {})
pattern << '/' unless pattern.end_with? '/'
parts = pattern.split('/').select { |part| part =~ /^:/ }
parts.each do |part|
key = part.sub(':', '').intern
pattern.sub!(part, options[key].to_s)
- options.delete key
end
pattern
end
@@ -58,25 +61,30 @@
options.merge! :api_key => api_key if api_key
root_path + api_method_path(method, options) + query_string(options)
end
def get(url)
- stream = open(url) { |stream| stream.read }
+ stream = open(url) { |stream| Zlib::GzipReader.new(stream).read }
JSON.parse stream
end
def root_path
url + api_version
end
+ def request(path, options)
+ get(api_method_url(path, options))
+ end
+
private
def key?
!!@api_key
end
def query_string(options)
params = options[:query]
if params
+ params = params.sort_by { |k, v| k.to_s }
'?' + params.inject([]) do |arr, (key, value)|
arr << "#{key}=#{value}"
end.join('&')
else
''