Sha256: 369de1a978a0ffdce177e5de1195faf7c5e30c36d22c6d9ef6aac3ac6d8b86c4
Contents?: true
Size: 1.91 KB
Versions: 1
Compression:
Stored size: 1.91 KB
Contents
module SoapyCake class AdminBatched ALLOWED_METHODS = %i( advertisers affiliates campaigns offers creatives clicks conversions events ).freeze def initialize(opts = {}) @opts = opts end class BatchedRequest # Both 0 and 1 return the first element. We need to set it to 1, # otherwise we get an overlap in the next call. This is not documented in the API spec. INITIAL_OFFSET = 1 # This value depends on the entity size. # When all offers have a lot of info (e.g. geotargeting) we probably need to decrease this. LIMIT = 500 def initialize(admin, method, opts, limit) if opts.key?(:row_limit) || opts.key?(:start_at_row) fail Error, 'Cannot set row_limit/start_at_row in batched mode!' end @admin = admin @method = method @opts = opts @offset = INITIAL_OFFSET @limit = limit || LIMIT end def to_enum Enumerator.new do |y| loop do fetch_elements(y) @offset += limit end end end private def fetch_elements(enumerator) result = fetch_batch # raises StopIteration when less than `limit` elements are present # which is then rescued by `loop` if admin.xml_response? enumerator << result.next else limit.times { enumerator << result.next } end end def fetch_batch admin.public_send(method, opts.merge(row_limit: limit, start_at_row: offset)) end attr_reader :admin, :method, :opts, :offset, :limit end def method_missing(name, method_opts = {}, limit = nil) fail Error, "Invalid method #{name}" unless ALLOWED_METHODS.include?(name) BatchedRequest.new(admin, name, method_opts, limit).to_enum end private attr_reader :opts def admin @admin ||= Admin.new(opts) end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
soapy_cake-1.14.3 | lib/soapy_cake/admin_batched.rb |