class FirebaseStats::Reader
Parses the Firebase CSV file into sections
Attributes
data[R]
Public Class Methods
new()
click to toggle source
Calls superclass method
# File lib/reader.rb, line 10 def initialize super @data = {} end
Public Instance Methods
parse(input)
click to toggle source
@param [Array<String>] input
# File lib/reader.rb, line 22 def parse(input) curr_lines = [] input.each_with_index do |line, idx| curr_lines.push(line) unless comment?(line) || line.strip.empty? if (idx == input.length - 1) || line.strip.empty? process_lines curr_lines unless curr_lines.empty? curr_lines = [] end end end
parse_file(filename)
click to toggle source
@param [String] filename
# File lib/reader.rb, line 16 def parse_file(filename) lines = File.readlines(filename) parse(lines) end
Private Instance Methods
comment?(line)
click to toggle source
@param [String] line
# File lib/reader.rb, line 72 def comment?(line) line.include?('#') end
match_header(header)
click to toggle source
@param [String] header @return [Symbol, nil] rubocop:disable Metrics/MethodLength
# File lib/reader.rb, line 48 def match_header(header) mappings = { 'Day,28-Day,7-Day,1-Day' => :active_users, 'Day,Average engagement time' => :daily_engagement, 'Page path and screen class,User engagement,Screen views' => :screens, 'Day,Total revenue' => :revenue, 'App,Crash-free users' => :crash_free_users, 'App,Version,Status' => :version_adoption, 'Source,first_open conversions,LTV' => :acquisition, 'Date,Week 0,Week 1,Week 2,Week 3,Week 4,Week 5' => :retention_cohorts, 'Country ID,Sessions,% Total' => :audience_country, 'Device model,Users' => :devices, 'OS with version,Users' => :os_version, 'Gender,Users' => :gender, 'Category,Female,Male' => :gender_age, 'Platform,Users' => :platform, 'Platform,Users,% Total,User engagement,Total revenue' => :platform_engagement } mappings[header.strip] end
process_lines(lines)
click to toggle source
@param [Array<String>] lines
# File lib/reader.rb, line 37 def process_lines(lines) section = match_header lines[0] return if section.nil? parsed = CSV.parse(lines.join, headers: true) @data[section] = parsed if @data[section].nil? end