kovid 0.4.2 β†’ 0.4.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e95d98dc4481abd6914bab36e8eb3313acfc6332bb3f94bb53779bd99779c67
4
- data.tar.gz: 05c94ef16032c1dc71d96d216b45b6df0f7c7627926dd6d6ca093fa17779d8f0
3
+ metadata.gz: cb6de6563f95f22115b3e04efc65267d59fa949a5e68dee22063c9a58438ebc0
4
+ data.tar.gz: 87e2bf23684c8ca538fd68ae23d77e7daeff2b3fdba7a249442628e671a69675
5
5
  SHA512:
6
- metadata.gz: b55936c92247fe5b8bb46b5638e33ee44b79ffc114f10706dd660812be61b346dce6ce9482c28b70a8277cfbce9346623e7d369f0ce78018708bd50e4e185ac1
7
- data.tar.gz: 42219acd66bb2f467173b3c9e75b946bcbc26283ce7c662fa93d9a74eec965d33a0dd66cbf0ca6f7c926dd87467315d4241f464ddcbb57a050ac34b9aad7652a
6
+ metadata.gz: ff8f7e1afca67e4218d7d4491d86a34bc54cdcd49993aa515aaa0186d53a73f882ab2e6eabfcda0747ac0a0e5baefe95773982e6b786aeedb77f70f7ec696183
7
+ data.tar.gz: fcb797d8367ddf05ef080f3272522fd2b52761fab6a1e3b02ba8367230ff9eeb05b7f0bcbe03887a3cb6d6fdc6c10f7d7f94343a5baa329f2ea9a2956cf335fa
data/Gemfile CHANGED
@@ -5,3 +5,5 @@ gemspec
5
5
 
6
6
  gem "rake", "~> 12.0"
7
7
  gem "rspec", "~> 3.0"
