kovid 0.6.5 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 620426fc962e25e54afb7805dcf98131c1e58865ff477ffb9102e0d2ca90217d
4
- data.tar.gz: 59daeb1837a6afaa795bed6479fde7c20c696a9f21a6a0f444ed1f63150e9ce1
3
+ metadata.gz: 6abc6282e6ec84a393eee2b5383d70f88643d7633f8bd7537c207dae341ead1b
4
+ data.tar.gz: a93e83c437e3b1f740fe7471cca72ad2e83c837d0a637c5fe8c71636bdd545dd
5
5
  SHA512:
6
- metadata.gz: 4741653673978adcaeadf3b22bfa8b2db1b3bae467ffca9fbca4c010b1c30b677ebcf6ced77dcda6ae4e90782678bd162f85ac913f70658fce6d7ad4beb05547
7
- data.tar.gz: aac2306ed42a441c9673ad10ea47f2f3bde83a4dcb99de043cd63a3a352af6e4f3b42409e11de72f6a23f9e5630eb343dae5cec327c62f57fbcb5737071f6f15
6
+ metadata.gz: dbc95ba0e85745d9369e15b0e81b6f5d36a7199b1227aaaec56eb57b8aac067750e4e2c71f937a97b333fdf57693547d6f98a09e70d214a5300b5b09cd5eeb25
7
+ data.tar.gz: a2a458068aefa1f001ad85426ef5eba0317ba23a0320fab970eed818a9009186cc966f757c0a4f1b693a85cf668098ffa477acc3587849ed5864dcfc53a3b5fe
@@ -0,0 +1,4 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ AllCops:
4
+ TargetRubyVersion: 2.6
@@ -0,0 +1,59 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2020-04-07 20:38:28 -0300 using RuboCop version 0.67.2.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 2
10
+ Metrics/AbcSize:
11
+ Max: 54
12
+ Exclude:
13
+ - 'lib/kovid/historians.rb'
14
+
15
+ # Offense count: 2
16
+ Metrics/BlockLength:
17
+ Exclude:
18
+ - 'kovid.gemspec'
19
+ - 'spec/kovid_spec.rb'
20
+
21
+ # Offense count: 3
22
+ # Configuration parameters: CountComments.
23
+ Metrics/ClassLength:
24
+ Max: 220
25
+ Exclude:
26
+ - 'lib/kovid/cli.rb'
27
+ - 'lib/kovid/request.rb'
28
+ - 'lib/kovid/tablelize.rb'
29
+
30
+ # Offense count: 2
31
+ # Configuration parameters: CountComments, ExcludedMethods.
32
+ Metrics/MethodLength:
33
+ Max: 44
34
+ Exclude:
35
+ - 'lib/kovid/historians.rb'
36
+
37
+ # Offense count: 1
38
+ Metrics/PerceivedComplexity:
39
+ Max: 8
40
+ Exclude:
41
+ - 'lib/kovid/historians.rb'
42
+
43
+ # Offense count: 1
44
+ Style/CaseEquality:
45
+ Exclude:
46
+ - 'lib/kovid/request.rb'
47
+
48
+ Style/Documentation:
49
+ Exclude:
50
+ - 'spec/**/*'
51
+ - 'test/**/*'
52
+ - 'lib/kovid.rb'
53
+ - 'lib/kovid/helpers.rb'
54
+
55
+ # Offense count: 5
56
+ Style/MultilineBlockChain:
57
+ Exclude:
58
+ - 'lib/kovid/historians.rb'
59
+ - 'lib/kovid/request.rb'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- kovid (0.6.4)
4
+ kovid (0.6.5)
5
5
  ascii_charts (~> 0.9.1)
6
6
  rainbow (~> 3.0)
7
7
  terminal-table (~> 1.8)
data/Rakefile CHANGED
@@ -7,3 +7,4 @@ RSpec::Core::RakeTask.new(:spec)
7
7
 
8
8
  # rubocop:disable Style/HashSyntax
9
9
  task :default => :spec
10
+ # rubocop:enable Style/HashSyntax
@@ -8,8 +8,10 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ['Emmanuel Hayford']
9
9
  spec.email = ['siawmensah@gmail.com']
10
10
 
11
- spec.summary = 'A CLI to fetch and compare the 2019 coronavirus pandemic statistics.'
12
- spec.description = 'A CLI to fetch and compare the 2019 coronavirus pandemic statistics.'
11
+ summary = 'A CLI to fetch and compare the 2019 ' \
12
+ 'coronavirus pandemic statistics.'
13
+ spec.summary = summary
14
+ spec.description = summary
13
15
  spec.homepage = 'https://github.com/siaw23/kovid'
