class FirebaseStats::Wrapper

Transforms the parsed Firebase file into something more user friendly

Public Class Methods

new(stats) click to toggle source

@param [FirebaseStats::Reader] stats

Calls superclass method
# File lib/wrapper.rb, line 11
def initialize(stats)
  super()
  @stats = stats
end

Public Instance Methods

devices(friendly: false, limit: 10, platform: :all) click to toggle source

Gets all devices @param [Boolean] friendly Transform the Android model numbers into their human numaes @param [Integer] limit Number of devices to turn @param [Symbol] platform One of :all, :ios, :android

# File lib/wrapper.rb, line 37
def devices(friendly: false, limit: 10, platform: :all)
  filtered = DeviceUtils.filter_device(@stats.data[:devices], platform)
  filtered = filtered.take(limit || 10)
  cleaned = []
  filtered.each do |row|
    device = {
      'model' => row['Device model']
    }
    if friendly && ((platform == :all) || (platform == :android))
      mapped = Android::Devices.search_by_model(row['Device model'])
      device['friendly'] = if mapped.nil?
                             row['Device model']
                           else
                             mapped.name
                           end
    end
    device['count'] = row['Users'].to_i

    cleaned << device
  end
  cleaned
end
gender() click to toggle source
# File lib/wrapper.rb, line 60
def gender
  raw = @stats.data[:gender]
  data = []
  raw.each do |row|
    data << {
      'gender' => row['Gender'],
      'count' => row['Users']
    }
  end
  data
end
gender_age() click to toggle source
# File lib/wrapper.rb, line 72
def gender_age
  raw = @stats.data[:gender_age]
  data = []
  raw.each do |row|
    data << {
      'age' => row['Category'],
      'male' => (row['Male'].to_f * 100).round(2),
      'female' => (row['Female'].to_f * 100).round(2)
    }
  end
  data
end
os(platform: :all, grouped: true, major_order: true) click to toggle source

Get all OS versions, grouped by Major version @param [Symbol] platform One of :all, :ios, :android @param [Boolean] grouped Group by Major OS version @param [Boolean] major_order Order by Major OS version (instead of percentage)

# File lib/wrapper.rb, line 20
def os(platform: :all, grouped: true, major_order: true)
  os_data = all_os
  filtered = filter_os(os_data, platform)

  data = if grouped
           make_group_stats(filtered, platform)
         else
           filtered
         end

  major_order ? major_version_sort(data) : data
end

Private Instance Methods

all_os() click to toggle source

Get all OS versions

# File lib/wrapper.rb, line 118
def all_os
  data = @stats.data[:os_version]

  data.map do |row|
    {
      'version' => row['OS with version'],
      'count' => row['Users'].to_i
    }
  end
end
android_os_group(os_details) click to toggle source
# File lib/wrapper.rb, line 113
def android_os_group(os_details)
  filter_os(os_details, :android).group_by { |row| row['version'].match('(Android [0-9]{1,2})').captures[0] }
end
as_percentage(total, value) click to toggle source
# File lib/wrapper.rb, line 100
def as_percentage(total, value)
  percentage = (value / total) * 100
  if percentage < 0.01
    percentage.round(4)
  else
    percentage.round(2)
  end
end
filter_os(os_data, platform) click to toggle source

@param [CSV::Table] os_data @param [Symbol] platform One of :all, :ios, :android

# File lib/wrapper.rb, line 89
def filter_os(os_data, platform)
  case platform
  when :android
    os_data.select { |row| row['version'].downcase.include?('android') }
  when :ios
    os_data.select { |row| row['version'].downcase.include?('ios') }
  else
    os_data
  end
end
ios_os_group(os_details) click to toggle source
# File lib/wrapper.rb, line 109
def ios_os_group(os_details)
  filter_os(os_details, :ios).group_by { |row| row['version'].match('(iOS [0-9]{1,2})').captures[0] }
end
major_version_sort(data) click to toggle source
# File lib/wrapper.rb, line 157
def major_version_sort(data)
  data.sort_by do |row|
    version = row['version']
    number = version.match('([0-9.]+)').captures[0]
    Gem::Version.new(number)
  end.reverse
end
make_group_stats(os_data, platform) click to toggle source
# File lib/wrapper.rb, line 129
def make_group_stats(os_data, platform)
  data = make_os_groups(os_data, platform)

  total_devices = os_total(os_data)
  data.map do |k, v|
    version_name = k
    group_total = v.map { |version| version['count'].to_i }.reduce(0, :+)
    { 'version' => version_name,
      'total' => group_total,
      'percentage' => as_percentage(total_devices.to_f, group_total) }
  end
end
make_os_groups(os_data, platform) click to toggle source
# File lib/wrapper.rb, line 142
def make_os_groups(os_data, platform)
  case platform
  when :ios
    ios_os_group(os_data)
  when :android
    android_os_group(os_data)
  else
    android_os_group(os_data).merge ios_os_group(os_data)
  end
end
os_total(os_data) click to toggle source
# File lib/wrapper.rb, line 153
def os_total(os_data)
  os_data.map { |row| row['count'] }.reduce(0, :+)
end