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