8
+
9
+
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kovid (0.4.1)
4
+ kovid (0.4.6)
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
+ [![Gem Version](https://badge.fury.io/rb/kovid.svg)](https://badge.fury.io/rb/kovid)
2
+ [![Open Source Helpers](https://www.codetriage.com/siaw23/kovid/badges/users.svg)](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,11 +29,26 @@ 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 (55 states):
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:
31
45
  * `kovid eu`.
32
46
 
47
+ 🌎🌎🌎
48
+
49
+ You can fetch aggregated South America (all 15 countries combined) data:
50
+ * `kovid sa`.
51
+
33
52
  πŸ‡ΊπŸ‡ΈπŸ‡ΊπŸ‡ΈπŸ‡ΊπŸ‡Έ
34
53
 
35
54
  You can fetch US state-specific data:
@@ -37,10 +56,8 @@ You can fetch US state-specific data:
37
56
 
38
57
  ##### πŸ”œ Upcoming Fetch Features πŸ‘·β€β™€οΈ
39
58
 
40
- * `kovid europe` Aggrated stats on Europe
41
- * `kovid africa` Aggrated stats on Africa
42
59
  * `kovid asia` Aggrated stats on Asia
43
- * `kovid south_america` Aggrated stats on South America
60
+
44
61
  ___
45
62
  😷 **Comparing**
46
63
  * `kovid compare FOO BAR` (sorts by cases DESC).
@@ -58,28 +75,32 @@ ___
58
75
  * `kovid history COUNTRY N` (history in the last N days).
59
76
  ___
60
77
  😷 **Total figures**
61
- * `kovid cases` (summary of reported incidents globally).
78
+ * `kovid world` (summary of reported incidents globally).
62
79
 
63
80
  **NOTE:** If you find it irritating to have to type `kovid state STATE`, `covid state STATE` works as well.
64
81
 
82
+ #### Histogram (Experimental) πŸ§ͺ
83
+
84
+ `kovid histogram COUNTRY M.YY` (draws a histogram of cases in the given month `M` and years `YY`)
85
+
65
86
  #### Commands Details
66
87
  To fetch basic data on a country run:
67
88
 
68
89
  `kovid check ghana`. If the location contains spaces: `kovid check "Diamond Princess"`
69
90
 
70
- ![kovid](https://i.gyazo.com/ee88b41c05da3be0295dd3a158e7ba70.png "Covid data.")
91
+ ![kovid](https://i.gyazo.com/1d86ba2cd05f215b16c8d1fd13085c6e.png "Covid data.")
71
92
 
72
93
  For full table info on a country:
73
94
 
74
95
  `kovid check italy -f` OR `kovid check italy --full`
75
96
 
76
- ![kovid](https://i.gyazo.com/7e5afce548d8a01b9bdf3f8bdb529cd1.png "Covid data.")
97
+ ![kovid](https://i.gyazo.com/1d9720b9fa2c08fb801f5361fba359bb.png "Covid data.")
77
98
 
78
99
  To compare country stats:
79
100
 
80
- `kovid compare germany poland`
101
+ `kovid compare germany poland spain`
81
102
 
82
- ![kovid](https://i.gyazo.com/876b19988da4cd7b375cde3e23376ba7.png "Covid data.")
103
+ ![kovid](https://i.gyazo.com/4100e845fea6936f5c8d21d78617110d.png "Covid data.")
83
104
 
84
105
  To compare a countries stats with a full table:
85
106
 
@@ -99,6 +120,12 @@ To fetch EU data run:
99
120
 
100
121
  ![kovid](https://i.gyazo.com/0a78afae2a5b9d2beb9f2c61dc1d3ac7.png "Covid data.")
101
122
 
123
+ To fetch data on Africa:
124
+
125
+ `kovid africa`
126
+
127
+ ![kovid](https://i.gyazo.com/bc45fa53e2ff688e8a1f759f1bd1b972.png "Covid data.")
128
+
102
129
  You can check historical statistics by running
103
130
 
104
131
  `kovid history italy 7` eg:
@@ -107,11 +134,18 @@ You can check historical statistics by running
107
134
 
108
135
  To check for total figures:
109
136
 
110
- `kovid cases`
137
+ `kovid world`
111
138
 
112
139
  ![kovid](https://i.gyazo.com/e01f4769a2b9e31ce50cec212e55810c.png "Covid data.")
113
140
 
114
- ## Information Source
141
+ ## πŸ‘©πŸΎβ€πŸ”¬ Experimental Feature
142
+
143
+ `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.
144
+
145
+ ![kovid](https://i.gyazo.com/35833cba37be8ca10830fad066b85bb3.png "Covid data.")
146
+
147
+
148
+ ## Data Source
115
149
  > [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
150
 
117
151
 
@@ -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
 
@@ -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,17 @@ 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
23
+
24
+ def south_america_aggregate
25
+ Kovid::Request.south_america_aggregate
26
+ end
14
27
 
15
28
  def country(name)
16
29
  Kovid::Request.by_country(name)
@@ -24,8 +37,8 @@ module Kovid
24
37
  Kovid::Request.state(state)
25
38
  end
26
39
 
27
- def states(*_states)
28
- Kovid::Request.states(state)
40
+ def states(*states)
41
+ Kovid::Request.states(states)
29
42
  end
30
43
 
31
44
  def country_comparison(names_array)
@@ -43,4 +56,8 @@ module Kovid
43
56
  def history(country, last)
44
57
  Kovid::Request.history(country, last)
45
58
  end
59
+
60
+ def histogram(country, date)
61
+ Kovid::Request.histogram(country, date)
62
+ end
46
63
  end
@@ -37,8 +37,8 @@ module Kovid
37
37
  data_source
38
38
  end
39
39
 
40
- desc 'cases', 'Returns total number of cases, deaths and recoveries.'
41
- def cases
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,39 @@ 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 'sa', 'Returns aggregated data on South America.'
75
+ def sa
76
+ puts Kovid.south_america_aggregate
77
+ data_source
78
+ end
79
+
80
+ desc 'version', 'Returns version of kovid'
81
+ def version
82
+ puts Kovid::VERSION
83
+ end
84
+
85
+ desc 'histogram', 'Returns a histogram of incidents.'
86
+ def histogram(country, date = nil)
87
+ if date.nil?
88
+ Kovid.info_table("Please add a month and year in the form 'M.YY'")
89
+ else
90
+ puts Kovid.histogram(country, date)
91
+ data_source
92
+ end
93
+ end
94
+
62
95
  private
63
96
 
64
97
  def fetch_country_stats(country)
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'terminal-table'
4
+ module Kovid
5
+ module_function
6
+
7
+ def info_table(message)
8
+ rows = [[message.to_s]]
9
+ puts Terminal::Table.new title: '❗️', rows: rows
10
+ end
11
+ end
@@ -10,26 +10,43 @@ 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
+ SOUTH_AMERICA_ISOS = ["AR" "BO", "BV", "BR", "CL", "CO", "EC", "FK", "GF", "GY", "PY", "PE", "GS", "SR", "UY", "VE"]
16
+
17
+ SERVER_DOWN = 'Server overwhelmed. Please try again in a moment.'
13
18
 
14
19
  class << self
15
20
  def eu_aggregate
16
- countries_array = JSON.parse(Typhoeus.get(UriBuilder.new('/countries').url, cache_ttl: 900).response_body)
21
+ eu_proc = proc do |data|
22
+ Kovid::Tablelize.eu_aggregate(data)
23
+ end
24
+
25
+ aggregator(EU_ISOS, eu_proc)
26
+ end
17
27
 
18
- eu_array = countries_array.select do |hash|
19
- EU_ISOS.include?(hash['countryInfo']['iso2'])
28
+ def europe_aggregate
29
+ europe_proc = proc do |data|
30
+ Kovid::Tablelize.europe_aggregate(data)
20
31
  end
21
32
 
22
- head, *tail = eu_array
23
- eu_data = head.merge(*tail) do |key, left, right|
24
- left ||= 0
25
- right ||= 0
33
+ aggregator(EUROPE_ISOS, europe_proc)
34
+ end
26
35
 
27
- left + right unless %w[country countryInfo].include?(key)
28
- end.compact
36
+ def africa_aggregate
37
+ africa_proc = proc do |data|
38
+ Kovid::Tablelize.africa_aggregate(data)
39
+ end
29
40
 
30
- Kovid::Tablelize.eu_aggregate(eu_data)
31
- rescue JSON::ParserError
32
- puts 'Server overwhelmed. Try again in a moment.'
41
+ aggregator(AFRICA_ISOS, africa_proc)
42
+ end
43
+
44
+ def south_america_aggregate
45
+ south_america_proc = proc do |data|
46
+ Kovid::Tablelize.south_america_aggregate(data)
47
+ end
48
+
49
+ aggregator(SOUTH_AMERICA_ISOS, south_america_proc)
33
50
  end
34
51
 
35
52
  def by_country(country_name)
@@ -41,7 +58,7 @@ module Kovid
41
58
  Kovid::Tablelize.country_table(response)
42
59
  end
43
60
  rescue JSON::ParserError
44
- puts 'Server overwhelmed. Try again in a moment.'
61
+ puts SERVER_DOWN
45
62
  end
46
63
 
47
64
  def by_country_full(country_name)
@@ -53,7 +70,7 @@ module Kovid
53
70
  Kovid::Tablelize.full_country_table(response)
54
71
  end
55
72
  rescue JSON::ParserError
56
- puts 'Server overwhelmed. Try again in a moment.'
73
+ puts SERVER_DOWN
57
74
  end
58
75
 
59
76
  def state(state)
@@ -61,7 +78,7 @@ module Kovid
61
78
 
62
79
  Kovid::Tablelize.full_state_table(response)
63
80
  rescue JSON::ParserError
64
- puts 'Server overwhelmed. Try again in a moment.'
81
+ puts SERVER_DOWN
65
82
  end
66
83
 
67
84
  def states(list)
@@ -69,38 +86,49 @@ module Kovid
69
86
 
70
87
  Kovid::Tablelize.compare_us_states(array)
71
88
  rescue JSON::ParserError
72
- puts 'Server overwhelmed. Try again in a moment.'
89
+ puts SERVER_DOWN
73
90
  end
74
91
 
75
92
  def by_country_comparison(list)
76
93
  array = fetch_countries(list)
77
94
  Kovid::Tablelize.compare_countries_table(array)
78
95
  rescue JSON::ParserError
79
- puts 'Server overwhelmed. Try again in a moment.'
96
+ puts SERVER_DOWN
80
97
  end
81
98
 
82
99
  def by_country_comparison_full(list)
83
100
  array = fetch_countries(list)
84
101
  Kovid::Tablelize.compare_countries_table_full(array)
85
102
  rescue JSON::ParserError
86
- puts 'Server overwhelmed. Try again in a moment.'
103
+ puts SERVER_DOWN
87
104
  end
88
105
 
89
106
  def cases
90
- response ||= JSON.parse(Typhoeus.get(UriBuilder.new('/all').url, cache_ttl: 900).response_body)
107
+ response = JSON.parse(Typhoeus.get(UriBuilder.new('/all').url, cache_ttl: 900).response_body)
91
108
 
92
109
  Kovid::Tablelize.cases(response)
93
110
  rescue JSON::ParserError
94
- puts 'Server overwhelmed. Try again in a moment.'
111
+ puts SERVER_DOWN
95
112
  end
96
113
 
97
114
  def history(country, last)
98
115
  history_path = UriBuilder.new('/v2/historical').url
99
- response ||= JSON.parse(Typhoeus.get(history_path + "/#{country}", cache_ttl: 900).response_body)
116
+ response = JSON.parse(Typhoeus.get(history_path + "/#{country}", cache_ttl: 900).response_body)
100
117
 
101
118
  Kovid::Tablelize.history(response, last)
102
119
  rescue JSON::ParserError
103
- puts 'Server overwhelmed. Try again in a moment.'
120
+ puts SERVER_DOWN
121
+ end
122
+
123
+ def histogram(country, date)
124
+ history_path = UriBuilder.new('/v2/historical').url
125
+ response = JSON.parse(Typhoeus.get(history_path + "/#{country}", cache_ttl: 900).response_body)
126
+
127
+ Kovid::Tablelize.histogram(response, date)
128
+ end
129
+
130
+ def capitalize_words(string)
131
+ string.split.map(&:capitalize).join(' ')
104
132
  end
105
133
 
106
134
  private
@@ -140,8 +168,24 @@ module Kovid
140
168
  states_array.select { |state_name| state_name['state'] == capitalize_words(state) }.first
141
169
  end
142
170
 
143
- def capitalize_words(string)
144
- string.split.map(&:capitalize).join(' ')
171
+ def aggregator(isos, meth)
172
+ countries_array = JSON.parse(Typhoeus.get(UriBuilder.new('/countries').url, cache_ttl: 900).response_body)
173
+
174
+ country_array = countries_array.select do |hash|
175
+ isos.include?(hash['countryInfo']['iso2'])
176
+ end
177
+
178
+ head, *tail = country_array
179
+ data = head.merge(*tail) do |key, left, right|
180
+ left ||= 0
181
+ right ||= 0
182
+
183
+ left + right unless %w[country countryInfo].include?(key)
184
+ end.compact
185
+
186
+ meth === data
187
+ rescue JSON::ParserError
188
+ puts SERVER_DOWN
145
189
  end
146
190
  end
147
191
  end
@@ -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
- EU_AGGREGATE_HEADINGS = [
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
 
@@ -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
- rows << [
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
- check_if_positve(country['todayDeaths'])
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: headings, rows: rows)
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
- headings = [
141
- 'Country'.paint_white,
142
- 'Cases'.paint_white,
143
- 'Deaths'.paint_red,
144
- 'Recovered'.paint_green,
145
- 'Cases Today'.paint_white,
146
- 'Deaths Today'.paint_red,
147
- 'Critical'.paint_yellow,
148
- 'Cases/Million'.paint_white
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: headings, rows: rows)
168
+ Terminal::Table.new(headings: COMPARE_COUNTRY_TABLE_FULL, rows: rows)
167
169
  end
168
170
 
169
171
  def cases(cases)
@@ -219,23 +221,69 @@ 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
- rows = []
224
- rows << [
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
- Terminal::Table.new(
235
- title: "πŸ‡ͺπŸ‡Ί" + 8203.chr(Encoding::UTF_8) + " Aggregated EU (27 States) Data".upcase,
236
- headings: EU_AGGREGATE_HEADINGS,
237
- rows: rows
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, '🌍')
283
+ end
284
+
285
+ def south_america_aggregate(south_america_data)
286
+ aggregated_table(south_america_data, 'South America', Kovid::Request::SOUTH_AMERICA_ISOS, "🌎")
239
287
  end
240
288
 
241
289
  private
@@ -260,6 +308,36 @@ module Kovid
260
308
  data.map! { |number| comma_delimit(number) }
261
309
  end
262
310
  end
311
+
312
+ def scale(msg)
313
+ rows = [[msg]]
314
+ puts Terminal::Table.new title: 'SCALE', rows: rows
315
+ end
316
+
317
+ def aggregated_table(collated_data, continent, iso, emoji)
318
+ title = if emoji.codepoints.size > 1
319
+ emoji + 8203.chr(Encoding::UTF_8) + " Aggregated Data on #{continent} (#{iso.size} States)".upcase
320
+ else
321
+ emoji + " Aggregated Data on #{continent} (#{iso.size} States)".upcase
322
+ end
323
+
324
+ rows = []
325
+ rows << [
326
+ comma_delimit(collated_data['cases']),
327
+ check_if_positve(collated_data['todayCases']),
328
+ comma_delimit(collated_data['deaths']),
329
+ check_if_positve(collated_data['todayDeaths']),
330
+ comma_delimit(collated_data['recovered']),
331
+ comma_delimit(collated_data['active']),
332
+ comma_delimit(collated_data['critical'])
333
+ ]
334
+
335
+ Terminal::Table.new(
336
+ title: title,
337
+ headings: CONTINENTAL_AGGREGATE_HEADINGS,
338
+ rows: rows
339
+ )
340
+ end
263
341
  end
264
342
  end
265
343
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kovid
4
- VERSION = '0.4.2'
4
+ VERSION = '0.4.7'
5
5
  end
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.2
4
+ version: 0.4.7
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-27 00:00:00.000000000 Z
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