14
16
  spec.license = 'MIT'
15
17
  spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
@@ -29,9 +31,12 @@ Gem::Specification.new do |spec|
29
31
  spec.add_development_dependency 'simplecov', '~> 0.18'
30
32
 
31
33
  # Specify which files should be added to the gem when it is released.
32
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
34
+ # The `git ls-files -z` loads the files in the RubyGem
35
+ # that have been added into git.
33
36
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
34
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
37
+ `git ls-files -z`.split("\x0").reject do |f|
38
+ f.match(%r{^(test|spec|features)/})
39
+ end
35
40
  end
36
41
  spec.bindir = 'exe'
37
42
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kovid
4
+ # Sends info about continents to Tablelize
4
5
  module Aggregators
5
6
  def eu_aggregate(eu_data)
6
7
  aggregated_table(eu_data, 'The EU', Kovid::Request::EU_ISOS, '🇪🇺')
@@ -2,7 +2,10 @@
2
2
 
3
3
  require 'typhoeus'
4
4
 
5
+ # rubocop:disable Style/Documentation
5
6
  module Kovid
7
+ # rubocop:enable Style/Documentation
8
+ # Caches HTTP requests
6
9
  class Cache
7
10
  def initialize
8
11
  @memory = {}
@@ -4,25 +4,33 @@ require 'thor'
4
4
  require 'kovid'
5
5
 
6
6
  module Kovid
7
+ # Describes the commands that can be run by the user
8
+ # Descriptions are returned to STDOUT
7
9
  class CLI < Thor
8
10
  def self.exit_on_failure?
9
11
  true
10
12
  end
11
13
 
12
- desc 'province PROVINCE or province "PROVINCE NAME"', 'Returns reported data on provided province. eg "kovid check "new brunswick".'
14
+ desc 'province PROVINCE or province "PROVINCE NAME"',
15
+ 'Returns reported data on provided province. ' \
16
+ 'eg "kovid check "new brunswick".'
13
17
  method_option :full, aliases: '-p'
14
18
  def province(name)
15
19
  puts Kovid.province(name)
16
20
  data_source
17
21
  end
18
22
 
19
- desc 'provinces PROVINCE PROVINCE', 'Returns full comparison table for the given provinces. Accepts multiple provinces.'
23
+ desc 'provinces PROVINCE PROVINCE',
24
+ 'Returns full comparison table for the given provinces. ' \
25
+ 'Accepts multiple provinces.'
20
26
  def provinces(*names)
21
27
  puts Kovid.provinces(names)
22
28
  data_source
23
29
  end
24
30
 
25
- desc 'check COUNTRY or check "COUNTRY NAME"', 'Returns reported data on provided country. eg: "kovid check "hong kong".'
31
+ desc 'check COUNTRY or check "COUNTRY NAME"',
32
+ 'Returns reported data on provided country. ' \
33
+ 'eg: "kovid check "hong kong".'
26
34
  method_option :full, aliases: '-f'
27
35
  def check(*name)
28
36
  if name.size == 1
@@ -48,7 +56,9 @@ module Kovid
48
56
  data_source
49
57
  end
50
58
 
51
- desc 'states STATE STATE or states --all', 'Returns full comparison table for the given states. Accepts multiple states.'
59
+ desc 'states STATE STATE or states --all',
60
+ 'Returns full comparison table for the given states. ' \
61
+ 'Accepts multiple states.'
52
62
  method_option :all, aliases: '-a'
53
63
  def states(*states)
54
64
  if options[:all]
@@ -67,7 +77,8 @@ module Kovid
67
77
  data_source
68
78
  end
69
79
 
70
- desc 'history COUNTRY or history COUNTRY N', 'Return history of incidents of COUNTRY (in the last N days)'
80
+ desc 'history COUNTRY or history COUNTRY N',
81
+ 'Return history of incidents of COUNTRY (in the last N days)'
71
82
  def history(*params)
72
83
  if params.size == 2
73
84
  puts Kovid.history(params.first, params.last)
@@ -63,6 +63,20 @@ module Kovid
63
63
  'Cases/Million'.paint_white
64
64
  ].freeze
65
65
 
