Class: ZendeskAPI::Collection
- Inherits:
-
Object
- Object
- ZendeskAPI::Collection
- Includes:
- Sideloading
- Defined in:
- lib/zendesk_api/collection.rb
Overview
Represents a collection of resources. Lazily loaded, resources aren’t actually fetched until explicitly needed (e.g. #each, #fetch).
Constant Summary collapse
- DEFAULT_PAGE_SIZE =
100- SPECIALLY_JOINED_PARAMS =
Options passed in that are automatically converted from an array to a comma-separated list.
[:ids, :only]
Instance Attribute Summary collapse
-
#association ⇒ ZendeskAPI::Association
readonly
The class association.
-
#error ⇒ ZendeskAPI::ClientError
readonly
The last response error.
-
#options ⇒ Hash
readonly
Query options.
-
#response ⇒ Faraday::Response
readonly
The last response.
Instance Method Summary collapse
-
#<<(item) ⇒ Object
Adds an item to this collection.
-
#all(start_page = , &block) ⇒ Object
Calls #each on every page with the passed in block.
-
#all!(start_page = , &block) ⇒ Object
Calls #each on every page with the passed in block.
-
#build(opts = {}) ⇒ Object
Convenience method to build a new resource and add it to the collection.
-
#build!(opts = {}) ⇒ Object
Convenience method to build a new resource and add it to the collection.
-
#clear_cache ⇒ Object
Clears all cached resources and associated values.
-
#count ⇒ Number
The total number of resources server-side (disregarding pagination).
-
#count! ⇒ Number
The total number of resources server-side (disregarding pagination).
- #each_page(*args, &block) ⇒ Object
- #each_page!(*args, &block) ⇒ Object
- #fetch(*args) ⇒ Object
-
#fetch!(reload = false) ⇒ Object
Executes actual GET from API and loads resources into proper class.
- #first_page? ⇒ Boolean
- #get_next_page_data(original_response_body) ⇒ Object
-
#include(*sideloads) ⇒ Object
Adds an item (or items) to the list of side-loaded resources to request.
-
#initialize(client, resource, options = {}) ⇒ Collection
constructor
Creates a new Collection instance.
- #last_page? ⇒ Boolean
-
#method_missing(name, *args, &block) ⇒ Object
Sends methods to underlying array of resources.
- #more_results?(response) ⇒ Boolean (also: #has_more_results?)
-
#next ⇒ Object
Find the next page.
-
#page(number) ⇒ Collection
Changes the page option.
-
#path ⇒ Object
The API path to this collection.
-
#per_page(count) ⇒ Collection
Changes the per_page option.
-
#prev ⇒ Object
Find the previous page.
-
#replace(collection) ⇒ Object
Replaces the current (loaded or not) resources with the passed in collection.
- #respond_to_missing?(name, include_all) ⇒ Boolean
-
#save ⇒ Collection
Saves all newly created resources stored in this collection.
-
#save! ⇒ Collection
Saves all newly created resources stored in this collection.
-
#to_a ⇒ Object
Alias for fetch(false).
-
#to_a! ⇒ Object
Alias for fetch!(false).
- #to_ary ⇒ Object
- #to_param ⇒ Object
- #to_s ⇒ Object (also: #to_str)
Methods included from Sideloading
Constructor Details
#initialize(client, resource, options = {}) ⇒ Collection
Creates a new Collection instance. Does not fetch resources. Additional options are: verb (default: GET), path (default: resource param), page, per_page.
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/zendesk_api/collection.rb', line 33 def initialize(client, resource, = {}) @client, @resource_class, @resource = client, resource, resource.resource_path = SilentMash.new() join_special_params @verb = .delete(:verb) @includes = Array(.delete(:include)) # Used for Attachments, TicketComment if @resource_class.is_a?(Class) && @resource_class.superclass == ZendeskAPI::Data @resources = [] @fetchable = false else @fetchable = true end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Object
Sends methods to underlying array of resources.
298 299 300 301 302 303 304 305 306 |
# File 'lib/zendesk_api/collection.rb', line 298 def method_missing(name, *args, &block) if resource_methods.include?(name) collection_method(name, *args, &block) elsif [].respond_to?(name, false) array_method(name, *args, &block) else next_collection(name, *args, &block) end end |
Instance Attribute Details
#association ⇒ ZendeskAPI::Association (readonly)
Returns The class association.
17 18 19 |
# File 'lib/zendesk_api/collection.rb', line 17 def association @association end |
#error ⇒ ZendeskAPI::ClientError (readonly)
Returns The last response error.
26 27 28 |
# File 'lib/zendesk_api/collection.rb', line 26 def error @error end |
#options ⇒ Hash (readonly)
Returns query options.
23 24 25 |
# File 'lib/zendesk_api/collection.rb', line 23 def end |
#response ⇒ Faraday::Response (readonly)
Returns The last response.
20 21 22 |
# File 'lib/zendesk_api/collection.rb', line 20 def response @response end |
Instance Method Details
#<<(item) ⇒ Object
Adds an item to this collection
164 165 166 167 168 169 170 171 172 173 174 175 176 |
# File 'lib/zendesk_api/collection.rb', line 164 def <<(item) fetch if item.is_a?(Resource) if item.is_a?(@resource_class) @resources << item else raise "this collection is for #{@resource_class}" end else @resources << wrap_resource(item, true) end end |
#all(start_page = , &block) ⇒ Object
Calls #each on every page with the passed in block
221 222 223 |
# File 'lib/zendesk_api/collection.rb', line 221 def all(start_page = ["page"], &block) _all(start_page, &block) end |
#all!(start_page = , &block) ⇒ Object
Calls #each on every page with the passed in block
215 216 217 |
# File 'lib/zendesk_api/collection.rb', line 215 def all!(start_page = ["page"], &block) _all(start_page, :bang, &block) end |
#build(opts = {}) ⇒ Object
Convenience method to build a new resource and add it to the collection. Fetches the collection as well.
89 90 91 92 93 |
# File 'lib/zendesk_api/collection.rb', line 89 def build(opts = {}) wrap_resource(opts, true).tap do |res| self << res end end |
#build!(opts = {}) ⇒ Object
Convenience method to build a new resource and add it to the collection. Fetches the collection as well.
98 99 100 101 102 103 104 105 |
# File 'lib/zendesk_api/collection.rb', line 98 def build!(opts = {}) wrap_resource(opts, true).tap do |res| fetch! # << does a fetch too self << res end end |
#clear_cache ⇒ Object
Clears all cached resources and associated values.
280 281 282 283 284 285 286 |
# File 'lib/zendesk_api/collection.rb', line 280 def clear_cache @resources = nil @count = nil @next_page = nil @prev_page = nil @query = nil end |
#count ⇒ Number
Returns The total number of resources server-side (disregarding pagination).
108 109 110 111 |
# File 'lib/zendesk_api/collection.rb', line 108 def count fetch @count || -1 end |
#count! ⇒ Number
Returns The total number of resources server-side (disregarding pagination).
114 115 116 117 |
# File 'lib/zendesk_api/collection.rb', line 114 def count! fetch! @count || -1 end |
#each_page(*args, &block) ⇒ Object
230 231 232 233 |
# File 'lib/zendesk_api/collection.rb', line 230 def each_page(*args, &block) warn "ZendeskAPI::Collection#each_page is deprecated, please use ZendeskAPI::Collection#all" all(*args, &block) end |
#each_page!(*args, &block) ⇒ Object
225 226 227 228 |
# File 'lib/zendesk_api/collection.rb', line 225 def each_page!(*args, &block) warn "ZendeskAPI::Collection#each_page! is deprecated, please use ZendeskAPI::Collection#all!" all!(*args, &block) end |
#fetch(*args) ⇒ Object
195 196 197 198 199 200 201 |
# File 'lib/zendesk_api/collection.rb', line 195 def fetch(*args) fetch!(*args) rescue Faraday::ClientError => e @error = e [] end |
#fetch!(reload = false) ⇒ Object
Executes actual GET from API and loads resources into proper class.
185 186 187 188 189 190 191 192 193 |
# File 'lib/zendesk_api/collection.rb', line 185 def fetch!(reload = false) if @resources && (!@fetchable || !reload) return @resources elsif association && association..parent && association..parent.new_record? return (@resources = []) end get_resources(@query || path) end |
#first_page? ⇒ Boolean
135 136 137 |
# File 'lib/zendesk_api/collection.rb', line 135 def first_page? !@prev_page end |
#get_next_page_data(original_response_body) ⇒ Object
331 332 333 334 335 336 337 338 339 340 341 342 343 |
# File 'lib/zendesk_api/collection.rb', line 331 def get_next_page_data(original_response_body) link = original_response_body["links"]["next"] result_key = @resource_class.model_key || "results" while link response = @client.connection.send("get", link).body original_response_body[result_key] = original_response_body[result_key] + response[result_key] link = response["meta"]["has_more"] ? response["links"]["next"] : nil end original_response_body end |
#include(*sideloads) ⇒ Object
Adds an item (or items) to the list of side-loaded resources to request
157 158 159 |
# File 'lib/zendesk_api/collection.rb', line 157 def include(*sideloads) tap { @includes.concat(sideloads.map(&:to_s)) } end |
#last_page? ⇒ Boolean
139 140 141 |
# File 'lib/zendesk_api/collection.rb', line 139 def last_page? !@next_page || @next_page == @query end |
#more_results?(response) ⇒ Boolean Also known as: has_more_results?
326 327 328 |
# File 'lib/zendesk_api/collection.rb', line 326 def more_results?(response) Helpers.present?(response["meta"]) && response["meta"]["has_more"] end |
#next ⇒ Object
Find the next page. Does one of three things:
-
If there is already a page number in the options hash, it increases it and invalidates the cache, returning the new page number.
-
If there is a next_page url cached, it executes a fetch on that url and returns the results.
-
Otherwise, returns an empty array.
247 248 249 250 251 252 253 254 255 256 257 258 259 |
# File 'lib/zendesk_api/collection.rb', line 247 def next if ["page"] && !cbp_request? clear_cache ["page"] = ["page"].to_i + 1 elsif (@query = @next_page) # Send _only_ url param "?after=token" to get the next page .page&.delete("before") fetch(true) else clear_cache @resources = [] end end |
#page(number) ⇒ Collection
Changes the page option. Returns self, so it can be chained. No execution.
129 130 131 132 133 |
# File 'lib/zendesk_api/collection.rb', line 129 def page(number) clear_cache if number ["page"] = number self end |
#path ⇒ Object
The API path to this collection
179 180 181 |
# File 'lib/zendesk_api/collection.rb', line 179 def path @association.generate_path(:with_parent => true) end |
#per_page(count) ⇒ Collection
Changes the per_page option. Returns self, so it can be chained. No execution.
121 122 123 124 125 |
# File 'lib/zendesk_api/collection.rb', line 121 def per_page(count) clear_cache if count ["per_page"] = count self end |
#prev ⇒ Object
Find the previous page. Does one of three things:
-
If there is already a page number in the options hash, it increases it and invalidates the cache, returning the new page number.
-
If there is a prev_page url cached, it executes a fetch on that url and returns the results.
-
Otherwise, returns an empty array.
265 266 267 268 269 270 271 272 273 274 275 276 277 |
# File 'lib/zendesk_api/collection.rb', line 265 def prev if !cbp_request? && ["page"].to_i > 1 clear_cache ["page"] -= 1 elsif (@query = @prev_page) # Send _only_ url param "?before=token" to get the prev page .page&.delete("after") fetch(true) else clear_cache @resources = [] end end |
#replace(collection) ⇒ Object
Replaces the current (loaded or not) resources with the passed in collection
238 239 240 241 |
# File 'lib/zendesk_api/collection.rb', line 238 def replace(collection) raise "this collection is for #{@resource_class}" if collection.any? { |r| !r.is_a?(@resource_class) } @resources = collection end |
#respond_to_missing?(name, include_all) ⇒ Boolean
293 294 295 |
# File 'lib/zendesk_api/collection.rb', line 293 def respond_to_missing?(name, include_all) [].respond_to?(name, include_all) end |
#save ⇒ Collection
Saves all newly created resources stored in this collection.
145 146 147 |
# File 'lib/zendesk_api/collection.rb', line 145 def save _save end |
#save! ⇒ Collection
Saves all newly created resources stored in this collection.
151 152 153 |
# File 'lib/zendesk_api/collection.rb', line 151 def save! _save(:save!) end |
#to_a ⇒ Object
Alias for fetch(false)
204 205 206 |
# File 'lib/zendesk_api/collection.rb', line 204 def to_a fetch end |
#to_a! ⇒ Object
Alias for fetch!(false)
209 210 211 |
# File 'lib/zendesk_api/collection.rb', line 209 def to_a! fetch! end |
#to_ary ⇒ Object
289 290 291 |
# File 'lib/zendesk_api/collection.rb', line 289 def to_ary nil end |
#to_param ⇒ Object
322 323 324 |
# File 'lib/zendesk_api/collection.rb', line 322 def to_param map(&:to_param) end |
#to_s ⇒ Object Also known as: to_str
309 310 311 312 313 314 315 316 317 318 |
# File 'lib/zendesk_api/collection.rb', line 309 def to_s if @resources @resources.inspect else inspect = [] inspect << "options=#{@options.inspect}" if .any? inspect << "path=#{path}" "#{Inflection.singular(@resource)} collection [#{inspect.join(',')}]" end end |