kovid 0.4.1 β 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +3 -1
- data/README.md +38 -9
- data/kovid.gemspec +2 -0
- data/lib/kovid.rb +15 -2
- data/lib/kovid/cli.rb +29 -2
- data/lib/kovid/helpers.rb +11 -0
- data/lib/kovid/request.rb +60 -24
- data/lib/kovid/tablelize.rb +134 -60
- data/lib/kovid/version.rb +1 -1
- metadata +17 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 851facd4cdf0be330b04c5e0f81c91d8a5c5fdaea314751540d224e108c4464d
|
|
4
|
+
data.tar.gz: b36ce66c70a12df6930ca30d78ccf7628b06d6a4c70563e6382a8db584d96e6a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7ef46bb27fef43b9e032dfc81cb05389b22cd199a46f5d0c354794f892552aefb9bc765cc0fde64145e75961086622e29a06de057cc6acb66c192b46c9438890
|
|
7
|
+
data.tar.gz: f0e2aad02999132f9505586886545116c915d98b90701b6a8f98410b0c27ca64c8990cfe841c75c2096c5023cc11bd0922eafa0ac0258f5e7de3f8e0dd31ede1
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
kovid (0.4.
|
|
4
|
+
kovid (0.4.5)
|
|
5
|
+
ascii_charts (~> 0.9.1)
|
|
5
6
|
rainbow (~> 3.0)
|
|
6
7
|
terminal-table (~> 1.8)
|
|
7
8
|
thor (~> 1.0)
|
|
@@ -10,6 +11,7 @@ PATH
|
|
|
10
11
|
GEM
|
|
11
12
|
remote: https://rubygems.org/
|
|
12
13
|
specs:
|
|
14
|
+
ascii_charts (0.9.1)
|
|
13
15
|
diff-lcs (1.3)
|
|
14
16
|
docile (1.3.2)
|
|
15
17
|
ethon (0.12.0)
|
data/README.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
[](https://badge.fury.io/rb/kovid)
|
|
2
|
+
[](https://www.codetriage.com/siaw23/kovid)
|
|
3
|
+
|
|
4
|
+
|
|
1
5
|
# π¦ Kovid
|
|
2
6
|
|
|
3
7
|
Kovid is a small CLI app to fetch data surrounding the coronavirus pandemic of 2019. I found myself checking [Wikipedia](https://en.wikipedia.org/wiki/2019%E2%80%9320_coronavirus_pandemic) constantly for information so I thought I'd build this to provide info directly in the terminal. It's where some of us spend time more.
|
|
@@ -25,6 +29,16 @@ You can run `kovid --help` to see the full list of available commands.
|
|
|
25
29
|
* `kovid check COUNTRY` OR `kovid country COUNTRY`.
|
|
26
30
|
* `kovid check COUNTRY -f` OR `kovid check COUNTRY --full`.
|
|
27
31
|
|
|
32
|
+
π¦π¦π¦
|
|
33
|
+
|
|
34
|
+
You can fetch aggregated data on Africa:
|
|
35
|
+
* `kovid africa`.
|
|
36
|
+
|
|
37
|
+
π°π°π°
|
|
38
|
+
|
|
39
|
+
You can fetch aggregated Europe (all 44 countries combined) data:
|
|
40
|
+
* `kovid europe`.
|
|
41
|
+
|
|
28
42
|
πͺπΊπͺπΊπͺπΊ
|
|
29
43
|
|
|
30
44
|
You can fetch aggregated EU (all 27 countries combined) data:
|
|
@@ -37,8 +51,6 @@ You can fetch US state-specific data:
|
|
|
37
51
|
|
|
38
52
|
##### π Upcoming Fetch Features π·ββοΈ
|
|
39
53
|
|
|
40
|
-
* `kovid europe` Aggrated stats on Europe
|
|
41
|
-
* `kovid africa` Aggrated stats on Africa
|
|
42
54
|
* `kovid asia` Aggrated stats on Asia
|
|
43
55
|
* `kovid south_america` Aggrated stats on South America
|
|
44
56
|
___
|
|
@@ -58,28 +70,32 @@ ___
|
|
|
58
70
|
* `kovid history COUNTRY N` (history in the last N days).
|
|
59
71
|
___
|
|
60
72
|
π· **Total figures**
|
|
61
|
-
* `kovid
|
|
73
|
+
* `kovid world` (summary of reported incidents globally).
|
|
62
74
|
|
|
63
75
|
**NOTE:** If you find it irritating to have to type `kovid state STATE`, `covid state STATE` works as well.
|
|
64
76
|
|
|
77
|
+
#### Histogram (Experimental) π§ͺ
|
|
78
|
+
|
|
79
|
+
`kovid histogram COUNTRY M.YY` (draws a histogram of cases in the given month `M` and years `YY`)
|
|
80
|
+
|
|
65
81
|
#### Commands Details
|
|
66
82
|
To fetch basic data on a country run:
|
|
67
83
|
|
|
68
84
|
`kovid check ghana`. If the location contains spaces: `kovid check "Diamond Princess"`
|
|
69
85
|
|
|
70
|
-

|
|
71
87
|
|
|
72
88
|
For full table info on a country:
|
|
73
89
|
|
|
74
90
|
`kovid check italy -f` OR `kovid check italy --full`
|
|
75
91
|
|
|
76
|
-

|
|
77
93
|
|
|
78
94
|
To compare country stats:
|
|
79
95
|
|
|
80
|
-
`kovid compare germany poland`
|
|
96
|
+
`kovid compare germany poland spain`
|
|
81
97
|
|
|
82
|
-

|
|
83
99
|
|
|
84
100
|
To compare a countries stats with a full table:
|
|
85
101
|
|
|
@@ -99,6 +115,12 @@ To fetch EU data run:
|
|
|
99
115
|
|
|
100
116
|

|
|
101
117
|
|
|
118
|
+
To fetch data on Africa:
|
|
119
|
+
|
|
120
|
+
`kovid africa`
|
|
121
|
+
|
|
122
|
+

|
|
123
|
+
|
|
102
124
|
You can check historical statistics by running
|
|
103
125
|
|
|
104
126
|
`kovid history italy 7` eg:
|
|
@@ -107,11 +129,18 @@ You can check historical statistics by running
|
|
|
107
129
|
|
|
108
130
|
To check for total figures:
|
|
109
131
|
|
|
110
|
-
`kovid
|
|
132
|
+
`kovid world`
|
|
111
133
|
|
|
112
134
|

|
|
113
135
|
|
|
114
|
-
##
|
|
136
|
+
## π©πΎβπ¬ Experimental Feature
|
|
137
|
+
|
|
138
|
+
`kovid histogram italy 3.20` tries to build a histogram on number of cases. In the example here `3.20` is date in the format of `M.YY`. If you can please play with it and report issues on how this could be improved.
|
|
139
|
+
|
|
140
|
+

|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
## Data Source
|
|
115
144
|
> [JHU CSSE GISand Data](https://gisanddata.maps.arcgis.com/apps/opsdashboard/index.html#/bda7594740fd40299423467b48e9ecf6) and https://www.worldometers.info/coronavirus/ via [NovelCOVID/API](https://github.com/novelcovid/api)
|
|
116
145
|
|
|
117
146
|
|
data/kovid.gemspec
CHANGED
|
@@ -22,6 +22,8 @@ Gem::Specification.new do |spec|
|
|
|
22
22
|
spec.add_dependency "terminal-table", "~> 1.8"
|
|
23
23
|
spec.add_dependency "typhoeus", "~> 1.3"
|
|
24
24
|
spec.add_dependency "rainbow", "~> 3.0"
|
|
25
|
+
spec.add_dependency "ascii_charts", "~> 0.9.1"
|
|
26
|
+
|
|
25
27
|
|
|
26
28
|
spec.add_development_dependency "simplecov", "~> 0.18"
|
|
27
29
|
|
data/lib/kovid.rb
CHANGED
|
@@ -4,6 +4,8 @@ require 'kovid/version'
|
|
|
4
4
|
require 'kovid/request'
|
|
5
5
|
|
|
6
6
|
module Kovid
|
|
7
|
+
require 'kovid/helpers'
|
|
8
|
+
|
|
7
9
|
class Error < StandardError; end
|
|
8
10
|
|
|
9
11
|
module_function
|
|
@@ -11,6 +13,13 @@ module Kovid
|
|
|
11
13
|
def eu_aggregate
|
|
12
14
|
Kovid::Request.eu_aggregate
|
|
13
15
|
end
|
|
16
|
+
def europe_aggregate
|
|
17
|
+
Kovid::Request.europe_aggregate
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def africa_aggregate
|
|
21
|
+
Kovid::Request.africa_aggregate
|
|
22
|
+
end
|
|
14
23
|
|
|
15
24
|
def country(name)
|
|
16
25
|
Kovid::Request.by_country(name)
|
|
@@ -24,8 +33,8 @@ module Kovid
|
|
|
24
33
|
Kovid::Request.state(state)
|
|
25
34
|
end
|
|
26
35
|
|
|
27
|
-
def states(*
|
|
28
|
-
Kovid::Request.states(
|
|
36
|
+
def states(*states)
|
|
37
|
+
Kovid::Request.states(states)
|
|
29
38
|
end
|
|
30
39
|
|
|
31
40
|
def country_comparison(names_array)
|
|
@@ -43,4 +52,8 @@ module Kovid
|
|
|
43
52
|
def history(country, last)
|
|
44
53
|
Kovid::Request.history(country, last)
|
|
45
54
|
end
|
|
55
|
+
|
|
56
|
+
def histogram(country, date)
|
|
57
|
+
Kovid::Request.histogram(country, date)
|
|
58
|
+
end
|
|
46
59
|
end
|
data/lib/kovid/cli.rb
CHANGED
|
@@ -37,8 +37,8 @@ module Kovid
|
|
|
37
37
|
data_source
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
-
desc '
|
|
41
|
-
def
|
|
40
|
+
desc 'world', 'Returns total number of cases, deaths and recoveries.'
|
|
41
|
+
def world
|
|
42
42
|
puts Kovid.cases
|
|
43
43
|
data_source
|
|
44
44
|
end
|
|
@@ -59,6 +59,33 @@ module Kovid
|
|
|
59
59
|
data_source
|
|
60
60
|
end
|
|
61
61
|
|
|
62
|
+
desc 'europe', 'Returns aggregated data on Europe.'
|
|
63
|
+
def europe
|
|
64
|
+
puts Kovid.europe_aggregate
|
|
65
|
+
data_source
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
desc 'africa', 'Returns aggregated data on Africa.'
|
|
69
|
+
def africa
|
|
70
|
+
puts Kovid.africa_aggregate
|
|
71
|
+
data_source
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
desc 'version', 'Returns version of kovid'
|
|
75
|
+
def version
|
|
76
|
+
puts Kovid::VERSION
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
desc 'histogram', 'Returns a histogram of incidents.'
|
|
80
|
+
def histogram(country, date = nil)
|
|
81
|
+
if date.nil?
|
|
82
|
+
Kovid.info_table("Please add a month and year in the form 'M.YY'")
|
|
83
|
+
else
|
|
84
|
+
puts Kovid.histogram(country, date)
|
|
85
|
+
data_source
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
62
89
|
private
|
|
63
90
|
|
|
64
91
|
def fetch_country_stats(country)
|
data/lib/kovid/request.rb
CHANGED
|
@@ -10,26 +10,34 @@ module Kovid
|
|
|
10
10
|
COUNTRIES_PATH = UriBuilder.new('/countries').url
|
|
11
11
|
STATES_URL = UriBuilder.new('/states').url
|
|
12
12
|
EU_ISOS = %w[AT BE BG CY CZ DE DK EE ES FI FR GR HR HU IE IT LT LU LV MT NL PL PT RO SE SI SK].freeze
|
|
13
|
+
EUROPE_ISOS = EU_ISOS + %w[GB IS NO CH MC AD SM VA BA RS ME MK AL BY UA RU MD]
|
|
14
|
+
AFRICA_ISOS = %w[DZ AO BJ BW BF BI CM CV CF TD KM CD CG CI DJ EG GQ ER SZ ET GA GM GH GN GW KE LS LR LY MG MW ML MR MU MA MZ NA NE NG RW ST SN SC SL SO ZA SS SD TZ TG TN UG ZM ZW EH].freeze
|
|
15
|
+
|
|
16
|
+
SERVER_DOWN = 'Server overwhelmed. Please try again in a moment.'
|
|
13
17
|
|
|
14
18
|
class << self
|
|
15
19
|
def eu_aggregate
|
|
16
|
-
|
|
20
|
+
eu_proc = proc do |data|
|
|
21
|
+
Kovid::Tablelize.eu_aggregate(data)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
aggregator(EU_ISOS, eu_proc)
|
|
25
|
+
end
|
|
17
26
|
|
|
18
|
-
|
|
19
|
-
|
|
27
|
+
def europe_aggregate
|
|
28
|
+
europe_proc = proc do |data|
|
|
29
|
+
Kovid::Tablelize.europe_aggregate(data)
|
|
20
30
|
end
|
|
21
31
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
left ||= 0
|
|
25
|
-
right ||= 0
|
|
32
|
+
aggregator(EUROPE_ISOS, europe_proc)
|
|
33
|
+
end
|
|
26
34
|
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
def africa_aggregate
|
|
36
|
+
africa_proc = proc do |data|
|
|
37
|
+
Kovid::Tablelize.africa_aggregate(data)
|
|
38
|
+
end
|
|
29
39
|
|
|
30
|
-
|
|
31
|
-
rescue JSON::ParserError
|
|
32
|
-
puts 'Server overwhelmed. Try again in a moment.'
|
|
40
|
+
aggregator(AFRICA_ISOS, africa_proc)
|
|
33
41
|
end
|
|
34
42
|
|
|
35
43
|
def by_country(country_name)
|
|
@@ -41,7 +49,7 @@ module Kovid
|
|
|
41
49
|
Kovid::Tablelize.country_table(response)
|
|
42
50
|
end
|
|
43
51
|
rescue JSON::ParserError
|
|
44
|
-
puts
|
|
52
|
+
puts SERVER_DOWN
|
|
45
53
|
end
|
|
46
54
|
|
|
47
55
|
def by_country_full(country_name)
|
|
@@ -53,7 +61,7 @@ module Kovid
|
|
|
53
61
|
Kovid::Tablelize.full_country_table(response)
|
|
54
62
|
end
|
|
55
63
|
rescue JSON::ParserError
|
|
56
|
-
puts
|
|
64
|
+
puts SERVER_DOWN
|
|
57
65
|
end
|
|
58
66
|
|
|
59
67
|
def state(state)
|
|
@@ -61,7 +69,7 @@ module Kovid
|
|
|
61
69
|
|
|
62
70
|
Kovid::Tablelize.full_state_table(response)
|
|
63
71
|
rescue JSON::ParserError
|
|
64
|
-
puts
|
|
72
|
+
puts SERVER_DOWN
|
|
65
73
|
end
|
|
66
74
|
|
|
67
75
|
def states(list)
|
|
@@ -69,38 +77,49 @@ module Kovid
|
|
|
69
77
|
|
|
70
78
|
Kovid::Tablelize.compare_us_states(array)
|
|
71
79
|
rescue JSON::ParserError
|
|
72
|
-
puts
|
|
80
|
+
puts SERVER_DOWN
|
|
73
81
|
end
|
|
74
82
|
|
|
75
83
|
def by_country_comparison(list)
|
|
76
84
|
array = fetch_countries(list)
|
|
77
85
|
Kovid::Tablelize.compare_countries_table(array)
|
|
78
86
|
rescue JSON::ParserError
|
|
79
|
-
puts
|
|
87
|
+
puts SERVER_DOWN
|
|
80
88
|
end
|
|
81
89
|
|
|
82
90
|
def by_country_comparison_full(list)
|
|
83
91
|
array = fetch_countries(list)
|
|
84
92
|
Kovid::Tablelize.compare_countries_table_full(array)
|
|
85
93
|
rescue JSON::ParserError
|
|
86
|
-
puts
|
|
94
|
+
puts SERVER_DOWN
|
|
87
95
|
end
|
|
88
96
|
|
|
89
97
|
def cases
|
|
90
|
-
response
|
|
98
|
+
response = JSON.parse(Typhoeus.get(UriBuilder.new('/all').url, cache_ttl: 900).response_body)
|
|
91
99
|
|
|
92
100
|
Kovid::Tablelize.cases(response)
|
|
93
101
|
rescue JSON::ParserError
|
|
94
|
-
puts
|
|
102
|
+
puts SERVER_DOWN
|
|
95
103
|
end
|
|
96
104
|
|
|
97
105
|
def history(country, last)
|
|
98
106
|
history_path = UriBuilder.new('/v2/historical').url
|
|
99
|
-
response
|
|
107
|
+
response = JSON.parse(Typhoeus.get(history_path + "/#{country}", cache_ttl: 900).response_body)
|
|
100
108
|
|
|
101
109
|
Kovid::Tablelize.history(response, last)
|
|
102
110
|
rescue JSON::ParserError
|
|
103
|
-
puts
|
|
111
|
+
puts SERVER_DOWN
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def histogram(country, date)
|
|
115
|
+
history_path = UriBuilder.new('/v2/historical').url
|
|
116
|
+
response = JSON.parse(Typhoeus.get(history_path + "/#{country}", cache_ttl: 900).response_body)
|
|
117
|
+
|
|
118
|
+
Kovid::Tablelize.histogram(response, date)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def capitalize_words(string)
|
|
122
|
+
string.split.map(&:capitalize).join(' ')
|
|
104
123
|
end
|
|
105
124
|
|
|
106
125
|
private
|
|
@@ -140,8 +159,25 @@ module Kovid
|
|
|
140
159
|
states_array.select { |state_name| state_name['state'] == capitalize_words(state) }.first
|
|
141
160
|
end
|
|
142
161
|
|
|
143
|
-
def
|
|
144
|
-
|
|
162
|
+
def aggregator(isos, meth)
|
|
163
|
+
countries_array = JSON.parse(Typhoeus.get(UriBuilder.new('/countries').url, cache_ttl: 900).response_body)
|
|
164
|
+
|
|
165
|
+
country_array = countries_array.select do |hash|
|
|
166
|
+
isos.include?(hash['countryInfo']['iso2'])
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
head, *tail = country_array
|
|
170
|
+
data = head.merge(*tail) do |key, left, right|
|
|
171
|
+
left ||= 0
|
|
172
|
+
right ||= 0
|
|
173
|
+
|
|
174
|
+
left + right unless %w[country countryInfo].include?(key)
|
|
175
|
+
end.compact
|
|
176
|
+
|
|
177
|
+
# Kovid::Tablelize.eu_aggregate(data)
|
|
178
|
+
meth.call(data)
|
|
179
|
+
rescue JSON::ParserError
|
|
180
|
+
puts SERVER_DOWN
|
|
145
181
|
end
|
|
146
182
|
end
|
|
147
183
|
end
|
data/lib/kovid/tablelize.rb
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
require 'terminal-table'
|
|
4
4
|
require 'date'
|
|
5
5
|
require_relative 'painter'
|
|
6
|
+
require 'ascii_charts'
|
|
6
7
|
|
|
7
8
|
module Kovid
|
|
8
9
|
class Tablelize
|
|
@@ -27,7 +28,7 @@ module Kovid
|
|
|
27
28
|
'Deaths'.paint_red
|
|
28
29
|
].freeze
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
CONTINENTAL_AGGREGATE_HEADINGS = [
|
|
31
32
|
'Cases'.paint_white,
|
|
32
33
|
'Cases Today'.paint_white,
|
|
33
34
|
'Deaths'.paint_red,
|
|
@@ -37,6 +38,26 @@ module Kovid
|
|
|
37
38
|
'Critical'.paint_red
|
|
38
39
|
].freeze
|
|
39
40
|
|
|
41
|
+
COMPARE_COUNTRY_TABLE_FULL = [
|
|
42
|
+
'Country'.paint_white,
|
|
43
|
+
'Cases'.paint_white,
|
|
44
|
+
'Deaths'.paint_red,
|
|
45
|
+
'Recovered'.paint_green,
|
|
46
|
+
'Cases Today'.paint_white,
|
|
47
|
+
'Deaths Today'.paint_red,
|
|
48
|
+
'Critical'.paint_yellow,
|
|
49
|
+
'Cases/Million'.paint_white
|
|
50
|
+
].freeze
|
|
51
|
+
|
|
52
|
+
COMPARE_COUNTRIES_TABLE_HEADINGS = [
|
|
53
|
+
'Country'.paint_white,
|
|
54
|
+
'Cases'.paint_white,
|
|
55
|
+
'Cases Today'.paint_white,
|
|
56
|
+
'Deaths'.paint_red,
|
|
57
|
+
'Deaths Today'.paint_red,
|
|
58
|
+
'Recovered'.paint_green
|
|
59
|
+
].freeze
|
|
60
|
+
|
|
40
61
|
FOOTER_LINE = ['------------', '------------', '------------'].freeze
|
|
41
62
|
COUNTRY_LETTERS = 'A'.upto('Z').with_index(127_462).to_h.freeze
|
|
42
63
|
|
|
@@ -44,9 +65,9 @@ module Kovid
|
|
|
44
65
|
headings = CASES_DEATHS_RECOVERED_CTODAY_DTODAY
|
|
45
66
|
rows = [
|
|
46
67
|
[
|
|
47
|
-
data['cases'],
|
|
48
|
-
data['deaths'],
|
|
49
|
-
data['recovered'],
|
|
68
|
+
comma_delimit(data['cases']),
|
|
69
|
+
comma_delimit(data['deaths']),
|
|
70
|
+
comma_delimit(data['recovered']),
|
|
50
71
|
check_if_positve(data['todayCases']),
|
|
51
72
|
check_if_positve(data['todayDeaths'])
|
|
52
73
|
]
|
|
@@ -57,8 +78,6 @@ module Kovid
|
|
|
57
78
|
else
|
|
58
79
|
Terminal::Table.new(title: data['country'].upcase, headings: headings, rows: rows)
|
|
59
80
|
end
|
|
60
|
-
# TODO: Rafactor this
|
|
61
|
-
# TODO: Fix emoji
|
|
62
81
|
end
|
|
63
82
|
|
|
64
83
|
def full_country_table(data)
|
|
@@ -111,59 +130,42 @@ module Kovid
|
|
|
111
130
|
end
|
|
112
131
|
|
|
113
132
|
def compare_countries_table(data)
|
|
114
|
-
headings = [
|
|
115
|
-
'Country'.paint_white,
|
|
116
|
-
'Cases'.paint_white,
|
|
117
|
-
'Deaths'.paint_red,
|
|
118
|
-
'Recovered'.paint_green,
|
|
119
|
-
'Cases Today'.paint_white,
|
|
120
|
-
'Deaths Today'.paint_red
|
|
121
|
-
]
|
|
122
|
-
|
|
123
133
|
rows = []
|
|
124
134
|
|
|
125
135
|
data.each do |country|
|
|
126
|
-
|
|
127
|
-
country['country'].upcase,
|
|
136
|
+
base_rows = [
|
|
128
137
|
comma_delimit(country['cases']),
|
|
129
|
-
comma_delimit(country['deaths']),
|
|
130
|
-
comma_delimit(country['recovered']),
|
|
131
138
|
check_if_positve(country['todayCases']),
|
|
132
|
-
|
|
139
|
+
comma_delimit(country['deaths']),
|
|
140
|
+
check_if_positve(country['todayDeaths']),
|
|
141
|
+
comma_delimit(country['recovered'])
|
|
133
142
|
]
|
|
143
|
+
|
|
144
|
+
rows << if iso = country['countryInfo']['iso2']
|
|
145
|
+
base_rows.unshift("#{country_emoji(iso)} #{country['country'].upcase}")
|
|
146
|
+
else
|
|
147
|
+
base_rows.unshift(country['country'].upcase.to_s)
|
|
148
|
+
end
|
|
134
149
|
end
|
|
135
150
|
|
|
136
|
-
Terminal::Table.new(headings:
|
|
151
|
+
Terminal::Table.new(headings: COMPARE_COUNTRIES_TABLE_HEADINGS, rows: rows)
|
|
137
152
|
end
|
|
138
153
|
|
|
139
154
|
def compare_countries_table_full(data)
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
rows = []
|
|
152
|
-
|
|
153
|
-
data.each do |country|
|
|
154
|
-
rows << [
|
|
155
|
-
country['country'],
|
|
156
|
-
comma_delimit(country['cases']),
|
|
157
|
-
comma_delimit(country['deaths']),
|
|
158
|
-
comma_delimit(country['recovered']),
|
|
159
|
-
check_if_positve(country['todayCases']),
|
|
160
|
-
check_if_positve(country['todayDeaths']),
|
|
161
|
-
comma_delimit(country['critical']),
|
|
162
|
-
comma_delimit(country['casesPerOneMillion'])
|
|
155
|
+
rows = data.map do |country|
|
|
156
|
+
[
|
|
157
|
+
country.fetch('country'),
|
|
158
|
+
comma_delimit(country.fetch('cases')),
|
|
159
|
+
comma_delimit(country.fetch('deaths')),
|
|
160
|
+
comma_delimit(country.fetch('recovered')),
|
|
161
|
+
check_if_positve(country.fetch('todayCases')),
|
|
162
|
+
check_if_positve(country.fetch('todayDeaths')),
|
|
163
|
+
comma_delimit(country.fetch('critical')),
|
|
164
|
+
comma_delimit(country.fetch('casesPerOneMillion'))
|
|
163
165
|
]
|
|
164
166
|
end
|
|
165
167
|
|
|
166
|
-
Terminal::Table.new(headings:
|
|
168
|
+
Terminal::Table.new(headings: COMPARE_COUNTRY_TABLE_FULL, rows: rows)
|
|
167
169
|
end
|
|
168
170
|
|
|
169
171
|
def cases(cases)
|
|
@@ -219,23 +221,65 @@ module Kovid
|
|
|
219
221
|
)
|
|
220
222
|
end
|
|
221
223
|
|
|
224
|
+
def histogram(country, date_string)
|
|
225
|
+
@date = date_string.split('.')
|
|
226
|
+
|
|
227
|
+
if @date.last.to_i != 20
|
|
228
|
+
Kovid.info_table('Only 2020 histgrams are available.')
|
|
229
|
+
return
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
# From dates where number of !cases.zero?
|
|
233
|
+
positive_cases_figures = country['timeline']['cases'].values.reject!(&:zero?)
|
|
234
|
+
dates = country['timeline']['cases'].reject { |_k, v| v.zero? }.keys
|
|
235
|
+
data = []
|
|
236
|
+
|
|
237
|
+
# Improve this later, like everything else.
|
|
238
|
+
# Returns array of days.to_i from the date param
|
|
239
|
+
dates = dates.map do |date|
|
|
240
|
+
date.split('/')
|
|
241
|
+
end.select do |date|
|
|
242
|
+
date.last == @date.last
|
|
243
|
+
end.select do |date|
|
|
244
|
+
date.first == @date.first
|
|
245
|
+
end.map do |array|
|
|
246
|
+
array[1]
|
|
247
|
+
end.map(&:to_i).last(positive_cases_figures.count)
|
|
248
|
+
|
|
249
|
+
# Arranges dates and figures in [x,y] for histogram
|
|
250
|
+
# With x being day, y being number of cases
|
|
251
|
+
if dates.empty?
|
|
252
|
+
if @date.first.to_i > Time.now.month
|
|
253
|
+
Kovid.info_table('Seriously...??! π')
|
|
254
|
+
else
|
|
255
|
+
Kovid.info_table('No infections for this month.')
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
else
|
|
259
|
+
dates.each_with_index do |val, index|
|
|
260
|
+
data << [val, positive_cases_figures[index]]
|
|
261
|
+
end
|
|
262
|
+
y_range = AsciiCharts::Cartesian.new(data, bar: true, hide_zero: true).y_range
|
|
263
|
+
|
|
264
|
+
last_two_y = y_range.last 2
|
|
265
|
+
y_interval = last_two_y.last - last_two_y.first
|
|
266
|
+
|
|
267
|
+
scale("Scale on Y: #{y_interval}:#{(y_interval / last_two_y.last.to_f * positive_cases_figures.last).round(2) / y_interval}")
|
|
268
|
+
|
|
269
|
+
AsciiCharts::Cartesian.new(data, bar: true, hide_zero: true).draw
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
|
|
222
273
|
def eu_aggregate(eu_data)
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
comma_delimit(eu_data['cases']),
|
|
226
|
-
check_if_positve(eu_data['todayCases']),
|
|
227
|
-
comma_delimit(eu_data['deaths']),
|
|
228
|
-
check_if_positve(eu_data['todayDeaths']),
|
|
229
|
-
comma_delimit(eu_data['recovered']),
|
|
230
|
-
comma_delimit(eu_data['active']),
|
|
231
|
-
comma_delimit(eu_data['critical'])
|
|
232
|
-
]
|
|
274
|
+
aggregated_table(eu_data, 'The EU', Kovid::Request::EU_ISOS, 'πͺπΊ')
|
|
275
|
+
end
|
|
233
276
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
277
|
+
def europe_aggregate(europe_data)
|
|
278
|
+
aggregated_table(europe_data, 'Europe', Kovid::Request::EUROPE_ISOS, "π°")
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def africa_aggregate(africa_data)
|
|
282
|
+
aggregated_table(africa_data, 'Africa', Kovid::Request::AFRICA_ISOS, 'π')
|
|
239
283
|
end
|
|
240
284
|
|
|
241
285
|
private
|
|
@@ -260,6 +304,36 @@ module Kovid
|
|
|
260
304
|
data.map! { |number| comma_delimit(number) }
|
|
261
305
|
end
|
|
262
306
|
end
|
|
307
|
+
|
|
308
|
+
def scale(msg)
|
|
309
|
+
rows = [[msg]]
|
|
310
|
+
puts Terminal::Table.new title: 'SCALE', rows: rows
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
def aggregated_table(collated_data, continent, iso, emoji)
|
|
314
|
+
title = if emoji.codepoints.size > 1
|
|
315
|
+
emoji + 8203.chr(Encoding::UTF_8) + " Aggregated Data of #{continent} (#{iso.size} States)".upcase
|
|
316
|
+
else
|
|
317
|
+
emoji + " Aggregated Data of #{continent} (#{iso.size} States)".upcase
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
rows = []
|
|
321
|
+
rows << [
|
|
322
|
+
comma_delimit(collated_data['cases']),
|
|
323
|
+
check_if_positve(collated_data['todayCases']),
|
|
324
|
+
comma_delimit(collated_data['deaths']),
|
|
325
|
+
check_if_positve(collated_data['todayDeaths']),
|
|
326
|
+
comma_delimit(collated_data['recovered']),
|
|
327
|
+
comma_delimit(collated_data['active']),
|
|
328
|
+
comma_delimit(collated_data['critical'])
|
|
329
|
+
]
|
|
330
|
+
|
|
331
|
+
Terminal::Table.new(
|
|
332
|
+
title: title,
|
|
333
|
+
headings: CONTINENTAL_AGGREGATE_HEADINGS,
|
|
334
|
+
rows: rows
|
|
335
|
+
)
|
|
336
|
+
end
|
|
263
337
|
end
|
|
264
338
|
end
|
|
265
339
|
end
|
data/lib/kovid/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kovid
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.4.
|
|
4
|
+
version: 0.4.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Emmanuel Hayford
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-03-
|
|
11
|
+
date: 2020-03-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: thor
|
|
@@ -66,6 +66,20 @@ dependencies:
|
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '3.0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: ascii_charts
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: 0.9.1
|
|
76
|
+
type: :runtime
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: 0.9.1
|
|
69
83
|
- !ruby/object:Gem::Dependency
|
|
70
84
|
name: simplecov
|
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -106,6 +120,7 @@ files:
|
|
|
106
120
|
- lib/kovid.rb
|
|
107
121
|
- lib/kovid/cache.rb
|
|
108
122
|
- lib/kovid/cli.rb
|
|
123
|
+
- lib/kovid/helpers.rb
|
|
109
124
|
- lib/kovid/painter.rb
|
|
110
125
|
- lib/kovid/request.rb
|
|
111
126
|
- lib/kovid/tablelize.rb
|