class CovidPT::Report
Constants
- MUNICIPALITY_EDGE_CASES
Attributes
date[R]
pdf[R]
Public Class Methods
new(date)
click to toggle source
# File lib/covid_pt/report.rb, line 14 def initialize(date) @date = Date.parse(date) rescue ArgumentError => e puts e.message puts "Argument: #{date}" end
Public Instance Methods
generate()
click to toggle source
# File lib/covid_pt/report.rb, line 21 def generate return @report if @report @report = { overall: overall_report, regional: regional_report, date: @date } cleanup @report end
Private Instance Methods
cleanup()
click to toggle source
# File lib/covid_pt/report.rb, line 147 def cleanup File.delete(filename) end
day_identifier()
click to toggle source
Calculate the numerical identifier of the report based on the 01/06/2020 report, which was #91
# File lib/covid_pt/report.rb, line 138 def day_identifier day_baseline = Date.parse("2020-06-01") number_baseline = 91 baseline_shift = date.mjd - day_baseline.mjd number_baseline + baseline_shift end
download_pdf()
click to toggle source
# File lib/covid_pt/report.rb, line 108 def download_pdf response = RestClient.get(pdf_url) File.write(filename, response.body) filename end
filename()
click to toggle source
# File lib/covid_pt/report.rb, line 116 def filename formatted_date = date.strftime("%Y%m%d") "#{day_identifier}_DGS_boletim_#{formatted_date}.pdf" end
first_page()
click to toggle source
# File lib/covid_pt/report.rb, line 96 def first_page pdf.pages.first end
handle_municipality_edge_cases(municipalities)
click to toggle source
# File lib/covid_pt/report.rb, line 88 def handle_municipality_edge_cases(municipalities) MUNICIPALITY_EDGE_CASES.map do |k, v| municipalities[v] = municipalities.delete(k) end municipalities end
overall_report()
click to toggle source
# File lib/covid_pt/report.rb, line 39 def overall_report numbers_in_pdf = first_page.text.scan(/\d+/) # numbers_in_pdf[0] is the 19 from COVID-19 # numbers_in_pdf[9] is the 1 from "1 de janeiro 2020" # numbers_in_pdf[11] is the 2020 from "1 de janeiro 2020" { cases_in_north: numbers_in_pdf[1].to_i, deaths_in_north: numbers_in_pdf[2].to_i, cases_in_azores: numbers_in_pdf[3].to_i, deaths_in_azores: numbers_in_pdf[4].to_i, cases_in_centre: numbers_in_pdf[5].to_i, deaths_in_centre: numbers_in_pdf[6].to_i, cases_in_madeira: numbers_in_pdf[7].to_i, deaths_in_madeira: numbers_in_pdf[8].to_i, total_suspect_cases: numbers_in_pdf[10].to_i, cases_in_lisbon: numbers_in_pdf[12].to_i, deaths_in_lisbon: numbers_in_pdf[13].to_i, total_confirmed_cases: numbers_in_pdf[14].to_i, total_unconfirmed_cases: numbers_in_pdf[15].to_i, cases_in_alentejo: numbers_in_pdf[16].to_i, deaths_in_alentejo: numbers_in_pdf[17].to_i, awaiting_lab_results: numbers_in_pdf[18].to_i, cases_in_algarve: numbers_in_pdf[19].to_i, deaths_in_algarve: numbers_in_pdf[20].to_i, total_recovered_cases: numbers_in_pdf[21].to_i, total_deaths: numbers_in_pdf[22].to_i, total_under_suspicion: numbers_in_pdf[23].to_i, } end
pdf_url()
click to toggle source
# File lib/covid_pt/report.rb, line 122 def pdf_url return @_pdf_url if @_pdf_url response = RestClient.get("https://covid19.min-saude.pt/relatorio-de-situacao/") doc = Nokogiri::HTML(response.body) li = doc.css("#content_easy > div.single_content > ul", "li").children.select do |li| li.content.match(/#{@date.strftime("%d/%m/%Y")}/) end.first @_pdf_url = li.css("a").first.attr("href") end
regional_report()
click to toggle source
# File lib/covid_pt/report.rb, line 70 def regional_report municipalities = third_page. text. sub(/\A.+(Abrantes)/m, "\\1"). sub(/(Vouzela\s+\d+).*\z/m, "\\1"). gsub(/(\d)\s+/, "\\1\n"). gsub(/\*/, ""). split("\n"). map { |s| s.split(/\s{2,}/).reject(&:empty?) }. reject { |m| m.length < 2 }. map { |m| m.last(2) }. map { |m| [m.first, m.last.to_i] }. to_h handle_municipality_edge_cases(municipalities) end
third_page()
click to toggle source
# File lib/covid_pt/report.rb, line 100 def third_page pdf.pages[2] end