Class: Tickethub::Collection

Inherits:
Enumerator
  • Object
show all
Defined in:
lib/tickethub/collection.rb

Constant Summary collapse

DEFAULT_LIMIT =
25.freeze
DEFAULT_OFFSET =
0.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

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 = {}, options = {})
  @params = params.dup
  @options = options.dup
  @endpoint = endpoint
  @klass = klass

  klass.registered_types.each do |type, options|
    define_singleton_method type do
      instance_variable_defined?("@#{type}") ? instance_variable_get("@#{type}") :
        instance_variable_set("@#{type}", Tickethub::Collection.new(endpoint[type], options[: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

#cacheObject

Returns the value of attribute cache.



10
11
12
# File 'lib/tickethub/collection.rb', line 10

def cache
  @cache
end

#countObject (readonly)

Returns the value of attribute count.



11
12
13
# File 'lib/tickethub/collection.rb', line 11

def count
  @count
end

#endpointObject (readonly)

Returns the value of attribute endpoint.



11
12
13
# File 'lib/tickethub/collection.rb', line 11

def endpoint
  @endpoint
end

#paramsObject (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

Returns:

  • (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

Returns:

  • (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

#filtersObject



82
83
84
# File 'lib/tickethub/collection.rb', line 82

def filters
  (params[:filters] || {}).dup
end

#lastObject



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