module Zendesk2::Request
Attributes
params[R]
Public Class Methods
included(receiver)
click to toggle source
Calls superclass method
# File lib/zendesk2/request.rb, line 6 def included(receiver) receiver.extend(ClassMethods) cistern_included(receiver) super end
Also aliased as: cistern_included
Public Instance Methods
call(*args)
click to toggle source
# File lib/zendesk2/request.rb, line 55 def call(*args) params = args.last.is_a?(Hash) ? args.pop : {} @params = Cistern::Hash.stringify_keys(params) dispatch end
data()
click to toggle source
# File lib/zendesk2/request.rb, line 110 def data cistern.data end
delete!(collection, identity, options = {})
click to toggle source
# File lib/zendesk2/request.rb, line 164 def delete!(collection, identity, options = {}) cistern.data[collection].delete(identity.to_i) || error!(options[:error] || :not_found, options) end
error!(type, options = {})
click to toggle source
# File lib/zendesk2/request.rb, line 169 def error!(type, options = {}) status, body = self.class.error_map[type] body['details'] = options[:details] if options[:details] response( path: request_path, status: status, body: body, ) end
find!(collection, identity, options = {})
click to toggle source
# File lib/zendesk2/request.rb, line 159 def find!(collection, identity, options = {}) resource = cistern.data[collection][identity.to_i] resource || error!(options[:error] || :not_found, options) end
html_url_for(path)
click to toggle source
# File lib/zendesk2/request.rb, line 114 def html_url_for(path) File.join(cistern.url, path.to_s) end
mock_response(body, options = {})
click to toggle source
# File lib/zendesk2/request.rb, line 147 def mock_response(body, options = {}) response( method: self.class.request_method, path: options[:path] || request_path, request_body: request_body, response_body: body, headers: options[:headers] || {}, status: options[:status] || 200, params: options[:params] || request_params, ) end
page(collection, options = {})
click to toggle source
# File lib/zendesk2/request.rb, line 190 def page(collection, options = {}) url_params = options[:params] || params page_params = page_params!(params) page_size = (page_params.delete('per_page') || 50).to_i page_index = (page_params.delete('page') || 1).to_i root = options.fetch(:root) { !collection.is_a?(Array) && collection.to_s } path = options[:path] || request_path offset = (page_index - 1) * page_size resources = collection.is_a?(Array) ? collection : cistern.data[collection.to_sym].values count = resources.size total_pages = (count / page_size) + 1 next_page = if page_index < total_pages url_for(path, query: { 'page' => page_index + 1, 'per_page' => page_size }.merge(url_params)) end previous_page = if page_index > 1 url_for(path, query: { 'page' => page_index - 1, 'per_page' => page_size }.merge(url_params)) end resource_page = resources.slice(offset, page_size) body = { root => resource_page, 'count' => count, 'next_page' => next_page, 'previous_page' => previous_page, } response( body: body, path: path, ) end
page_params!(options)
click to toggle source
# File lib/zendesk2/request.rb, line 62 def page_params!(options) url = options.delete('url') page_params = if url Faraday::NestedParamsEncoder.decode(URI.parse(url).query) else Cistern::Hash.stringify_keys(options) end Cistern::Hash.slice(page_params, 'per_page', 'page', 'query') end
page_params?()
click to toggle source
# File lib/zendesk2/request.rb, line 73 def page_params? self.class.page_params? end
pluralize(word)
click to toggle source
# File lib/zendesk2/request.rb, line 104 def pluralize(word) pluralized = word.dup [[/y$/, 'ies'], [/$/, 's']].find { |regex, replace| pluralized.gsub!(regex, replace) if pluralized.match(regex) } pluralized end
real(params = {})
click to toggle source
# File lib/zendesk2/request.rb, line 127 def real(params = {}) cistern.request(method: self.class.request_method, path: request_path, body: request_body, url: params['url'], params: request_params,) end
real_request(params = {})
click to toggle source
# File lib/zendesk2/request.rb, line 135 def real_request(params = {}) request({ method: self.class.request_method, path: request_path(params), body: request_body(params), }.merge(cistern.hash.slice(params, :method, :path, :body, :headers),),) end
request_body()
click to toggle source
# File lib/zendesk2/request.rb, line 95 def request_body case (generator = self.class.request_body) when Proc then generator.call(self) when NilClass then nil else raise("Invalid request body generator: #{generator.inspect}") end end
request_params()
click to toggle source
# File lib/zendesk2/request.rb, line 77 def request_params page_params = (page_params!(params) if page_params?) if self.class.request_params self.class.request_params.call(self) else page_params end end
request_path()
click to toggle source
# File lib/zendesk2/request.rb, line 87 def request_path case (generator = self.class.request_path) when Proc then generator.call(self) else raise ArgumentError, "Couldn't generate request_path from #{generator.inspect}" end end
resources(collection, options = {})
click to toggle source
# File lib/zendesk2/request.rb, line 180 def resources(collection, options = {}) page = collection.is_a?(Array) ? collection : cistern.data[collection.to_sym].values root = options.fetch(:root) { !collection.is_a?(Array) && collection.to_s } mock_response( root => page, 'count' => page.size, ) end
response(options = {})
click to toggle source
@fixme id values are validate for format / type
{
"error": { "title": "Invalid attribute", "message": "You passed an invalid value for the id attribute. must be an integer" }
} @note
request_body is special because it’s need for spec assertions but {Faraday::Env} replaces the request body with the response body after the request and the reference is lost
# File lib/zendesk2/request.rb, line 241 def response(options = {}) body = options[:response_body] || options[:body] method = options[:method] || :get params = options[:params] cistern.last_request = options[:request_body] status = options[:status] || 200 path = options[:path] url = options[:url] || url_for(path, query: params) request_headers = { 'Accept' => 'application/json' } response_headers = { 'Content-Type' => 'application/json; charset=utf-8' } # request phase # * :method - :get, :post, ... # * :url - URI for the current request; also contains GET parameters # * :body - POST parameters for :post/:put requests # * :request_headers # response phase # * :status - HTTP response status code, such as 200 # * :body - the response body # * :response_headers env = Faraday::Env.from( method: method, url: URI.parse(url), body: body, request_headers: request_headers, response_headers: response_headers, status: status, ) Faraday::Response::RaiseError.new.on_complete(env) || Faraday::Response.new(env) rescue Faraday::Error::ClientError => e raise Zendesk2::Error, e end
timestamp()
click to toggle source
# File lib/zendesk2/request.rb, line 143 def timestamp Time.now.iso8601 end
url_for(path, options = {})
click to toggle source
# File lib/zendesk2/request.rb, line 118 def url_for(path, options = {}) URI.parse( File.join(cistern.url, '/api/v2', path.to_s), ).tap do |uri| query = options[:query] query && (uri.query = Faraday::NestedParamsEncoder.encode(query)) end.to_s end