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,31 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
require 'base64'
|
5
|
+
|
6
|
+
module Nimbu
|
7
|
+
module Request
|
8
|
+
class BasicAuth < Faraday::Middleware
|
9
|
+
dependency 'base64'
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
env[:request_headers].merge!('Authorization' => "Basic #{@auth}\"")
|
13
|
+
|
14
|
+
@app.call env
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(app, *args)
|
18
|
+
@app = app
|
19
|
+
credentials = ""
|
20
|
+
options = args.extract_options!
|
21
|
+
if options.has_key? :login
|
22
|
+
credentials = "#{options[:login]}:#{options[:password]}"
|
23
|
+
elsif options.has_key? :basic_auth
|
24
|
+
credentials = "#{options[:basic_auth]}"
|
25
|
+
end
|
26
|
+
@auth = Base64.encode64(credentials)
|
27
|
+
@auth.gsub!("\n", "")
|
28
|
+
end
|
29
|
+
end # BasicAuth
|
30
|
+
end # Request
|
31
|
+
end # Nimbu
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
|
5
|
+
module Nimbu
|
6
|
+
class Request::Json < Faraday::Middleware
|
7
|
+
|
8
|
+
CONTENT_TYPE = 'Content-Type'.freeze
|
9
|
+
MIME_TYPE = 'application/json'.freeze
|
10
|
+
|
11
|
+
dependency 'multi_json'
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
if request_with_body?(env)
|
15
|
+
env[:request_headers][CONTENT_TYPE] ||= MIME_TYPE
|
16
|
+
env[:body] = encode_body env unless env[:body].respond_to?(:to_str)
|
17
|
+
end
|
18
|
+
@app.call env
|
19
|
+
end
|
20
|
+
|
21
|
+
def encode_body(env)
|
22
|
+
if MultiJson.respond_to?(:dump)
|
23
|
+
MultiJson.dump env[:body]
|
24
|
+
else
|
25
|
+
MultiJson.encode env[:body]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def request_with_body?(env)
|
30
|
+
type = request_type(env)
|
31
|
+
has_body?(env) and (type.empty? or type == MIME_TYPE)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Don't encode bodies in string form
|
35
|
+
def has_body?(env)
|
36
|
+
body = env[:body] and !(body.respond_to?(:to_str) and body.empty?)
|
37
|
+
end
|
38
|
+
|
39
|
+
def request_type(env)
|
40
|
+
type = env[:request_headers][CONTENT_TYPE].to_s
|
41
|
+
type = type.split(';', 2).first if type.index(';')
|
42
|
+
type
|
43
|
+
end
|
44
|
+
|
45
|
+
end # Request::Json
|
46
|
+
end # Nimbu
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Nimbu
|
4
|
+
module Request
|
5
|
+
# Deals with normalazing client supplied parameter keys.
|
6
|
+
module Normalizer
|
7
|
+
|
8
|
+
# Turns any keys from nested hashes including nested arrays into strings
|
9
|
+
#
|
10
|
+
def normalize!(params)
|
11
|
+
case params
|
12
|
+
when Hash
|
13
|
+
params.keys.each do |k|
|
14
|
+
params[k.to_s] = params.delete(k)
|
15
|
+
normalize!(params[k.to_s])
|
16
|
+
end
|
17
|
+
when Array
|
18
|
+
params.map! do |el|
|
19
|
+
normalize!(el)
|
20
|
+
end
|
21
|
+
else
|
22
|
+
params.to_s
|
23
|
+
end
|
24
|
+
return params
|
25
|
+
end
|
26
|
+
|
27
|
+
end # Normalizer
|
28
|
+
end # Request
|
29
|
+
end # Nimbu
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
|
5
|
+
module Nimbu
|
6
|
+
module Request
|
7
|
+
class OAuth2 < Faraday::Middleware
|
8
|
+
include Nimbu::Utils::Url
|
9
|
+
|
10
|
+
ACCESS_TOKEN = 'access_token'.freeze
|
11
|
+
AUTH_HEADER = 'Authorization'.freeze
|
12
|
+
|
13
|
+
dependency 'oauth2'
|
14
|
+
|
15
|
+
def call(env)
|
16
|
+
# Extract parameters from the query
|
17
|
+
params = { ACCESS_TOKEN => @token }.update query_params(env[:url])
|
18
|
+
|
19
|
+
if token = params[ACCESS_TOKEN] and !token.empty?
|
20
|
+
env[:url].query = build_query params
|
21
|
+
env[:request_headers].merge!(AUTH_HEADER => "Token token=\"#{token}\"")
|
22
|
+
end
|
23
|
+
|
24
|
+
@app.call env
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(app, *args)
|
28
|
+
super app
|
29
|
+
@app = app
|
30
|
+
@token = args.shift
|
31
|
+
end
|
32
|
+
|
33
|
+
def query_params(url)
|
34
|
+
if url.query.nil? or url.query.empty?
|
35
|
+
{}
|
36
|
+
else
|
37
|
+
parse_query url.query
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end # OAuth2
|
41
|
+
end # Request
|
42
|
+
end # Nimbu
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Nimbu
|
4
|
+
module Request
|
5
|
+
# Allows you to specify parameters keys which will be preserved
|
6
|
+
# in parameters hash and its subhashes. Any keys from the nested
|
7
|
+
# hash that do not match will be removed.
|
8
|
+
module ParameterFilter
|
9
|
+
|
10
|
+
# Removes any keys from nested hashes that don't match predefiend keys
|
11
|
+
#
|
12
|
+
def filter!(keys, params, options={:recursive => true}) # :nodoc:
|
13
|
+
case params
|
14
|
+
when Hash
|
15
|
+
params.keys.each do |k, v|
|
16
|
+
unless (keys.include?(k) or Nimbu::Validations::VALID_API_KEYS.include?(k))
|
17
|
+
params.delete(k)
|
18
|
+
else
|
19
|
+
filter!(keys, params[k]) if options[:recursive]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
when Array
|
23
|
+
params.map! do |el|
|
24
|
+
filter!(keys, el) if options[:recursive]
|
25
|
+
end
|
26
|
+
else
|
27
|
+
params
|
28
|
+
end
|
29
|
+
return params
|
30
|
+
end
|
31
|
+
|
32
|
+
end # ParameterFilter
|
33
|
+
end # Request
|
34
|
+
end # Nimbu
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'nimbu-api/request/validations/presence'
|
4
|
+
require 'nimbu-api/request/validations/format'
|
5
|
+
require 'nimbu-api/request/validations/token'
|
6
|
+
require 'nimbu-api/request/validations/required'
|
7
|
+
|
8
|
+
module Nimbu
|
9
|
+
module Request
|
10
|
+
module Validations
|
11
|
+
|
12
|
+
include Presence
|
13
|
+
include Format
|
14
|
+
include Token
|
15
|
+
include Required
|
16
|
+
|
17
|
+
VALID_API_KEYS = [
|
18
|
+
'page',
|
19
|
+
'per_page',
|
20
|
+
'auto_pagination'
|
21
|
+
]
|
22
|
+
|
23
|
+
end # Validation
|
24
|
+
end # Request
|
25
|
+
end # Nimbu
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Nimbu
|
4
|
+
module Request
|
5
|
+
module Validations
|
6
|
+
module Format
|
7
|
+
|
8
|
+
# Ensures that value for a given key is of the correct form whether
|
9
|
+
# matching regular expression or set of predefined values.
|
10
|
+
#
|
11
|
+
def assert_valid_values(permitted, params)
|
12
|
+
params.each do |k, v|
|
13
|
+
next unless permitted.keys.include?(k)
|
14
|
+
if permitted[k].is_a?(Array) && !permitted[k].include?(params[k])
|
15
|
+
raise Nimbu::Error::UnknownValue.new(k,v, permitted[k].join(', '))
|
16
|
+
|
17
|
+
elsif permitted[k].is_a?(Regexp) && !(permitted[k] =~ params[k])
|
18
|
+
raise Nimbu::Error::UnknownValue.new(k,v, permitted[k])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end # Format
|
24
|
+
end # Validations
|
25
|
+
end # Request
|
26
|
+
end # Nimbu
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Nimbu
|
4
|
+
module Request
|
5
|
+
module Validations
|
6
|
+
# A mixin to help validate presence of non-empty values
|
7
|
+
module Presence
|
8
|
+
|
9
|
+
# Ensure that esential arguments are present before request is made.
|
10
|
+
#
|
11
|
+
# == Parameters
|
12
|
+
# Hash/Array of arguments to be checked against nil and empty string
|
13
|
+
#
|
14
|
+
# == Example
|
15
|
+
# assert_presence_of user: '...', repo: '...'
|
16
|
+
# assert_presence_of user, repo
|
17
|
+
#
|
18
|
+
def assert_presence_of(*args)
|
19
|
+
hash = args.last.is_a?(::Hash) ? args.pop : {}
|
20
|
+
|
21
|
+
errors = hash.select { |key, val| val.to_s.empty? }
|
22
|
+
raise Nimbu::Error::Validations.new(errors) unless errors.empty?
|
23
|
+
|
24
|
+
args.each do |arg|
|
25
|
+
raise ArgumentError, "parameter cannot be nil" if arg.nil?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end # Presence
|
30
|
+
end # Validations
|
31
|
+
end # Request
|
32
|
+
end # Nimbu
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Nimbu
|
4
|
+
module Request
|
5
|
+
module Validations
|
6
|
+
module Required
|
7
|
+
|
8
|
+
# Validate all keys present in a provided hash against required set,
|
9
|
+
# on mismatch raise Nimbu::Error::RequiredParams
|
10
|
+
# Note that keys need to be in the same format i.e. symbols or strings,
|
11
|
+
# otherwise the comparison will fail.
|
12
|
+
#
|
13
|
+
def assert_required_keys(required, provided)
|
14
|
+
result = required.all? do |key|
|
15
|
+
provided.has_deep_key? key
|
16
|
+
end
|
17
|
+
if !result
|
18
|
+
raise Nimbu::Error::RequiredParams.new(provided, required)
|
19
|
+
end
|
20
|
+
result
|
21
|
+
end
|
22
|
+
|
23
|
+
end # Required
|
24
|
+
end # Validations
|
25
|
+
end # Request
|
26
|
+
end # Nimbu
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Nimbu
|
4
|
+
module Request
|
5
|
+
module Validations
|
6
|
+
module Token
|
7
|
+
|
8
|
+
TOKEN_REQUIRED = [
|
9
|
+
'get /sites',
|
10
|
+
'get /channels'
|
11
|
+
]
|
12
|
+
|
13
|
+
TOKEN_REQUIRED_REGEXP = [
|
14
|
+
/channels\/.*\/.*\/entries/,
|
15
|
+
]
|
16
|
+
|
17
|
+
# Ensures that required authentication token is present before
|
18
|
+
# request is sent.
|
19
|
+
#
|
20
|
+
def validates_token_for(method, path)
|
21
|
+
return true unless TOKEN_REQUIRED.grep("#{method} #{path}").empty?
|
22
|
+
|
23
|
+
token_required = false
|
24
|
+
TOKEN_REQUIRED_REGEXP.each do |regex|
|
25
|
+
if "#{method} #{path}" =~ regex
|
26
|
+
token_required = true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
return token_required
|
30
|
+
end
|
31
|
+
|
32
|
+
end # Token
|
33
|
+
end # Validations
|
34
|
+
end # Request
|
35
|
+
end # Nimbu
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
|
5
|
+
module Nimbu
|
6
|
+
# Contains methods and attributes that act on the response returned from the
|
7
|
+
# request
|
8
|
+
class Response < Faraday::Response::Middleware
|
9
|
+
CONTENT_TYPE = 'Content-Type'.freeze
|
10
|
+
|
11
|
+
class << self
|
12
|
+
attr_accessor :parser
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.define_parser(&block)
|
16
|
+
@parser = block
|
17
|
+
end
|
18
|
+
|
19
|
+
def response_type(env)
|
20
|
+
env[:response_headers][CONTENT_TYPE].to_s
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse_response?(env)
|
24
|
+
env[:body].respond_to? :to_str
|
25
|
+
end
|
26
|
+
|
27
|
+
end # Response
|
28
|
+
end # Nimbu
|
29
|
+
|
30
|
+
require 'nimbu-api/response/header'
|
31
|
+
require 'nimbu-api/response/mashify'
|
32
|
+
require 'nimbu-api/response/json'
|
33
|
+
require 'nimbu-api/response/raise_error'
|
34
|
+
require 'nimbu-api/response/wrapper'
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Nimbu
|
4
|
+
class Response
|
5
|
+
|
6
|
+
# Represents http response header
|
7
|
+
class Header < Struct.new(:env)
|
8
|
+
include Nimbu::Utils::Constants
|
9
|
+
|
10
|
+
SUCCESSFUL_STATUSES = 200..299
|
11
|
+
|
12
|
+
def loaded?
|
13
|
+
!!env
|
14
|
+
end
|
15
|
+
|
16
|
+
def oauth_scopes
|
17
|
+
loaded? ? env[:response_headers][OAUTH_SCOPES] : nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def accepted_oauth_scopes
|
21
|
+
loaded? ? env[:response_headers][ACCEPTED_OAUTH_SCOPES] : nil
|
22
|
+
end
|
23
|
+
|
24
|
+
# Requests are limited to API v3 to 5000 per hour.
|
25
|
+
def ratelimit_limit
|
26
|
+
loaded? ? env[:response_headers][RATELIMIT_LIMIT] : nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def ratelimit_remaining
|
30
|
+
loaded? ? env[:response_headers][RATELIMIT_REMAINING] : nil
|
31
|
+
end
|
32
|
+
|
33
|
+
def cache_control
|
34
|
+
loaded? ? env[:response_headers][CACHE_CONTROL] : nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def content_type
|
38
|
+
loaded? ? env[:response_headers][CONTENT_TYPE] : nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def content_length
|
42
|
+
loaded? ? env[:response_headers][CONTENT_LENGTH] : nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def etag
|
46
|
+
loaded? ? env[:response_headers][ETAG] : nil
|
47
|
+
end
|
48
|
+
|
49
|
+
def date
|
50
|
+
loaded? ? env[:response_headers][DATE] : nil
|
51
|
+
end
|
52
|
+
|
53
|
+
def location
|
54
|
+
loaded? ? env[:response_headers][LOCATION] : nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def server
|
58
|
+
loaded? ? env[:response_headers][SERVER] : nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def status
|
62
|
+
loaded? ? env[:status] : nil
|
63
|
+
end
|
64
|
+
|
65
|
+
def success?
|
66
|
+
SUCCESSFUL_STATUSES.include? status
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns raw body
|
70
|
+
def body
|
71
|
+
loaded? ? env[:body] : nil
|
72
|
+
end
|
73
|
+
|
74
|
+
end # Header
|
75
|
+
end # Response
|
76
|
+
end # Nimbu
|