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.
Files changed (66) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +29 -0
  5. data/Rakefile +1 -0
  6. data/lib/nimbu-api.rb +43 -0
  7. data/lib/nimbu-api/authentication.rb +76 -0
  8. data/lib/nimbu-api/builder.rb +31 -0
  9. data/lib/nimbu-api/client.rb +26 -0
  10. data/lib/nimbu-api/configuration.rb +109 -0
  11. data/lib/nimbu-api/connection.rb +88 -0
  12. data/lib/nimbu-api/endpoint.rb +199 -0
  13. data/lib/nimbu-api/endpoints/authorizations.rb +113 -0
  14. data/lib/nimbu-api/endpoints/channels.rb +31 -0
  15. data/lib/nimbu-api/endpoints/channels/entries.rb +50 -0
  16. data/lib/nimbu-api/endpoints/sites.rb +34 -0
  17. data/lib/nimbu-api/endpoints/videos.rb +26 -0
  18. data/lib/nimbu-api/errors.rb +31 -0
  19. data/lib/nimbu-api/errors/bad_request.rb +14 -0
  20. data/lib/nimbu-api/errors/client_error.rb +20 -0
  21. data/lib/nimbu-api/errors/forbidden.rb +14 -0
  22. data/lib/nimbu-api/errors/internal_server_error.rb +15 -0
  23. data/lib/nimbu-api/errors/invalid_options.rb +18 -0
  24. data/lib/nimbu-api/errors/not_acceptable.rb +15 -0
  25. data/lib/nimbu-api/errors/not_found.rb +14 -0
  26. data/lib/nimbu-api/errors/required_params.rb +18 -0
  27. data/lib/nimbu-api/errors/service_error.rb +65 -0
  28. data/lib/nimbu-api/errors/service_unavailable.rb +15 -0
  29. data/lib/nimbu-api/errors/unauthorized.rb +15 -0
  30. data/lib/nimbu-api/errors/unknown_value.rb +18 -0
  31. data/lib/nimbu-api/errors/unprocessable_entity.rb +14 -0
  32. data/lib/nimbu-api/errors/validations.rb +18 -0
  33. data/lib/nimbu-api/pagination.rb +106 -0
  34. data/lib/nimbu-api/pagination/page_iterator.rb +157 -0
  35. data/lib/nimbu-api/pagination/page_links.rb +48 -0
  36. data/lib/nimbu-api/pagination/paged_request.rb +41 -0
  37. data/lib/nimbu-api/pagination/pagination.rb +102 -0
  38. data/lib/nimbu-api/request.rb +81 -0
  39. data/lib/nimbu-api/request/arguments.rb +171 -0
  40. data/lib/nimbu-api/request/basic_auth.rb +31 -0
  41. data/lib/nimbu-api/request/json.rb +46 -0
  42. data/lib/nimbu-api/request/normalizer.rb +29 -0
  43. data/lib/nimbu-api/request/oauth2.rb +42 -0
  44. data/lib/nimbu-api/request/parameter_filter.rb +34 -0
  45. data/lib/nimbu-api/request/validations.rb +25 -0
  46. data/lib/nimbu-api/request/validations/format.rb +26 -0
  47. data/lib/nimbu-api/request/validations/presence.rb +32 -0
  48. data/lib/nimbu-api/request/validations/required.rb +26 -0
  49. data/lib/nimbu-api/request/validations/token.rb +35 -0
  50. data/lib/nimbu-api/response.rb +34 -0
  51. data/lib/nimbu-api/response/header.rb +76 -0
  52. data/lib/nimbu-api/response/json.rb +29 -0
  53. data/lib/nimbu-api/response/mashify.rb +24 -0
  54. data/lib/nimbu-api/response/raise_error.rb +18 -0
  55. data/lib/nimbu-api/response/wrapper.rb +149 -0
  56. data/lib/nimbu-api/response/xmlize.rb +26 -0
  57. data/lib/nimbu-api/utils/all.rb +6 -0
  58. data/lib/nimbu-api/utils/constants.rb +37 -0
  59. data/lib/nimbu-api/utils/descendants.rb +11 -0
  60. data/lib/nimbu-api/utils/extend_array.rb +17 -0
  61. data/lib/nimbu-api/utils/extend_hash.rb +73 -0
  62. data/lib/nimbu-api/utils/json.rb +19 -0
  63. data/lib/nimbu-api/utils/url.rb +56 -0
  64. data/lib/nimbu-api/version.rb +3 -0
  65. data/nimbu-api.gemspec +31 -0
  66. 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