class Eco::API::Session::Batch::RequestStats

@attr_reader count [Integer] the total number of requests @attr_reader stats [Hash] plain `Hash` with the number of requests that include an attribute

Constants

ACCOUNT_ATTRS
BLANKED_PREFIX
CORE_ATTRS
DETAILS_ATTRS

Attributes

count[R]
type[R]

Public Class Methods

account_attrs(stats: false, all: false) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 28
def account_attrs(stats: false, all: false)
  ACCOUNT_ATTRS.dup.tap do |attrs|
    if stats || all
      attrs.unshift("account_remove")
      attrs.unshift("account") if all
      attrs.concat(blank_attrs(ACCOUNT_ATTRS))
    end
  end
end
blank_attrs(attrs) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 57
def blank_attrs(attrs)
  attrs.map {|attr| "#{blanked_prefix}#{attr}"}
end
blanked_prefix(attr = nil) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 47
def blanked_prefix(attr = nil)
  @blanked_prefix ||= BLANKED_PREFIX
  return @blanked_prefix unless attr
  "#{blanked_prefix}#{attr}"
end
blanked_prefix=(value) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 53
def blanked_prefix=(value)
  @blanked_prefix = value || blanked_prefix
end
core_attrs(stats: false, all: false) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 19
def core_attrs(stats: false, all: false)
  CORE_ATTRS.dup.tap do |attrs|
    if stats || all
      attrs.unshift("core")
      attrs.concat(blank_attrs(CORE_ATTRS))
    end
  end
end
details_attrs(stats: false, all: false) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 38
def details_attrs(stats: false, all: false)
  DETAILS_ATTRS.dup.tap do |attrs|
    if stats || all
      attrs.unshift("details_remove")
      attrs.unshift("details") if all
    end
  end
end
new(type:, requests: []) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 65
def initialize(type:, requests: [])
  raise "type should be one of #{Eco::API::Session::Batch::Job.types}. Given: #{type}"  unless self.class.valid_type?(type.to_sym)
  @type  = type.to_sym
  @count = requests && requests.length
  @stats = build(requests)
end
valid_type?(type) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 15
def valid_type?(type)
  Eco::API::Session::Batch::Job.valid_type?(type.to_sym)
end

Public Instance Methods

message(percent: false) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 76
def message(percent: false)
  key_val_delimiter = ": "; attr_delimiter = " ++ "
  pairs_to_line = Proc.new do |pairs|
    pairs.map do |p|
      [p.first.to_s, "#{p.last.to_s}" + (percent ? "%" : "")].join(key_val_delimiter)
    end.join(attr_delimiter)
  end

  lines = []
  lines << pairs_to_line.call(core_pairs(percent: percent))
  lines << pairs_to_line.call(account_pairs(percent: percent))
  lines << pairs_to_line.call(details_pairs(percent: percent))
  lines.join("\n")
end
to_h() click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 72
def to_h
  @stats
end

Private Instance Methods

account(percent: false) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 103
def account(percent: false)
  attr("account", percent: percent)
end
account_attrs() click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 197
def account_attrs
  @account_attrs ||= self.class.account_attrs
end
account_pairs(percent: false) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 169
def account_pairs(percent: false)
  aattrs         = ["account_remove"] + account_attrs + blank_attrs(account_attrs)
  [["account",   account(percent: percent)]] + pairs(aattrs, percent: percent, total: account)
end
add_account_stats(stats, request) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 140
def add_account_stats(stats, request)
  if request.key?("account")
    stats["account"] += 1
    stats["account_remove"] += 1 if !request["account"]
    attrs_to_stat(stats, request["account"] || {}, account_attrs)
  end
end
add_core_stats(stats, request) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 135
def add_core_stats(stats, request)
  stats["core"] += 1 if (request.keys & core_attrs).length > 0
  attrs_to_stat(stats, request, core_attrs)
end
add_details_stats(stats, request) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 148
def add_details_stats(stats, request)
  if request.key?("details")
    stats["details"] += 1
    stats["details_remove"] += 1 if !request["details"]
    if fields = request.dig("details", "fields")
      stats["fields"] += fields.length
    end
  end
end
attr(attr, percent: false, total: count) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 93
def attr(attr, percent: false, total: count)
  i = @stats["#{attr}"]
  return i unless percent
  percentage(i, total: total)
end
attrs_to_stat(stats, hash, attrs) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 124
def attrs_to_stat(stats, hash, attrs)
  stats.tap do |st|
    attrs.each do |attr|
      if hash.key?(attr)
        st[attr] += 1
        st[blanked_prefix(attr)]+= 1 if blanked_value?(hash[attr])
      end
    end
  end
end
blank_attrs(attrs) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 205
def blank_attrs(attrs)
  self.class.blank_attrs(attrs)
end
blanked_prefix(attr = nil) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 209
def blanked_prefix(attr = nil)
  self.class.blanked_prefix(attr)
end
blanked_value?(value) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 213
def blanked_value?(value)
  case value
  when nil
    true
  when false
    true
  when Numeric
    value == 0
  when Array
    value.compact.empty?
  when String
    value.to_s.strip.empty?
  end
end
build(requests) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 111
def build(requests)
  Hash.new(0).tap do |stats|
    stats[type] = count
    unless !requests || !requests.is_a?(Enumerable) || requests.empty?
      requests.each_with_index do |request|
        add_core_stats(stats, request || {})
        add_account_stats(stats, request || {})
        add_details_stats(stats, request || {})
      end
    end
  end
end
core(percent: false) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 99
def core(percent: false)
  attr("core", percent: percent)
end
core_attrs() click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 193
def core_attrs
  @core_attrs    ||= self.class.core_attrs
end
core_pairs(percent: false) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 164
def core_pairs(percent: false)
  cattrs        = core_attrs + blank_attrs(core_attrs)
  [["core",     core(percent: percent)]] + pairs(cattrs, percent: percent, total: core)
end
details(percent: false) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 107
def details(percent: false)
  attr("details", percent: percent)
end
details_attrs() click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 201
def details_attrs
  @details_attrs ||= self.class.details_attrs
end
details_pairs(percent: false) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 174
def details_pairs(percent: false)
  details_pairs  = [["details", details(percent: percent)]]
  details_pairs += [["fields", fields_average]] if attr("fields") && fields_average
  details_pairs += pairs(["details_remove"], percent: percent, total: details)
end
fields_average() click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 180
def fields_average
  if (fields_num = attr("fields")) && (total = details) > 0
    (fields_num.to_f / total.to_f).round(2)
  end
end
pairs(attrs, percent: false, total: count) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 158
def pairs(attrs, percent: false, total: count)
  pairs = attrs.map do |a|
    (v = attr(a, percent: percent, total: count)) > 0 ? [a, v] : nil
  end.compact
end
percentage(num, total: count) click to toggle source
# File lib/eco/api/session/batch/request_stats.rb, line 186
def percentage(num, total: count)
  total ||= count
  if num
    (num.to_f / total * 100).round(2)
  end
end