66
+ FULL_PROVINCE_TABLE_HEADINGS = [
67
+ 'Confirmed'.paint_white,
68
+ 'Deaths'.paint_red,
69
+ 'Recovered'.paint_green
70
+ ].freeze
71
+
72
+ FULL_STATE_TABLE_HEADINGS = [
73
+ 'Cases'.paint_white,
74
+ 'Cases Today'.paint_white,
75
+ 'Deaths'.paint_red,
76
+ 'Deaths Today'.paint_red,
77
+ 'Active'.paint_yellow
78
+ ].freeze
79
+
66
80
  COMPARE_STATES_HEADINGS = [
67
81
  'State'.paint_white,
68
82
  'Cases'.paint_white,
@@ -79,7 +93,13 @@ module Kovid
79
93
  'Recovered'.paint_green
80
94
  ].freeze
81
95
 
82
- FOOTER_LINE = ['------------', '------------', '------------', '------------'].freeze
96
+ FOOTER_LINE = [
97
+ '------------',
98
+ '------------',
99
+ '------------',
100
+ '------------'
101
+ ].freeze
102
+
83
103
  COUNTRY_LETTERS = 'A'.upto('Z').with_index(127_462).to_h.freeze
84
104
 
85
105
  RIGHT_ALIGN_COLUMNS = {
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'terminal-table'
4
+
4
5
  module Kovid
5
6
  module_function
6
7
 
@@ -14,4 +15,19 @@ module Kovid
14
15
  date_to_parse = Date.strptime(date, '%m/%d/%y').to_s
15
16
  Date.parse(date_to_parse).strftime('%d %b, %y')
16
17
  end
18
+
19
+ def comma_delimit(number)
20
+ number.to_s.chars.to_a.reverse.each_slice(3).map(&:join).join(',').reverse
21
+ end
22
+
23
+ # Insert + sign to format positive numbers
24
+ def add_plus_sign(num)
25
+ num.to_i.positive? ? "+#{comma_delimit(num)}" : comma_delimit(num).to_s
26
+ end
27
+
28
+ def format_country_history_numbers(load)
29
+ load['timeline'].values.map(&:values).transpose.each do |data|
30
+ data.map! { |number| Kovid.comma_delimit(number) }
31
+ end
32
+ end
17
33
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kovid
4
+ # Constructs history data for specified country
4
5
  module Historians
5
6
  include Constants
6
7
 
@@ -10,9 +11,9 @@ module Kovid
10
11
  rows = []
11
12
 
12
13
  stats = if last
13
- transpose(country).last(last.to_i)
14
+ Kovid.format_country_history_numbers(country).last(last.to_i)
14
15
  else
15
- transpose(country)
16
+ Kovid.format_country_history_numbers(country)
16
17
  end
17
18
 
18
19
  dates = if last
@@ -53,8 +54,9 @@ module Kovid
53
54
  end
54
55
 
55
56
  # From dates where number of !cases.zero?
56
- positive_cases_figures = country['timeline']['cases'].values.reject(&:zero?)
57
- dates = country['timeline']['cases'].reject { |_k, v| v.zero? }.keys
57
+ country_cases = country['timeline']['cases']
58
+ positive_cases_figures = country_cases.values.reject(&:zero?)
59
+ dates = country_cases.reject { |_k, v| v.zero? }.keys
58
60
  data = []
59
61
 
60
62
  # TODO: Refactor
@@ -88,12 +90,16 @@ module Kovid
88
90
  dates.each_with_index do |val, index|
89
91
  data << [val, positive_cases_figures[index]]
90
92
  end
91
- y_range = AsciiCharts::Cartesian.new(data, bar: true, hide_zero: true).y_range
93
+ y_range = AsciiCharts::Cartesian.new(
94
+ data, bar: true, hide_zero: true
95
+ ).y_range
92
96
 
93
97
  last_two_y = y_range.last 2
94
98
  y_interval = last_two_y.last - last_two_y.first
95
99
 
96
- scale("Scale on Y: #{y_interval}:#{(y_interval / last_two_y.last.to_f * positive_cases_figures.last).round(2) / y_interval}")
100
+ scale("Scale on Y: #{y_interval}:#{(
101
+ y_interval / last_two_y.last.to_f * positive_cases_figures.last
102
+ ).round(2) / y_interval}")
97
103
 
98
104
  puts 'Experimental feature, please report issues.'
99
105
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'rainbow'
4
4
 
5
+ # Adds text color functionalities to String class
5
6
  class String
6
7
  def paint_white
7
8
  Rainbow(self).white.bg(:black).bold
@@ -6,6 +6,7 @@ require_relative 'cache'
6
6
  require_relative 'uri_builder'
7
7
 
8
8
  module Kovid
9
+ # Makes requests to external source to collect cases data
9
10
  class Request
10
11
  COUNTRIES_PATH = UriBuilder.new('/countries').url
11
12
  STATES_URL = UriBuilder.new('/states').url
