nimbu-api 0.0.1
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.
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/nimbu-api.rb +43 -0
- data/lib/nimbu-api/authentication.rb +76 -0
- data/lib/nimbu-api/builder.rb +31 -0
- data/lib/nimbu-api/client.rb +26 -0
- data/lib/nimbu-api/configuration.rb +109 -0
- data/lib/nimbu-api/connection.rb +88 -0
- data/lib/nimbu-api/endpoint.rb +199 -0
- data/lib/nimbu-api/endpoints/authorizations.rb +113 -0
- data/lib/nimbu-api/endpoints/channels.rb +31 -0
- data/lib/nimbu-api/endpoints/channels/entries.rb +50 -0
- data/lib/nimbu-api/endpoints/sites.rb +34 -0
- data/lib/nimbu-api/endpoints/videos.rb +26 -0
- data/lib/nimbu-api/errors.rb +31 -0
- data/lib/nimbu-api/errors/bad_request.rb +14 -0
- data/lib/nimbu-api/errors/client_error.rb +20 -0
- data/lib/nimbu-api/errors/forbidden.rb +14 -0
- data/lib/nimbu-api/errors/internal_server_error.rb +15 -0
- data/lib/nimbu-api/errors/invalid_options.rb +18 -0
- data/lib/nimbu-api/errors/not_acceptable.rb +15 -0
- data/lib/nimbu-api/errors/not_found.rb +14 -0
- data/lib/nimbu-api/errors/required_params.rb +18 -0
- data/lib/nimbu-api/errors/service_error.rb +65 -0
- data/lib/nimbu-api/errors/service_unavailable.rb +15 -0
- data/lib/nimbu-api/errors/unauthorized.rb +15 -0
- data/lib/nimbu-api/errors/unknown_value.rb +18 -0
- data/lib/nimbu-api/errors/unprocessable_entity.rb +14 -0
- data/lib/nimbu-api/errors/validations.rb +18 -0
- data/lib/nimbu-api/pagination.rb +106 -0
- data/lib/nimbu-api/pagination/page_iterator.rb +157 -0
- data/lib/nimbu-api/pagination/page_links.rb +48 -0
- data/lib/nimbu-api/pagination/paged_request.rb +41 -0
- data/lib/nimbu-api/pagination/pagination.rb +102 -0
- data/lib/nimbu-api/request.rb +81 -0
- data/lib/nimbu-api/request/arguments.rb +171 -0
- data/lib/nimbu-api/request/basic_auth.rb +31 -0
- data/lib/nimbu-api/request/json.rb +46 -0
- data/lib/nimbu-api/request/normalizer.rb +29 -0
- data/lib/nimbu-api/request/oauth2.rb +42 -0
- data/lib/nimbu-api/request/parameter_filter.rb +34 -0
- data/lib/nimbu-api/request/validations.rb +25 -0
- data/lib/nimbu-api/request/validations/format.rb +26 -0
- data/lib/nimbu-api/request/validations/presence.rb +32 -0
- data/lib/nimbu-api/request/validations/required.rb +26 -0
- data/lib/nimbu-api/request/validations/token.rb +35 -0
- data/lib/nimbu-api/response.rb +34 -0
- data/lib/nimbu-api/response/header.rb +76 -0
- data/lib/nimbu-api/response/json.rb +29 -0
- data/lib/nimbu-api/response/mashify.rb +24 -0
- data/lib/nimbu-api/response/raise_error.rb +18 -0
- data/lib/nimbu-api/response/wrapper.rb +149 -0
- data/lib/nimbu-api/response/xmlize.rb +26 -0
- data/lib/nimbu-api/utils/all.rb +6 -0
- data/lib/nimbu-api/utils/constants.rb +37 -0
- data/lib/nimbu-api/utils/descendants.rb +11 -0
- data/lib/nimbu-api/utils/extend_array.rb +17 -0
- data/lib/nimbu-api/utils/extend_hash.rb +73 -0
- data/lib/nimbu-api/utils/json.rb +19 -0
- data/lib/nimbu-api/utils/url.rb +56 -0
- data/lib/nimbu-api/version.rb +3 -0
- data/nimbu-api.gemspec +31 -0
- metadata +294 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
require 'nimbu-api/utils/json'
|
5
|
+
|
6
|
+
module Nimbu
|
7
|
+
class Response::Json < Response
|
8
|
+
include Nimbu::Utils::Json
|
9
|
+
|
10
|
+
dependency 'multi_json'
|
11
|
+
|
12
|
+
define_parser do |body|
|
13
|
+
Nimbu::Utils::Json.decode body
|
14
|
+
end
|
15
|
+
|
16
|
+
def parse(body)
|
17
|
+
case body
|
18
|
+
when ''
|
19
|
+
nil
|
20
|
+
when 'true'
|
21
|
+
true
|
22
|
+
when 'false'
|
23
|
+
false
|
24
|
+
else
|
25
|
+
self.class.parser.call body
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end # Response::Json
|
29
|
+
end # Nimbu
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
|
5
|
+
module Nimbu
|
6
|
+
class Response::Mashify < Response
|
7
|
+
dependency 'hashie/mash'
|
8
|
+
|
9
|
+
define_parser do |body|
|
10
|
+
::Hashie::Mash.new body
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse(body)
|
14
|
+
case body
|
15
|
+
when Hash
|
16
|
+
self.class.parser.call body
|
17
|
+
when Array
|
18
|
+
body.map { |item| item.is_a?(Hash) ? self.class.parser.call(item) : item }
|
19
|
+
else
|
20
|
+
body
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end # Response::Mashify
|
24
|
+
end # Nimbu
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
require 'nimbu-api/errors'
|
5
|
+
|
6
|
+
module Nimbu
|
7
|
+
class Response::RaiseError < Faraday::Response::Middleware
|
8
|
+
|
9
|
+
def on_complete(env)
|
10
|
+
# status_code = env[:status].to_i
|
11
|
+
# service_error = Nimbu::Error::ServiceError
|
12
|
+
# error_class = service_error.errors[status_code]
|
13
|
+
# error_class = service_error if !error_class and (400...600).include? status_code
|
14
|
+
# raise error_class.new(env) if error_class
|
15
|
+
end
|
16
|
+
|
17
|
+
end # Response::RaiseError
|
18
|
+
end # Nimbu
|
@@ -0,0 +1,149 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Nimbu
|
4
|
+
class Response
|
5
|
+
# A class responsible for proxing to faraday response
|
6
|
+
class Wrapper
|
7
|
+
extend Forwardable
|
8
|
+
include Pagination
|
9
|
+
include Enumerable
|
10
|
+
|
11
|
+
attr_reader :response
|
12
|
+
attr_reader :current_api
|
13
|
+
attr_reader :env
|
14
|
+
|
15
|
+
def_delegators :body, :empty?, :size, :include?, :length, :to_a, :first, :flatten, :include?, :keys, :[]
|
16
|
+
|
17
|
+
def initialize(response, current_api)
|
18
|
+
@response = response
|
19
|
+
@current_api = current_api
|
20
|
+
@env = response.env
|
21
|
+
end
|
22
|
+
|
23
|
+
# Request url
|
24
|
+
#
|
25
|
+
def url
|
26
|
+
response.env[:url].to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def body=(value)
|
30
|
+
@body = value
|
31
|
+
@env[:body] = value
|
32
|
+
end
|
33
|
+
|
34
|
+
# Response raw body
|
35
|
+
#
|
36
|
+
def body
|
37
|
+
@body ? @body : response.body
|
38
|
+
end
|
39
|
+
|
40
|
+
# Response status
|
41
|
+
#
|
42
|
+
def status
|
43
|
+
response.status
|
44
|
+
end
|
45
|
+
|
46
|
+
def success?
|
47
|
+
response.success?
|
48
|
+
end
|
49
|
+
|
50
|
+
def redirect?
|
51
|
+
status.to_i >= 300 && status.to_i < 400
|
52
|
+
end
|
53
|
+
|
54
|
+
def client_error?
|
55
|
+
status.to_i >= 400 && status.to_i < 500
|
56
|
+
end
|
57
|
+
|
58
|
+
def server_error?
|
59
|
+
status.to_i >= 500 && status.to_i < 600
|
60
|
+
end
|
61
|
+
|
62
|
+
# Return response headers
|
63
|
+
#
|
64
|
+
def headers
|
65
|
+
Nimbu::Response::Header.new(env)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Lookup an attribute from the body if hash, otherwise behave like array index.
|
69
|
+
# Convert any key to string before calling.
|
70
|
+
#
|
71
|
+
def [](key)
|
72
|
+
if self.body.is_a?(Array)
|
73
|
+
self.body[key]
|
74
|
+
else
|
75
|
+
self.body.send(:"#{key}")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def last
|
80
|
+
self[self.length-1] if self.length.to_i > 0
|
81
|
+
end
|
82
|
+
|
83
|
+
# Return response body as string
|
84
|
+
#
|
85
|
+
def to_s
|
86
|
+
body.to_s
|
87
|
+
end
|
88
|
+
|
89
|
+
# Convert the ResponseWrapper into a Hash
|
90
|
+
#
|
91
|
+
def to_hash
|
92
|
+
body.to_hash
|
93
|
+
end
|
94
|
+
|
95
|
+
# Convert the ResponseWrapper into an Array
|
96
|
+
#
|
97
|
+
def to_ary
|
98
|
+
body.to_ary
|
99
|
+
end
|
100
|
+
|
101
|
+
# Iterate over each resource inside the body
|
102
|
+
#
|
103
|
+
def each
|
104
|
+
body_parts = self.body.respond_to?(:each) ? self.body : [self.body]
|
105
|
+
return body_parts.to_enum unless block_given?
|
106
|
+
body_parts.each { |part| yield(part) }
|
107
|
+
end
|
108
|
+
|
109
|
+
# Check if body has an attribute
|
110
|
+
#
|
111
|
+
def has_key?(key)
|
112
|
+
self.body.is_a?(Hash) && self.body.has_key?(key)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Coerce any method calls for body attributes
|
116
|
+
#
|
117
|
+
def method_missing(method_name, *args, &block)
|
118
|
+
if self.has_key?(method_name.to_s)
|
119
|
+
self.[](method_name, &block)
|
120
|
+
else
|
121
|
+
super
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# Check if method is defined on the body
|
126
|
+
#
|
127
|
+
def respond_to?(method_name)
|
128
|
+
if self.has_key?(method_name.to_s)
|
129
|
+
true
|
130
|
+
else
|
131
|
+
super
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# Print only response body
|
136
|
+
#
|
137
|
+
def inspect
|
138
|
+
"#<#{self.class.name} @body=\"#{self.body}\">"
|
139
|
+
end
|
140
|
+
|
141
|
+
# Compare the wrapper with other wrapper for equality
|
142
|
+
#
|
143
|
+
def ==(other)
|
144
|
+
self.env == other.env &&
|
145
|
+
self.body == other.body
|
146
|
+
end
|
147
|
+
end # Wrapper
|
148
|
+
end # Response
|
149
|
+
end # Nimbu
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
|
5
|
+
module Nimbu
|
6
|
+
class Response::Xmlize < Response
|
7
|
+
dependency 'nokogiri'
|
8
|
+
|
9
|
+
define_parser do |body|
|
10
|
+
::Nokogiri::XML body
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse(body)
|
14
|
+
case body
|
15
|
+
when ''
|
16
|
+
nil
|
17
|
+
when 'true'
|
18
|
+
true
|
19
|
+
when 'false'
|
20
|
+
false
|
21
|
+
else
|
22
|
+
self.class.parser.call body
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end # Response::Xmlize
|
26
|
+
end # Nimbu
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Nimbu
|
2
|
+
module Utils
|
3
|
+
module Constants
|
4
|
+
extend self
|
5
|
+
|
6
|
+
# Response headers
|
7
|
+
RATELIMIT_REMAINING = 'X-RateLimit-Remaining'.freeze
|
8
|
+
RATELIMIT_LIMIT = 'X-RateLimit-Limit'.freeze
|
9
|
+
CONTENT_TYPE = 'Content-Type'.freeze
|
10
|
+
CONTENT_LENGTH = 'content-length'.freeze
|
11
|
+
CACHE_CONTROL = 'cache-control'.freeze
|
12
|
+
ETAG = 'ETag'.freeze
|
13
|
+
SERVER = 'Server'.freeze
|
14
|
+
DATE = 'Date'.freeze
|
15
|
+
LOCATION = 'Location'.freeze
|
16
|
+
USER_AGENT = 'User-Agent'.freeze
|
17
|
+
ACCEPT = 'Accept'.freeze
|
18
|
+
ACCEPT_CHARSET = 'Accept-Charset'.freeze
|
19
|
+
OAUTH_SCOPES = 'X-Oauth-Scopes'.freeze
|
20
|
+
ACCEPTED_OAUTH_SCOPES = 'X-Accepted-Oauth-Scopes'.freeze
|
21
|
+
|
22
|
+
# Link headers
|
23
|
+
HEADER_LINK = "Link".freeze
|
24
|
+
HEADER_NEXT = "X-Next".freeze
|
25
|
+
HEADER_LAST = "X-Last".freeze
|
26
|
+
META_REL = "rel".freeze
|
27
|
+
META_LAST = "last".freeze
|
28
|
+
META_NEXT = "next".freeze
|
29
|
+
META_FIRST = "first".freeze
|
30
|
+
META_PREV = "prev".freeze
|
31
|
+
PARAM_PAGE = "page".freeze
|
32
|
+
PARAM_PER_PAGE = "per_page".freeze
|
33
|
+
PARAM_START_PAGE = "start_page".freeze
|
34
|
+
|
35
|
+
end # Constants
|
36
|
+
end # Utils
|
37
|
+
end # Nimbu
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Array # :nodoc:
|
2
|
+
|
3
|
+
def except(*keys) # :nodoc:
|
4
|
+
self.dup.except!(*keys)
|
5
|
+
end unless method_defined?(:except)
|
6
|
+
|
7
|
+
def except!(*items) # :nodoc:
|
8
|
+
copy = self.dup
|
9
|
+
copy.reject! { |item| items.include? item }
|
10
|
+
copy
|
11
|
+
end unless method_defined?(:except!)
|
12
|
+
|
13
|
+
def extract_options!
|
14
|
+
last.is_a?(::Hash) ? pop : {}
|
15
|
+
end
|
16
|
+
|
17
|
+
end # Array
|
@@ -0,0 +1,73 @@
|
|
1
|
+
class Hash # :nodoc:
|
2
|
+
|
3
|
+
def except(*items) # :nodoc:
|
4
|
+
self.dup.except!(*items)
|
5
|
+
end unless method_defined?(:except)
|
6
|
+
|
7
|
+
def except!(*keys) # :nodoc:
|
8
|
+
copy = self.dup
|
9
|
+
keys.each { |key| copy.delete!(key) }
|
10
|
+
copy
|
11
|
+
end unless method_defined?(:except!)
|
12
|
+
|
13
|
+
def symbolize_keys # :nodoc:
|
14
|
+
inject({}) do |hash, (key, value)|
|
15
|
+
hash[(key.to_sym rescue key) || key] = value
|
16
|
+
hash
|
17
|
+
end
|
18
|
+
end unless method_defined?(:symbolize_keys)
|
19
|
+
|
20
|
+
def symbolize_keys! # :nodoc:
|
21
|
+
hash = symbolize_keys
|
22
|
+
hash.each do |key, val|
|
23
|
+
hash[key] = case val
|
24
|
+
when Hash
|
25
|
+
val.symbolize_keys!
|
26
|
+
when Array
|
27
|
+
val.map do |item|
|
28
|
+
item.is_a?(Hash) ? item.symbolize_keys! : item
|
29
|
+
end
|
30
|
+
else
|
31
|
+
val
|
32
|
+
end
|
33
|
+
end
|
34
|
+
return hash
|
35
|
+
end unless method_defined?(:symbolize_keys!)
|
36
|
+
|
37
|
+
def serialize # :nodoc:
|
38
|
+
self.map { |key, val| [key, val].join("=") }.join("&")
|
39
|
+
end unless method_defined?(:serialize)
|
40
|
+
|
41
|
+
def all_keys # :nodoc:
|
42
|
+
keys = self.keys
|
43
|
+
keys.each do |key|
|
44
|
+
if self[key].is_a?(Hash)
|
45
|
+
keys << self[key].all_keys.compact.flatten
|
46
|
+
next
|
47
|
+
end
|
48
|
+
end
|
49
|
+
keys.flatten
|
50
|
+
end unless method_defined?(:all_keys)
|
51
|
+
|
52
|
+
def has_deep_key?(key)
|
53
|
+
self.all_keys.include? key
|
54
|
+
end unless method_defined?(:has_deep_key?)
|
55
|
+
|
56
|
+
def self.hash_traverse(hash, &block)
|
57
|
+
hash.each do |key, val|
|
58
|
+
block.call(key)
|
59
|
+
case val
|
60
|
+
when Hash
|
61
|
+
val.keys.each do |k|
|
62
|
+
_hash_traverse(val, &block)
|
63
|
+
end
|
64
|
+
when Array
|
65
|
+
val.each do |item|
|
66
|
+
_hash_traverse(item, &block)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
return hash
|
71
|
+
end
|
72
|
+
|
73
|
+
end # Hash
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'multi_json'
|
4
|
+
|
5
|
+
module Nimbu
|
6
|
+
module Utils
|
7
|
+
module Json
|
8
|
+
extend self
|
9
|
+
|
10
|
+
def decode(*args)
|
11
|
+
if MultiJson.respond_to?(:load)
|
12
|
+
MultiJson.load(*args)
|
13
|
+
else
|
14
|
+
MultiJson.decode(*args)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'cgi'
|
2
|
+
|
3
|
+
module Nimbu
|
4
|
+
module Utils
|
5
|
+
module Url
|
6
|
+
extend self
|
7
|
+
|
8
|
+
DEFAULT_QUERY_SEP = /[&;] */n
|
9
|
+
|
10
|
+
KEY_VALUE_SEP = '='.freeze
|
11
|
+
|
12
|
+
def escape(s) CGI.escape s.to_s end
|
13
|
+
|
14
|
+
def unescape(s) CGI.unescape s.to_s end
|
15
|
+
|
16
|
+
def build_query(params)
|
17
|
+
params.map { |k, v|
|
18
|
+
if v.class == Array
|
19
|
+
build_query(v.map { |x| [k, x] })
|
20
|
+
else
|
21
|
+
v.nil? ? escape(k) : "#{escape(k)}=#{escape(v)}"
|
22
|
+
end
|
23
|
+
}.join("&")
|
24
|
+
end
|
25
|
+
|
26
|
+
def parse_query(query_string)
|
27
|
+
return '' if query_string.nil? || query_string.empty?
|
28
|
+
params = {}
|
29
|
+
|
30
|
+
query_string.split(DEFAULT_QUERY_SEP).each do |part|
|
31
|
+
k, v = part.split(KEY_VALUE_SEP, 2).map { |el| unescape(el) }
|
32
|
+
|
33
|
+
if cur = params[k]
|
34
|
+
if cur.class == Array
|
35
|
+
params[k] << v
|
36
|
+
else
|
37
|
+
params[k] = [cur, v]
|
38
|
+
end
|
39
|
+
else
|
40
|
+
params[k] = v
|
41
|
+
end
|
42
|
+
end
|
43
|
+
params
|
44
|
+
end
|
45
|
+
|
46
|
+
def parse_query_for_param(query_string, name)
|
47
|
+
parse_query(query_string).each do |key, val|
|
48
|
+
return val.first if (name == key) && val.is_a?(Array)
|
49
|
+
return val if (name == key)
|
50
|
+
end
|
51
|
+
return nil
|
52
|
+
end
|
53
|
+
|
54
|
+
end # Url
|
55
|
+
end # Utils
|
56
|
+
end # Nimbu
|