Class: Tickethub::Collection
- Inherits:
-
Enumerator
- Object
- Enumerator
- Tickethub::Collection
- Defined in:
- lib/tickethub/collection.rb
Constant Summary collapse
- DEFAULT_LIMIT =
25.freeze
- DEFAULT_OFFSET =
0.freeze
Instance Attribute Summary collapse
-
#cache ⇒ Object
Returns the value of attribute cache.
-
#count ⇒ Object
readonly
Returns the value of attribute count.
-
#endpoint ⇒ Object
readonly
Returns the value of attribute endpoint.
-
#params ⇒ Object
readonly
Returns the value of attribute params.
Instance Method Summary collapse
- #[](search) ⇒ Object
- #any?(&block) ⇒ Boolean
- #create(attributes = {}) ⇒ Object
- #empty? ⇒ Boolean
- #filter(value) ⇒ Object
- #filters ⇒ Object
-
#initialize(endpoint, klass, params = {}, options = {}) ⇒ Collection
constructor
A new instance of Collection.
- #last ⇒ Object
- #limit(value = nil) ⇒ Object
- #offset(value = nil) ⇒ Object
- #order(value = nil) ⇒ Object
- #reload! ⇒ Object
- #scope(path, params = {}) ⇒ Object
- #search(value) ⇒ Object
Constructor Details
#initialize(endpoint, klass, params = {}, options = {}) ⇒ Collection
Returns a new instance of Collection.
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/tickethub/collection.rb', line 13 def initialize(endpoint, klass, params = {}, = {}) @params = params.dup @options = .dup @endpoint = endpoint @klass = klass klass.registered_types.each do |type, | define_singleton_method type do instance_variable_defined?("@#{type}") ? instance_variable_get("@#{type}") : instance_variable_set("@#{type}", Tickethub::Collection.new(endpoint[type], [:klass])) end end klass.collection_methods.merge(klass.scopes).each do |key, block| define_singleton_method key, &block end super() do |yielder| self.reload! if cache.nil? cache.each do |row| yielder << @klass.call(endpoint, row) end while (offset + cache.length) < count response = endpoint.get params.merge(offset: cache.length) response.decoded.each do |row| cache << row yielder << @klass.call(endpoint, row) end end end end |
Instance Attribute Details
#cache ⇒ Object
Returns the value of attribute cache.
10 11 12 |
# File 'lib/tickethub/collection.rb', line 10 def cache @cache end |
#count ⇒ Object (readonly)
Returns the value of attribute count.
11 12 13 |
# File 'lib/tickethub/collection.rb', line 11 def count @count end |
#endpoint ⇒ Object (readonly)
Returns the value of attribute endpoint.
11 12 13 |
# File 'lib/tickethub/collection.rb', line 11 def endpoint @endpoint end |
#params ⇒ Object (readonly)
Returns the value of attribute params.
11 12 13 |
# File 'lib/tickethub/collection.rb', line 11 def params @params end |
Instance Method Details
#[](search) ⇒ Object
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/tickethub/collection.rb', line 135 def [](search) case search when Fixnum self.offset(search).first when Hash self.filter(search).first when Range self.offset(search.min).first(search.max) when Array self.filter(id: search) when String @klass.call endpoint, CGI::escape(search), @options, @params else raise ArgumentError, 'invalid search value type' end end |
#any?(&block) ⇒ Boolean
126 127 128 |
# File 'lib/tickethub/collection.rb', line 126 def any?(&block) block_given?? super : ! empty? end |
#create(attributes = {}) ⇒ Object
152 153 154 155 156 |
# File 'lib/tickethub/collection.rb', line 152 def create(attributes = {}) @klass.call endpoint, post(attributes), @options rescue Tickethub::ResourceInvalid => err @klass.call endpoint, Tickethub::Response.new(err.response).decoded, @options end |
#empty? ⇒ Boolean
122 123 124 |
# File 'lib/tickethub/collection.rb', line 122 def empty? count.zero? end |
#filter(value) ⇒ Object
77 78 79 80 |
# File 'lib/tickethub/collection.rb', line 77 def filter(value) self.class.new endpoint, @klass, params.merge(filters: filters.merge(value)) end |
#filters ⇒ Object
82 83 84 |
# File 'lib/tickethub/collection.rb', line 82 def filters (params[:filters] || {}).dup end |
#last ⇒ Object
55 56 57 |
# File 'lib/tickethub/collection.rb', line 55 def last offset(count - 1).first end |
#limit(value = nil) ⇒ Object
59 60 61 62 63 64 65 66 |
# File 'lib/tickethub/collection.rb', line 59 def limit(value = nil) if value.nil? return (@limit || params[:limit] || DEFAULT_LIMIT).to_i else self.class.new endpoint, @klass, params.merge(limit: value) end end |
#offset(value = nil) ⇒ Object
68 69 70 71 72 73 74 75 |
# File 'lib/tickethub/collection.rb', line 68 def offset(value = nil) if value.nil? return (@offset || params[:offset] || DEFAULT_OFFSET).to_i else self.class.new endpoint, @klass, params.merge(offset: value) end end |
#order(value = nil) ⇒ Object
90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/tickethub/collection.rb', line 90 def order(value = nil) return params[:order].dup if value.nil? order = (params[:order] || []) + (case value when Symbol, String then [value.to_s] when Hash value.collect do |key, direction| direction.to_s == 'desc' ? "-#{key}" : key end end) self.class.new endpoint, @klass, params.merge(order: order) end |
#reload! ⇒ Object
46 47 48 49 50 51 52 53 |
# File 'lib/tickethub/collection.rb', line 46 def reload! @cache = (response = endpoint.get params).decoded @count, @offset, @limit = response.status == 206 ? response.headers.values_at(*%w(x-total-count x-offset x-limit)) .collect { |value| value[0].to_i } : [@cache.length, 0, @cache.length] return self end |
#scope(path, params = {}) ⇒ Object
104 105 106 107 |
# File 'lib/tickethub/collection.rb', line 104 def scope(path, params = {}) self.class.new endpoint[path], @klass, self.params.merge(params) end |
#search(value) ⇒ Object
86 87 88 |
# File 'lib/tickethub/collection.rb', line 86 def search(value) self.filter(search: value) end |