@@ -15,16 +16,18 @@ module Kovid
15
16
 
16
17
  EU_ISOS = %w[AT BE BG CY CZ DE DK EE ES FI FR GR HR HU IE IT LT \
17
18
  LU LV MT NL PL PT RO SE SI SK].freeze
18
- EUROPE_ISOS = EU_ISOS + %w[GB IS NO CH MC AD SM VA BA RS ME MK AL\
19
- BY UA RU MD]
19
+ EUROPE_ISOS = EU_ISOS + %w[GB IS NO CH MC AD SM VA BA RS ME MK AL \
20
+ BY UA RU MD].freeze
20
21
  AFRICA_ISOS = %w[DZ AO BJ BW BF BI CM CV CF TD KM CD CG CI DJ EG \
21
- GQ ER SZ ET GA GM GH GN GW KE LS LR LY MG MW ML MR MU MA MZ NA NE \
22
- NG RW ST SN SC SL SO ZA SS SD TZ TG TN UG ZM ZW EH].freeze
23
- SOUTH_AMERICA_ISOS = ['AR' 'BO', 'BV', 'BR', 'CL', 'CO', 'EC', \
24
- 'FK', 'GF', 'GY', 'PY', 'PE', 'GS', 'SR', 'UY', 'VE'].freeze
22
+ GQ ER SZ ET GA GM GH GN GW KE LS LR LY MG MW ML \
23
+ MR MU MA MZ NA NE NG RW ST SN SC SL SO ZA SS SD \
24
+ TZ TG TN UG ZM ZW EH].freeze
25
+ SOUTH_AMERICA_ISOS = %w[AR BO BV BR CL CO EC FK GF GY PY PE GS SR \
26
+ UY VE].freeze
25
27
  ASIA_ISOS = %w[AE AF AM AZ BD BH BN BT CC CN CX GE HK ID IL IN \
26
- IQ IR JO JP KG KH KP KR KW KZ LA LB LK MM MN MO MY NP OM PH PK \
27
- PS QA SA SG SY TH TJ TL TM TR TW UZ VN YE].freeze
28
+ IQ IR JO JP KG KH KP KR KW KZ LA LB LK MM MN MO \
29
+ MY NP OM PH PK PS QA SA SG SY TH TJ TL TM TR TW \
30
+ UZ VN YE].freeze
28
31
 
29
32
  class << self
30
33
  def eu_aggregate
@@ -147,7 +150,9 @@ module Kovid
147
150
  end
148
151
 
149
152
  def cases
150
- response = JSON.parse(Typhoeus.get(UriBuilder.new('/all').url, cache_ttl: 900).response_body)
153
+ response = JSON.parse(
154
+ Typhoeus.get(UriBuilder.new('/all').url, cache_ttl: 900).response_body
155
+ )
151
156
 
152
157
  Kovid::Tablelize.cases(response)
153
158
  rescue JSON::ParserError
@@ -156,7 +161,11 @@ module Kovid
156
161
 
157
162
  def history(country, last)
158
163
  history_path = UriBuilder.new('/v2/historical').url
159
- response = JSON.parse(Typhoeus.get(history_path + "/#{country}", cache_ttl: 900).response_body)
164
+ response = JSON.parse(
165
+ Typhoeus.get(
166
+ history_path + "/#{country}", cache_ttl: 900
167
+ ).response_body
168
+ )
160
169
 
161
170
  Kovid::Tablelize.history(response, last)
162
171
  rescue JSON::ParserError
@@ -165,7 +174,11 @@ module Kovid
165
174
 
166
175
  def histogram(country, date)
167
176
  history_path = UriBuilder.new('/v2/historical').url
168
- response = JSON.parse(Typhoeus.get(history_path + "/#{country}", cache_ttl: 900).response_body)
177
+ response = JSON.parse(
178
+ Typhoeus.get(
179
+ history_path + "/#{country}", cache_ttl: 900
180
+ ).response_body
181
+ )
169
182
 
170
183
  Kovid::Tablelize.histogram(response, date)
171
184
  end
@@ -183,14 +196,20 @@ module Kovid
183
196
 
184
197
  def fetch_countries(list)
185
198
  list.map do |country|
186
- JSON.parse(Typhoeus.get(COUNTRIES_PATH + "/#{country}", cache_ttl: 900).response_body)
199
+ JSON.parse(
200
+ Typhoeus.get(
201
+ COUNTRIES_PATH + "/#{country}", cache_ttl: 900
202
+ ).response_body
203
+ )
187
204
  end.sort_by { |json| -json['cases'] }
188
205
  end
