-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjhu2json.rb
executable file
·97 lines (80 loc) · 2.76 KB
/
jhu2json.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
require 'csv'
require 'digest/sha2'
require 'json'
require 'httparty'
require './country_mappings'
require './command_line_options'
require './parsers/global'
require './parsers/us'
VERSION = 0.2
responses, results, iso_countries_by_name, json = {}, {}, {}, nil
%w( global US ).each do |region|
# Load most recent data from JHU (Glboal) via Github
%w( confirmed deaths recovered ).each do |set|
# Retrieve the data from Github
url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_#{set}_#{region}.csv"
puts "Loading #{region} data for #{url}"
response = HTTParty.get(url)
# Skip if we can't download the file
unless response.code == 200
puts "Retrieved code #{response.code} when attempting to download file, skipping"
next
end
data = response.body
parser = case region
when 'global' then Parser::Global.new(data, set: set, previous_results: results)
when 'US' then Parser::US.new(data, set: set, previous_results: results)
end
responses.has_key?(set) ? responses[set].merge(parser.execute) : responses[set] = parser.execute
end
end
# Return everything as json
case OPTIONS[:output]
when 'file'
file = OPTIONS[:filename] || "#{DateTime.now.strftime("%d-%m-%Y")}.json"
puts "Writing output to file: #{file}"
File.write(file, results.values.to_json)
when 'database'
require './database'
require './area'
require './period'
require './migrations/create_areas'
require './migrations/create_periods'
results.each do |key, area|
puts "Importing data for #{area[:country]}/#{area[:province_state]}/#{area[:admin2]}"
db_area = Area.find_or_create_by(
unique_identifier: key,
iso2: area[:iso2],
iso3: area[:iso3],
code3: area[:code3],
fips: area[:fips],
admin2: area[:admin2],
province_state: area[:province_state],
country: area[:country],
combined_key: area[:combined_key],
population: area[:population],
lat: area[:coordinates].first,
long: area[:coordinates].last
)
db_area.update(
iso_3166_country_name: area[:iso_3166][:country],
iso_3166_country_code: area[:iso_3166][:country_code],
iso_3166_division_code: area[:iso_3166][:division_code]
)
days = 0
area[:dates].each_with_index do |day, index|
period = db_area.periods.find_or_create_by(
date: day
)
period.update(
confirmed: area[:data][:confirmed]&.at(index),
recovered: area[:data][:recovered]&.at(index),
deaths: area[:data][:deaths]&.at(index)
)
days += 1
end
puts "Imported #{days} data sets for #{area[:country]}/#{area[:area]}/#{area[:county]}"
end
else
puts results.values.to_json
end