Class: Tickethub::Collection
- Inherits:
-
Enumerator
- Object
- Enumerator
- Tickethub::Collection
- Defined in:
- lib/tickethub/collection.rb
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 = {}) ⇒ Collection
constructor
A new instance of Collection.
- #last ⇒ Object
- #limit ⇒ Object
- #offset(value = nil) ⇒ Object
- #order(value = nil) ⇒ Object
- #reload! ⇒ Object
- #scope(path, params = {}) ⇒ Object
- #search(value) ⇒ Object
Constructor Details
#initialize(endpoint, klass, params = {}) ⇒ Collection
Returns a new instance of Collection.
9 10 11 12 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 |
# File 'lib/tickethub/collection.rb', line 9 def initialize(endpoint, klass, params = {}) @params = params.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.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.load(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.load(endpoint, row) end end end end |
Instance Attribute Details
#cache ⇒ Object
Returns the value of attribute cache.
6 7 8 |
# File 'lib/tickethub/collection.rb', line 6 def cache @cache end |
#count ⇒ Object (readonly)
Returns the value of attribute count.
7 8 9 |
# File 'lib/tickethub/collection.rb', line 7 def count @count end |
#endpoint ⇒ Object (readonly)
Returns the value of attribute endpoint.
7 8 9 |
# File 'lib/tickethub/collection.rb', line 7 def endpoint @endpoint end |
#params ⇒ Object (readonly)
Returns the value of attribute params.
7 8 9 |
# File 'lib/tickethub/collection.rb', line 7 def params @params end |
Instance Method Details
#[](search) ⇒ Object
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/tickethub/collection.rb', line 137 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 String endpoint = self.endpoint[@klass.path, CGI::escape(search)] @klass.load endpoint, endpoint.get(params) else raise ArgumentError, 'invalid search value type' end end |
#any?(&block) ⇒ Boolean
123 124 125 |
# File 'lib/tickethub/collection.rb', line 123 def any?(&block) block_given?? super : ! empty? end |
#create(attributes = {}) ⇒ Object
153 154 155 156 157 |
# File 'lib/tickethub/collection.rb', line 153 def create(attributes = {}) @klass.load endpoint, post(attributes) rescue Tickethub::ResourceInvalid => err @klass.load endpoint, Tickethub::Response.new(err.response).decoded end |
#empty? ⇒ Boolean
119 120 121 |
# File 'lib/tickethub/collection.rb', line 119 def empty? count.zero? end |
#filter(value) ⇒ Object
74 75 76 77 |
# File 'lib/tickethub/collection.rb', line 74 def filter(value) self.class.new endpoint, @klass, params.merge(filters: filters.merge(value)) end |
#filters ⇒ Object
79 80 81 |
# File 'lib/tickethub/collection.rb', line 79 def filters (params[:filters] || {}).dup end |
#last ⇒ Object
50 51 52 |
# File 'lib/tickethub/collection.rb', line 50 def last offset(count - 1).first end |
#limit ⇒ Object
54 55 56 57 58 59 60 61 62 |
# File 'lib/tickethub/collection.rb', line 54 def limit(value = nil) if value.nil? reload! if @limit.nil? return @limit else self.class.new endpoint, @klass, params.merge(limit: value) end end |
#offset(value = nil) ⇒ Object
64 65 66 67 68 69 70 71 72 |
# File 'lib/tickethub/collection.rb', line 64 def offset(value = nil) if value.nil? reload! if @offset.nil? return @offset else self.class.new endpoint, @klass, params.merge(offset: value) end end |
#order(value = nil) ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/tickethub/collection.rb', line 87 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
41 42 43 44 45 46 47 48 |
# File 'lib/tickethub/collection.rb', line 41 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
101 102 103 104 |
# File 'lib/tickethub/collection.rb', line 101 def scope(path, params = {}) self.class.new endpoint[path], @klass, self.params.merge(params) end |
#search(value) ⇒ Object
83 84 85 |
# File 'lib/tickethub/collection.rb', line 83 def search(value) self.filter(search: value) end |