189
206
 
190
207
  def fetch_compared_states(submitted_states)
191
208
  state_data = fetch_state_data
192
209
 
193
- state_data.select { |state| submitted_states.include?(state['state'].downcase) }
210
+ state_data.select do |state|
211
+ submitted_states.include?(state['state'].downcase)
212
+ end
194
213
  end
195
214
 
196
215
  def fetch_state_data
@@ -198,6 +217,10 @@ module Kovid
198
217
  end
199
218
 
200
219
  def fetch_country(country_name)
220
+ # TODO: Match ISOs to full country names
221
+ if country_name == "netherlands"
222
+ country_name = "nl"
223
+ end
201
224
  country_url = COUNTRIES_PATH + "/#{country_name}"
202
225
 
203
226
  JSON.parse(Typhoeus.get(country_url, cache_ttl: 900).response_body)
@@ -209,7 +232,9 @@ module Kovid
209
232
 
210
233
  def fetch_province(province)
211
234
  response = fetch_jhucsse
212
- response.select { |datum| datum['province'] == capitalize_words(province) }.first
235
+ response.select do |datum|
236
+ datum['province'] == capitalize_words(province)
237
+ end.first
213
238
  end
214
239
 
215
240
  def fetch_provinces(provinces)
@@ -219,19 +244,35 @@ module Kovid
219
244
  end
220
245
 
221
246
  def fetch_state(state)
222
- states_array = JSON.parse(Typhoeus.get(STATES_URL, cache_ttl: 900).response_body)
247
+ states_array = JSON.parse(
248
+ Typhoeus.get(STATES_URL, cache_ttl: 900).response_body
249
+ )
223
250
 
224
- states_array.select { |state_name| state_name['state'] == capitalize_words(state) }.first
251
+ states_array.select do |state_name|
252
+ state_name['state'] == capitalize_words(state)
253
+ end.first
225
254
  end
226
255
 
227
256
  def aggregator(isos, meth)
228
- countries_array = JSON.parse(Typhoeus.get(UriBuilder.new('/countries').url, cache_ttl: 900).response_body)
229
-
257
+ countries_array = JSON.parse(countries_request)
230
258
  country_array = countries_array.select do |hash|
231
259
  isos.include?(hash['countryInfo']['iso2'])
232
260
  end
261
+ data = countries_aggregator(country_array)
262
+
263
+ meth === data
264
+ rescue JSON::ParserError
265
+ puts SERVER_DOWN
266
+ end
267
+
268
+ def countries_request
269
+ Typhoeus.get(
270
+ UriBuilder.new('/countries').url, cache_ttl: 900
271
+ ).response_body
272
+ end
233
273
 
234
- data = country_array.inject do |base, other|
274
+ def countries_aggregator(country_array)
275
+ country_array.inject do |base, other|
235
276
  base.merge(other) do |key, left, right|
236
277
  left ||= 0
237
278
  right ||= 0
@@ -239,10 +280,6 @@ module Kovid
239
280
  left + right unless %w[country countryInfo].include?(key)
240
281
  end
241
282
  end.compact
242
-
243
- meth === data
244
- rescue JSON::ParserError
245
- puts SERVER_DOWN
246
283
  end
247
284
  end
248
285
  end
@@ -9,6 +9,7 @@ require_relative 'aggregators'
9
9
  require_relative 'historians'
10
10
 
11
11
  module Kovid
12
+ # Constructs the tables according to specified input
12
13
  class Tablelize
13
14
  extend Kovid::Constants
14
15
  extend Kovid::Aggregators
@@ -16,120 +17,50 @@ module Kovid
16
17
 
17
18
  class << self
18
19
  def country_table(data)
19
- rows = [
20
- [
21
- comma_delimit(data['cases']),
22
- check_if_positve(data['todayCases']),
23
- comma_delimit(data['deaths']),
24
- check_if_positve(data['todayDeaths']),
25
- comma_delimit(data['recovered'])
26
- ]
27
- ]
28
-
29
- if (iso = data['countryInfo']['iso2'])
30
- Terminal::Table.new(title: "#{country_emoji(iso)} #{data['country'].upcase}",
31
- headings: CASES_DEATHS_RECOVERED_CTODAY_DTODAY,
32
- rows: rows)
33
- else
34
- Terminal::Table.new(title: data['country'].upcase,
35
- headings: CASES_DEATHS_RECOVERED_CTODAY_DTODAY,
36
- rows: rows)
37
- end
20
+ Terminal::Table.new(title: country_title(data),
21
+ headings: CASES_DEATHS_RECOVERED_CTODAY_DTODAY,
22
+ rows: [country_row(data)])
38
23
  end
