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