lib/covid19/decorators/chart.rb
require 'tty-pie'
module Covid19
module Decorators
class Chart
TYPES = { all_continent_general_data: 'all_continent_general_data',
continent_general_data: 'continent_general_data',
continent_diary_data: 'continent_diary_data',
country_general_data: 'country_general_data',
country_diary_data: 'country_diary_data' }
DEFAULT_FILL = 'Ø'
SIZE = 15
FILLS = %w(* x @ + % #)
COLORS = %i(bright_yellow
bright_green
bright_magenta
bright_cyan
bright_red
bright_white)
GENERAL_TOTALS = %w(deaths
recovered
active)
DIARY_TOTALS = %w(todayCases
todayDeaths
todayRecovered)
def self.create_pie(data:, type:, colored: nil)
pie_data = case type
when TYPES[:all_continent_general_data]
mount_all_continent_general_data(data)
when TYPES[:continent_general_data]
mount_general_data(data)
when TYPES[:country_general_data]
mount_general_data(data)
when TYPES[:continent_diary_data]
mount_diary_data(data)
when TYPES[:country_diary_data]
mount_diary_data(data)
else
raise ArgumentError.new('Error in chart plot!')
end
formatted_chart = colored ? add_color(pie_data) : add_fill(pie_data)
TTY::Pie.new(data: formatted_chart, radius: SIZE)
end
def self.add_color(pie_data)
pie_data.each_with_index {|hash, index| hash.merge!({fill: DEFAULT_FILL, color: COLORS[index]})}
end
def self.add_fill(pie_data)
pie_data.each_with_index {|hash, index| hash.merge!({fill: FILLS[index]})}
end
def self.mount_all_continent_general_data(data)
data.map {|occurrency| {name: occurrency['continent'], value: occurrency['cases']}}
end
def self.mount_general_data(data)
data
.select { |key, value| GENERAL_TOTALS.include?(key) }
.map { |occurrency| {name: occurrency.first, value: occurrency.last} }
end
def self.mount_diary_data(data)
data
.select { |key, value| DIARY_TOTALS.include?(key) }
.map { |occurrency| {name: occurrency.first, value: occurrency.last} }
end
private_class_method :add_color,
:add_fill,
:mount_all_continent_general_data,
:mount_general_data,
:mount_diary_data
end
end
end