39
24
 
40
25
  def full_country_table(data)
41
- rows = []
42
- rows << [
43
- comma_delimit(data['cases']),
44
- comma_delimit(data['deaths']),
45
- comma_delimit(data['recovered']),
46
- check_if_positve(data['todayCases']),
47
- check_if_positve(data['todayDeaths']),
48
- comma_delimit(data['critical']),
49
- comma_delimit(data['casesPerOneMillion'])
50
- ]
51
-
52
- if iso = data['countryInfo']['iso2']
53
- Terminal::Table.new(title: "#{country_emoji(iso)} #{data['country'].upcase}",
54
- headings: FULL_COUNTRY_TABLE_HEADINGS,
55
- rows: rows)
56
- else
57
- Terminal::Table.new(title: data['country'].upcase,
58
- headings: FULL_COUNTRY_TABLE_HEADINGS,
59
- rows: rows)
60
- end
26
+ Terminal::Table.new(title: country_title(data),
27
+ headings: FULL_COUNTRY_TABLE_HEADINGS,
28
+ rows: [full_country_row(data)])
61
29
  end
62
30
 
63
31
  def full_province_table(province)
64
- headings = [
65
- 'Confirmed'.paint_white,
66
- 'Deaths'.paint_red,
67
- 'Recovered'.paint_green
68
- ]
69
- rows = []
70
- rows << [province['stats']['confirmed'], province['stats']['deaths'], province['stats']['recovered']]
71
-
72
- Terminal::Table.new(title: province['province'].upcase, headings: headings, rows: rows)
32
+ Terminal::Table.new(
33
+ title: province['province'].upcase,
34
+ headings: FULL_PROVINCE_TABLE_HEADINGS,
35
+ rows: [province_row(province)]
36
+ )
73
37
  end
74
38
 
75
39
  def full_state_table(state)
76
- headings = [
77
- 'Cases'.paint_white,
78
- 'Cases Today'.paint_white,
79
- 'Deaths'.paint_red,
80
- 'Deaths Today'.paint_red,
81
- 'Active'.paint_yellow
82
- ]
83
-
84
- rows = []
85
- rows << [
86
- comma_delimit(state['cases']),
87
- check_if_positve(state['todayCases']),
88
- comma_delimit(state['deaths']),
89
- check_if_positve(state['todayDeaths']),
90
- comma_delimit(state['active'])
91
- ]
92
-
93
- Terminal::Table.new(title: state['state'].upcase, headings: headings, rows: rows)
40
+ Terminal::Table.new(
41
+ title: state['state'].upcase,
42
+ headings: FULL_STATE_TABLE_HEADINGS,
43
+ rows: [country_row(state)]
44
+ )
94
45
  end
95
46
 
96
47
  def compare_countries_table(data)
97
48
  rows = []
98
49
 
99
50
  data.each do |country|
100
- base_rows = [
101
- comma_delimit(country['cases']),
102
- check_if_positve(country['todayCases']),
103
- comma_delimit(country['deaths']),
104
- check_if_positve(country['todayDeaths']),
105
- comma_delimit(country['recovered'])
106
- ]
107
-
108
- rows << if (iso = country['countryInfo']['iso2'])
109
- base_rows.unshift("#{country_emoji(iso)} #{country['country'].upcase}")
110
- else
111
- base_rows.unshift(country['country'].upcase.to_s)
112
- end
51
+ base_rows = country_row(country)
52
+ rows << base_rows.unshift(country_title(country))
113
53
  end
114
54
 
115
55
  align_columns(:compare_country_table,
116
- Terminal::Table.new(headings: COMPARE_COUNTRIES_TABLE_HEADINGS,
117
- rows: rows))
56
+ Terminal::Table.new(
57
+ headings: COMPARE_COUNTRIES_TABLE_HEADINGS,
58
+ rows: rows
59
+ ))
118
60
  end
119
61
 
120
62
  def compare_countries_table_full(data)
121
- rows = data.map do |country|
122
- [
123
- country.fetch('country'),
124
- comma_delimit(country.fetch('cases')),
125
- comma_delimit(country.fetch('deaths')),
126
- comma_delimit(country.fetch('recovered')),
127
- check_if_positve(country.fetch('todayCases')),
128
- check_if_positve(country.fetch('todayDeaths')),
129
- comma_delimit(country.fetch('critical')),
130
- comma_delimit(country.fetch('casesPerOneMillion'))
131
- ]
132
- end
63
+ rows = data.map { |country| compare_countries_full_row(country) }
133
64
 
