hackeroo 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Rakefile +11 -0
- data/hackeroo.gemspec +26 -0
- data/lib/hackeroo.rb +40 -0
- data/lib/hackeroo/action/favorite.rb +19 -0
- data/lib/hackeroo/action/follow.rb +30 -0
- data/lib/hackeroo/action/list_member_added.rb +39 -0
- data/lib/hackeroo/action/mention.rb +46 -0
- data/lib/hackeroo/action/reply.rb +27 -0
- data/lib/hackeroo/action/retweet.rb +27 -0
- data/lib/hackeroo/action/tweet.rb +20 -0
- data/lib/hackeroo/api/arguments.rb +13 -0
- data/lib/hackeroo/api/artists.rb +22 -0
- data/lib/hackeroo/api/performances.rb +22 -0
- data/lib/hackeroo/api/search.rb +37 -0
- data/lib/hackeroo/api/stages.rb +22 -0
- data/lib/hackeroo/api/users.rb +27 -0
- data/lib/hackeroo/api/utils.rb +187 -0
- data/lib/hackeroo/artist.rb +7 -0
- data/lib/hackeroo/base.rb +125 -0
- data/lib/hackeroo/client.rb +73 -0
- data/lib/hackeroo/configurable.rb +87 -0
- data/lib/hackeroo/core_ext/enumerable.rb +10 -0
- data/lib/hackeroo/core_ext/kernel.rb +6 -0
- data/lib/hackeroo/cursor.rb +87 -0
- data/lib/hackeroo/default.rb +77 -0
- data/lib/hackeroo/error.rb +32 -0
- data/lib/hackeroo/error/bad_gateway.rb +11 -0
- data/lib/hackeroo/error/bad_request.rb +10 -0
- data/lib/hackeroo/error/client_error.rb +35 -0
- data/lib/hackeroo/error/configuration_error.rb +8 -0
- data/lib/hackeroo/error/decode_error.rb +9 -0
- data/lib/hackeroo/error/forbidden.rb +10 -0
- data/lib/hackeroo/error/gateway_timeout.rb +11 -0
- data/lib/hackeroo/error/identity_map_key_error.rb +9 -0
- data/lib/hackeroo/error/internal_server_error.rb +11 -0
- data/lib/hackeroo/error/not_acceptable.rb +10 -0
- data/lib/hackeroo/error/not_found.rb +10 -0
- data/lib/hackeroo/error/server_error.rb +28 -0
- data/lib/hackeroo/error/service_unavailable.rb +11 -0
- data/lib/hackeroo/error/too_many_requests.rb +12 -0
- data/lib/hackeroo/error/unauthorized.rb +10 -0
- data/lib/hackeroo/error/unprocessable_entity.rb +10 -0
- data/lib/hackeroo/media/photo.rb +21 -0
- data/lib/hackeroo/performance.rb +7 -0
- data/lib/hackeroo/rate_limit.rb +45 -0
- data/lib/hackeroo/response/parse_json.rb +25 -0
- data/lib/hackeroo/response/raise_error.rb +31 -0
- data/lib/hackeroo/stage.rb +7 -0
- data/lib/hackeroo/user.rb +7 -0
- data/lib/hackeroo/version.rb +18 -0
- metadata +157 -0
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'hackeroo/core_ext/kernel'
|
2
|
+
|
3
|
+
module Hackeroo
|
4
|
+
class Cursor
|
5
|
+
include Enumerable
|
6
|
+
attr_reader :attrs, :collection
|
7
|
+
alias to_hash attrs
|
8
|
+
|
9
|
+
# Initializes a new Cursor object
|
10
|
+
#
|
11
|
+
# @param response [Hash]
|
12
|
+
# @param collection_name [String, Symbol] The name of the method to return the collection
|
13
|
+
# @param klass [Class] The class to instantiate object in the collection
|
14
|
+
# @param client [Hackeroo::Client]
|
15
|
+
# @param method_name [String, Symbol]
|
16
|
+
# @param method_options [Hash]
|
17
|
+
# @return [Hackeroo::Cursor]
|
18
|
+
def self.from_response(response, collection_name, klass, client, method_name, method_options)
|
19
|
+
new(response[:body], collection_name, klass, client, method_name, method_options)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Initializes a new Cursor
|
23
|
+
#
|
24
|
+
# @param attrs [Hash]
|
25
|
+
# @param collection_name [String, Symbol] The name of the method to return the collection
|
26
|
+
# @param klass [Class] The class to instantiate object in the collection
|
27
|
+
# @param client [Hackeroo::Client]
|
28
|
+
# @param method_name [String, Symbol]
|
29
|
+
# @param method_options [Hash]
|
30
|
+
# @return [Hackeroo::Cursor]
|
31
|
+
def initialize(attrs, collection_name, klass, client, method_name, method_options)
|
32
|
+
@attrs = attrs
|
33
|
+
@client = client
|
34
|
+
@method_name = method_name
|
35
|
+
@method_options = method_options
|
36
|
+
@collection = Array(attrs[collection_name.to_sym]).map do |item|
|
37
|
+
if klass
|
38
|
+
klass.fetch_or_new(item)
|
39
|
+
else
|
40
|
+
item
|
41
|
+
end
|
42
|
+
end
|
43
|
+
singleton_class.class_eval do
|
44
|
+
alias_method(collection_name.to_sym, :collection)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# @param collection [Array]
|
49
|
+
# @param cursor [Integer]
|
50
|
+
# @return [Array]
|
51
|
+
def all(collection=collection, cursor=next_cursor)
|
52
|
+
cursor = @client.send(@method_name.to_sym, @method_options.merge(:cursor => cursor))
|
53
|
+
collection += cursor.collection
|
54
|
+
cursor.last? ? collection.flatten : all(collection, cursor.next_cursor)
|
55
|
+
end
|
56
|
+
|
57
|
+
# @return [Enumerable]
|
58
|
+
def each
|
59
|
+
all(collection, next_cursor).each do |element|
|
60
|
+
yield element
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def next_cursor
|
65
|
+
@attrs[:next_cursor] || -1
|
66
|
+
end
|
67
|
+
alias next next_cursor
|
68
|
+
|
69
|
+
def previous_cursor
|
70
|
+
@attrs[:previous_cursor]
|
71
|
+
end
|
72
|
+
alias previous previous_cursor
|
73
|
+
|
74
|
+
# @return [Boolean]
|
75
|
+
def first?
|
76
|
+
previous_cursor.zero?
|
77
|
+
end
|
78
|
+
alias first first?
|
79
|
+
|
80
|
+
# @return [Boolean]
|
81
|
+
def last?
|
82
|
+
next_cursor.zero?
|
83
|
+
end
|
84
|
+
alias last last?
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday/request/multipart'
|
3
|
+
require 'hackeroo/configurable'
|
4
|
+
require 'hackeroo/error/client_error'
|
5
|
+
require 'hackeroo/error/server_error'
|
6
|
+
require 'hackeroo/response/parse_json'
|
7
|
+
require 'hackeroo/response/raise_error'
|
8
|
+
require 'hackeroo/version'
|
9
|
+
|
10
|
+
module Hackeroo
|
11
|
+
module Default
|
12
|
+
ENDPOINT = 'http://api.hackeroo.io' unless defined? Hackeroo::Default::ENDPOINT
|
13
|
+
CONNECTION_OPTIONS = {
|
14
|
+
:headers => {
|
15
|
+
:accept => 'application/json',
|
16
|
+
:user_agent => "Hackeroo Ruby Gem #{Hackeroo::Version}",
|
17
|
+
},
|
18
|
+
:request => {
|
19
|
+
:open_timeout => 5,
|
20
|
+
:timeout => 10,
|
21
|
+
},
|
22
|
+
} unless defined? Hackeroo::Default::CONNECTION_OPTIONS
|
23
|
+
IDENTITY_MAP = false unless defined? Hackeroo::Default::IDENTITY_MAP
|
24
|
+
MIDDLEWARE = Faraday::Builder.new do |builder|
|
25
|
+
# Convert request params to "www-form-urlencoded"
|
26
|
+
builder.use Faraday::Request::UrlEncoded
|
27
|
+
# Handle 4xx server responses
|
28
|
+
builder.use Hackeroo::Response::RaiseError, Hackeroo::Error::ClientError
|
29
|
+
# Parse JSON response bodies using MultiJson
|
30
|
+
builder.use Hackeroo::Response::ParseJson
|
31
|
+
# Handle 5xx server responses
|
32
|
+
builder.use Hackeroo::Response::RaiseError, Hackeroo::Error::ServerError
|
33
|
+
# Set Faraday's HTTP adapter
|
34
|
+
builder.adapter Faraday.default_adapter
|
35
|
+
end unless defined? Hackeroo::Default::MIDDLEWARE
|
36
|
+
|
37
|
+
class << self
|
38
|
+
|
39
|
+
# @return [Hash]
|
40
|
+
def options
|
41
|
+
Hash[Hackeroo::Configurable.keys.map{|key| [key, send(key)]}]
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [String]
|
45
|
+
def clientkey
|
46
|
+
ENV['HACKEROO_CLIENTKEY']
|
47
|
+
end
|
48
|
+
|
49
|
+
# @note This is configurable in case you want to use a Hackeroo-compatible endpoint.
|
50
|
+
# @see http://status.net/wiki/Hackeroo-compatible_API
|
51
|
+
# @see http://en.blog.wordpress.com/2009/12/12/hackeroo-api/
|
52
|
+
# @see http://staff.tumblr.com/post/287703110/api
|
53
|
+
# @see http://developer.typepad.com/typepad-hackeroo-api/hackeroo-api.html
|
54
|
+
# @return [String]
|
55
|
+
def endpoint
|
56
|
+
ENDPOINT
|
57
|
+
end
|
58
|
+
|
59
|
+
def connection_options
|
60
|
+
CONNECTION_OPTIONS
|
61
|
+
end
|
62
|
+
|
63
|
+
def identity_map
|
64
|
+
IDENTITY_MAP
|
65
|
+
end
|
66
|
+
|
67
|
+
# @note Faraday's middleware stack implementation is comparable to that of Rack middleware. The order of middleware is important: the first middleware on the list wraps all others, while the last middleware is the innermost one.
|
68
|
+
# @see https://github.com/technoweenie/faraday#advanced-middleware-usage
|
69
|
+
# @see http://mislav.uniqpath.com/2011/07/faraday-advanced-http/
|
70
|
+
# @return [Faraday::Builder]
|
71
|
+
def middleware
|
72
|
+
MIDDLEWARE
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Hackeroo
|
2
|
+
# Custom error class for rescuing from all Hackeroo errors
|
3
|
+
class Error < StandardError
|
4
|
+
attr_reader :rate_limit, :wrapped_exception
|
5
|
+
|
6
|
+
# @return [Hash]
|
7
|
+
def self.errors
|
8
|
+
@errors ||= Hash[descendants.map{|klass| [klass.const_get(:HTTP_STATUS_CODE), klass]}]
|
9
|
+
end
|
10
|
+
|
11
|
+
# @return [Array]
|
12
|
+
def self.descendants
|
13
|
+
ObjectSpace.each_object(::Class).select{|klass| klass < self}
|
14
|
+
end
|
15
|
+
|
16
|
+
# Initializes a new Error object
|
17
|
+
#
|
18
|
+
# @param exception [Exception, String]
|
19
|
+
# @param response_headers [Hash]
|
20
|
+
# @return [Hackeroo::Error]
|
21
|
+
def initialize(exception=$!, response_headers={})
|
22
|
+
@rate_limit = Hackeroo::RateLimit.new(response_headers)
|
23
|
+
@wrapped_exception = exception
|
24
|
+
exception.respond_to?(:backtrace) ? super(exception.message) : super(exception.to_s)
|
25
|
+
end
|
26
|
+
|
27
|
+
def backtrace
|
28
|
+
@wrapped_exception.respond_to?(:backtrace) ? @wrapped_exception.backtrace : super
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'hackeroo/error/server_error'
|
2
|
+
|
3
|
+
module Hackeroo
|
4
|
+
class Error
|
5
|
+
# Raised when Hackeroo returns the HTTP status code 502
|
6
|
+
class BadGateway < Hackeroo::Error::ServerError
|
7
|
+
HTTP_STATUS_CODE = 502
|
8
|
+
MESSAGE = "Hackeroo is down or being upgraded."
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'hackeroo/error'
|
2
|
+
|
3
|
+
module Hackeroo
|
4
|
+
class Error
|
5
|
+
# Raised when Hackeroo returns a 4xx HTTP status code or there's an error in Faraday
|
6
|
+
class ClientError < Hackeroo::Error
|
7
|
+
|
8
|
+
# Create a new error from an HTTP environment
|
9
|
+
#
|
10
|
+
# @param response [Hash]
|
11
|
+
# @return [Hackeroo::Error]
|
12
|
+
def self.from_response(response={})
|
13
|
+
new(parse_error(response[:body]), response[:response_headers])
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def self.parse_error(body)
|
19
|
+
if body.nil?
|
20
|
+
''
|
21
|
+
elsif body[:error]
|
22
|
+
body[:error]
|
23
|
+
elsif body[:errors]
|
24
|
+
first = Array(body[:errors]).first
|
25
|
+
if first.is_a?(Hash)
|
26
|
+
first[:message].chomp
|
27
|
+
else
|
28
|
+
first.chomp
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'hackeroo/error/server_error'
|
2
|
+
|
3
|
+
module Hackeroo
|
4
|
+
class Error
|
5
|
+
# Raised when Hackeroo returns the HTTP status code 504
|
6
|
+
class GatewayTimeout < Hackeroo::Error::ServerError
|
7
|
+
HTTP_STATUS_CODE = 504
|
8
|
+
MESSAGE = "The Hackeroo servers are up, but the request couldn't be serviced due to some failure within our stack. Try again later."
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'hackeroo/error/server_error'
|
2
|
+
|
3
|
+
module Hackeroo
|
4
|
+
class Error
|
5
|
+
# Raised when Hackeroo returns the HTTP status code 500
|
6
|
+
class InternalServerError < Hackeroo::Error::ServerError
|
7
|
+
HTTP_STATUS_CODE = 500
|
8
|
+
MESSAGE = "Something is technically wrong."
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'hackeroo/error'
|
2
|
+
|
3
|
+
module Hackeroo
|
4
|
+
class Error
|
5
|
+
# Raised when Hackeroo returns a 5xx HTTP status code
|
6
|
+
class ServerError < Hackeroo::Error
|
7
|
+
MESSAGE = "Server Error"
|
8
|
+
|
9
|
+
# Create a new error from an HTTP environment
|
10
|
+
#
|
11
|
+
# @param response [Hash]
|
12
|
+
# @return [Hackeroo::Error]
|
13
|
+
def self.from_response(response={})
|
14
|
+
new(nil, response[:response_headers])
|
15
|
+
end
|
16
|
+
|
17
|
+
# Initializes a new ServerError object
|
18
|
+
#
|
19
|
+
# @param message [String]
|
20
|
+
# @param response_headers [Hash]
|
21
|
+
# @return [Hackeroo::Error::ServerError]
|
22
|
+
def initialize(message=nil, response_headers={})
|
23
|
+
super((message || self.class.const_get(:MESSAGE)), response_headers)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'hackeroo/error/server_error'
|
2
|
+
|
3
|
+
module Hackeroo
|
4
|
+
class Error
|
5
|
+
# Raised when Hackeroo returns the HTTP status code 503
|
6
|
+
class ServiceUnavailable < Hackeroo::Error::ServerError
|
7
|
+
HTTP_STATUS_CODE = 503
|
8
|
+
MESSAGE = "(__-){ Hackeroo is over capacity."
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'hackeroo/error/client_error'
|
2
|
+
|
3
|
+
module Hackeroo
|
4
|
+
class Error
|
5
|
+
# Raised when Hackeroo returns the HTTP status code 429
|
6
|
+
class TooManyRequests < Hackeroo::Error::ClientError
|
7
|
+
HTTP_STATUS_CODE = 429
|
8
|
+
end
|
9
|
+
EnhanceYourCalm = TooManyRequests
|
10
|
+
RateLimited = TooManyRequests
|
11
|
+
end
|
12
|
+
end
|