Class: Tickethub::Collection

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

Instance Attribute Summary collapse

Instance Method Summary collapse

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, 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.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

#cacheObject

Returns the value of attribute cache.



6
7
8
# File 'lib/tickethub/collection.rb', line 6

def cache
  @cache
end

#countObject (readonly)

Returns the value of attribute count.



7
8
9
# File 'lib/tickethub/collection.rb', line 7

def count
  @count
end

#endpointObject (readonly)

Returns the value of attribute endpoint.



7
8
9
# File 'lib/tickethub/collection.rb', line 7

def endpoint
  @endpoint
end

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

Returns:

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

Returns:

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

#filtersObject



79
80
81
# File 'lib/tickethub/collection.rb', line 79

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

#lastObject



50
51
52
# File 'lib/tickethub/collection.rb', line 50

def last
  offset(count - 1).first
end

#limitObject



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