134
65
  align_columns(:compare_country_table_full,
135
66
  Terminal::Table.new(headings: COMPARE_COUNTRY_TABLE_FULL,
@@ -139,23 +70,9 @@ module Kovid
139
70
  def compare_us_states(data)
140
71
  rows = data.map.with_index do |state, index|
141
72
  if index.odd?
142
- [
143
- state.fetch('state').upcase,
144
- comma_delimit(state.fetch('cases')),
145
- check_if_positve(state['todayCases']),
146
- comma_delimit(state['deaths']),
147
- check_if_positve(state['todayDeaths']),
148
- comma_delimit(state.fetch('active'))
149
- ]
73
+ us_state_row(state)
150
74
  else
151
- [
152
- state.fetch('state').upcase.paint_highlight,
153
- comma_delimit(state.fetch('cases')).paint_highlight,
154
- check_if_positve(state['todayCases']).paint_highlight,
155
- comma_delimit(state['deaths']).paint_highlight,
156
- check_if_positve(state['todayDeaths']).paint_highlight,
157
- comma_delimit(state.fetch('active')).paint_highlight
158
- ]
75
+ us_state_row(state).map(&:paint_highlight)
159
76
  end
160
77
  end
161
78
 
@@ -165,14 +82,7 @@ module Kovid
165
82
  end
166
83
 
167
84
  def compare_provinces(data)
168
- rows = data.map do |province|
169
- [
170
- province['province'].upcase,
171
- province['stats']['confirmed'],
172
- province['stats']['deaths'],
173
- province['stats']['recovered']
174
- ]
175
- end
85
+ rows = data.map { |province| compare_provinces_row(province) }
176
86
 
177
87
  align_columns(:compare_provinces,
178
88
  Terminal::Table.new(headings: COMPARE_PROVINCES_HEADINGS,
@@ -180,29 +90,22 @@ module Kovid
180
90
  end
181
91
 
182
92
  def cases(cases)
183
- headings = CASES_DEATHS_RECOVERED
184
- rows = [
185
- [
186
- comma_delimit(cases['cases']),
187
- comma_delimit(cases['deaths']),
188
- comma_delimit(cases['recovered'])
189
- ]
190
- ]
191
-
192
- Terminal::Table.new(title: '🌍 Total Number of Incidents Worldwide'.upcase, headings: headings, rows: rows)
93
+ Terminal::Table.new(
94
+ title: '🌍 Total Number of Incidents Worldwide'.upcase,
95
+ headings: CASES_DEATHS_RECOVERED,
96
+ rows: [cases_row(cases)]
97
+ )
193
98
  end
194
99
 
195
100
  private
196
101
 
197
- def comma_delimit(number)
198
- number.to_s.chars.to_a.reverse.each_slice(3)
199
- .map(&:join)
200
- .join(',')
201
- .reverse
202
- end
203
-
204
- def check_if_positve(num)
205
- num.to_i.positive? ? "+#{comma_delimit(num)}" : comma_delimit(num).to_s
102
+ def country_title(data)
103
+ iso = data['countryInfo']['iso2']
104
+ if iso.nil?
105
+ data['country'].upcase
106
+ else
107
+ "#{country_emoji(iso)} #{data['country'].upcase}"
108
+ end
206
109
  end
207
110
 
208
111
  def country_emoji(iso)
@@ -210,10 +113,80 @@ module Kovid
210
113
  8203.chr(Encoding::UTF_8)
211
114
  end
212
115
 
213
- def transpose(load)
214
- load['timeline'].values.map(&:values).transpose.each do |data|
215
- data.map! { |number| comma_delimit(number) }
216
- end
116
+ def cases_row(data)
117
+ [
118
+ Kovid.comma_delimit(data['cases']),
119
+ Kovid.comma_delimit(data['deaths']),
120
+ Kovid.comma_delimit(data['recovered'])
121
+ ]
122
+ end
123
+
124
+ # Also works for state
125
+ def country_row(data)
126
+ [
127
+ Kovid.comma_delimit(data['cases']),
128
+ Kovid.add_plus_sign(data['todayCases']),
129
+ Kovid.comma_delimit(data['deaths']),
130
+ Kovid.add_plus_sign(data['todayDeaths']),
131
+ Kovid.comma_delimit(data['recovered'])
132
+ ]
133
+ end
134
+
135
+ def full_country_row(data)
136
+ [
137
+ Kovid.comma_delimit(data['cases']),
138
+ Kovid.comma_delimit(data['deaths']),
139
+ Kovid.comma_delimit(data['recovered']),
140
+ Kovid.add_plus_sign(data['todayCases']),
141
+ Kovid.add_plus_sign(data['todayDeaths']),
142
+ Kovid.comma_delimit(data['critical']),
143
+ Kovid.comma_delimit(data['casesPerOneMillion'])
144
+ ]
145
+ end
146
+
147
+ def province_row(data)
148
+ [
149
+ data['stats']['confirmed'],
150
+ data['stats']['deaths'],
151
+ data['stats']['recovered']
152
+ ]
153
+ end
154
+
155
+ def compare_provinces_row(data)
156
+ [
157
+ data['province'].upcase,
158
+ province_row(data)
159
+ ].flatten
160
+ end
161
+
162
+ def compare_countries_full_row(data)
163
+ [
164
+ data.fetch('country'),
165
+ full_country_row(data)
166
+ ].flatten
167
+ end
168
+
169
+ def us_state_row(data)
170
+ [
171
+ data.fetch('state').upcase,
172
+ Kovid.comma_delimit(data.fetch('cases')),
173
+ Kovid.add_plus_sign(data['todayCases']),
174
+ Kovid.comma_delimit(data['deaths']),
175
+ Kovid.add_plus_sign(data['todayDeaths']),
176
+ Kovid.comma_delimit(data.fetch('active'))
177
+ ]
178
+ end
179
+
180
+ def aggregated_row(data)
181
+ [
182
+ Kovid.comma_delimit(data['cases']),
183
+ Kovid.add_plus_sign(data['todayCases']),
184
+ Kovid.comma_delimit(data['deaths']),
185
+ Kovid.add_plus_sign(data['todayDeaths']),
186
+ Kovid.comma_delimit(data['recovered']),
187
+ Kovid.comma_delimit(data['active']),
188
+ Kovid.comma_delimit(data['critical'])
189
+ ]
217
190
  end
218
191
 
219
192
  def scale(msg)
@@ -222,32 +195,26 @@ module Kovid
222
195
  end
223
196
 
224
197
  def aggregated_table(collated_data, continent, iso, emoji)
225
- title = if emoji.codepoints.size > 1
226
- emoji + 8203.chr(Encoding::UTF_8) + \
227
- " Aggregated Data on #{continent} (#{iso.size} States)".upcase
228
- else
229
- emoji + \
230
- " Aggregated Data on #{continent} (#{iso.size} States)".upcase
231
- end
232
-
233
- rows = []
234
- rows << [
235
- comma_delimit(collated_data['cases']),
236
- check_if_positve(collated_data['todayCases']),
237
- comma_delimit(collated_data['deaths']),
238
- check_if_positve(collated_data['todayDeaths']),
239
- comma_delimit(collated_data['recovered']),
240
- comma_delimit(collated_data['active']),
241
- comma_delimit(collated_data['critical'])
242
- ]
198
+ title = aggregated_table_title(continent, iso, emoji)
243
199
 
244
200
  Terminal::Table.new(
245
201
  title: title,
246
202
  headings: CONTINENTAL_AGGREGATE_HEADINGS,
247
- rows: rows
203
+ rows: [aggregated_row(collated_data)]
248
204
  )
249
205
  end
250
206
 
207
+ def aggregated_table_title(continent, iso, emoji)
208
+ aggregated_data_continent = ' Aggregated Data on ' \
209
+ "#{continent} (#{iso.size} States)".upcase
210
+
211
+ if emoji.codepoints.size > 1
212
+ emoji + 8203.chr(Encoding::UTF_8) + aggregated_data_continent
213
+ else
214
+ emoji + aggregated_data_continent
215
+ end
216
+ end
217
+
251
218
  def align_columns(table_type, table)
252
219
  return table unless RIGHT_ALIGN_COLUMNS[table_type]
253
220
 
@@ -3,6 +3,7 @@
3
3
  require 'uri'
4
4
 
5
5
  module Kovid
6
+ # Prepares base URI before requests
6
7
  class UriBuilder
7
8
  attr_reader :path
8
9
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kovid
4
- VERSION = '0.6.5'
4
+ VERSION = '0.6.6'
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.6.5
4
+ version: 0.6.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-04-09 00:00:00.000000000 Z
11
+ date: 2020-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ascii_charts
@@ -105,6 +105,8 @@ extra_rdoc_files: []
105
105
  files:
106
106
  - ".gitignore"
107
107
  - ".rspec"
108
+ - ".rubocop.yml"
109
+ - ".rubocop_todo.yml"
108
110
  - ".travis.yml"
109
111
  - CODE_OF_CONDUCT.md
110
112
  - Gemfile