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,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,6 @@
1
+ require "nimbu-api/utils/constants"
2
+ require "nimbu-api/utils/extend_array"
3
+ require "nimbu-api/utils/extend_hash"
4
+ require "nimbu-api/utils/json"
5
+ require "nimbu-api/utils/url"
6
+ require "nimbu-api/utils/descendants"
@@ -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,11 @@
1
+ # encoding: utf-8
2
+
3
+ module Nimbu
4
+ module Utils
5
+ module Descendants
6
+ def descendants
7
+ ObjectSpace.each_object(::Class).select { |klass| klass < self }
8
+ end
9
+ end
10
+ end
11
+ end
@@ -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