kovid 0.6.2 → 0.6.7
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/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +59 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +18 -1
- data/README.md +3 -1
- data/Rakefile +1 -0
- data/kovid.gemspec +9 -4
- data/lib/kovid.rb +0 -2
- data/lib/kovid/aggregators.rb +28 -0
- data/lib/kovid/cache.rb +0 -1
- data/lib/kovid/cli.rb +33 -33
- data/lib/kovid/constants.rb +112 -0
- data/lib/kovid/helpers.rb +22 -0
- data/lib/kovid/historians.rb +108 -0
- data/lib/kovid/painter.rb +0 -1
- data/lib/kovid/request.rb +62 -28
- data/lib/kovid/tablelize.rb +118 -346
- data/lib/kovid/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a77d1ad2686877dfe810f0df3cbc817b46c287f2a6025ce999108213ad0e54c8
|
4
|
+
data.tar.gz: 888dab7db56dc55241512e24bef98fb9f9117abd9e09790a19894630d691e0c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6394d6904a073fef5c4fa1d6429c3789a84dfc329a519346dd90e53b082b22284405a044a13c984cf231f7cdd02fb790c49450c47c1d6c0fecb124fbc67783e5
|
7
|
+
data.tar.gz: 7c45571d9683f723068c6d17a97427348c5d3f8ed64db76e2bd71db72af322f3611bd0d66af8dc3732d4a251f1253d2ea0d49c0db34f8c905739f7cc7dd885cc
|
data/.rubocop.yml
ADDED
data/.rubocop_todo.yml
ADDED
@@ -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'
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
kovid (0.6.
|
4
|
+
kovid (0.6.6)
|
5
5
|
ascii_charts (~> 0.9.1)
|
6
6
|
rainbow (~> 3.0)
|
7
7
|
terminal-table (~> 1.8)
|
@@ -11,12 +11,24 @@ PATH
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
+
activesupport (6.0.2.2)
|
15
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
16
|
+
i18n (>= 0.7, < 2)
|
17
|
+
minitest (~> 5.1)
|
18
|
+
tzinfo (~> 1.1)
|
19
|
+
zeitwerk (~> 2.2)
|
14
20
|
ascii_charts (0.9.1)
|
21
|
+
carmen (1.1.3)
|
22
|
+
activesupport (>= 3.0.0)
|
23
|
+
concurrent-ruby (1.1.6)
|
15
24
|
diff-lcs (1.3)
|
16
25
|
docile (1.3.2)
|
17
26
|
ethon (0.12.0)
|
18
27
|
ffi (>= 1.3.0)
|
19
28
|
ffi (1.12.2)
|
29
|
+
i18n (1.8.2)
|
30
|
+
concurrent-ruby (~> 1.0)
|
31
|
+
minitest (5.14.0)
|
20
32
|
rainbow (3.0.0)
|
21
33
|
rake (12.3.3)
|
22
34
|
rspec (3.9.0)
|
@@ -39,14 +51,19 @@ GEM
|
|
39
51
|
terminal-table (1.8.0)
|
40
52
|
unicode-display_width (~> 1.1, >= 1.1.1)
|
41
53
|
thor (1.0.1)
|
54
|
+
thread_safe (0.3.6)
|
42
55
|
typhoeus (1.3.1)
|
43
56
|
ethon (>= 0.9.0)
|
57
|
+
tzinfo (1.2.7)
|
58
|
+
thread_safe (~> 0.1)
|
44
59
|
unicode-display_width (1.7.0)
|
60
|
+
zeitwerk (2.3.0)
|
45
61
|
|
46
62
|
PLATFORMS
|
47
63
|
ruby
|
48
64
|
|
49
65
|
DEPENDENCIES
|
66
|
+
carmen (~> 1.1.3)
|
50
67
|
kovid!
|
51
68
|
rake (~> 12.0)
|
52
69
|
rspec (~> 3.0)
|
data/README.md
CHANGED
@@ -46,6 +46,8 @@ You can fetch US state-specific data:
|
|
46
46
|
* `kovid state STATE` OR `kovid state "STATE NAME"`.
|
47
47
|
* `kovid states --all` or `kovid states -a` for data on all US states.
|
48
48
|
|
49
|
+
You can also use USPS abbreviations. Example: `kovid state me`
|
50
|
+
|
49
51
|
Provinces
|
50
52
|
|
51
53
|
You can fetch province specific data:
|
@@ -64,7 +66,7 @@ You can compare as many countries as you want; `kovid compare FOO BAR BAZ` OR `k
|
|
64
66
|
🇺🇸🇺🇸🇺🇸
|
65
67
|
|
66
68
|
You can compare US states with:
|
67
|
-
* `kovid states STATE STATE` Example: `kovid states illinois "new york" california`
|
69
|
+
* `kovid states STATE STATE` Example: `kovid states illinois "new york" california` OR `kovid states il ny ca`
|
68
70
|
|
69
71
|
You can compare provicnes with:
|
70
72
|
* `kovid provinces PROVINCE PROVINCE` Example: `kovid provinces ontario manitoba`
|
data/Rakefile
CHANGED
data/kovid.gemspec
CHANGED
@@ -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
|
-
|
12
|
-
|
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
|
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
|
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) }
|
data/lib/kovid.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kovid
|
4
|
+
module Aggregators
|
5
|
+
def eu_aggregate(eu_data)
|
6
|
+
aggregated_table(eu_data, 'The EU', Kovid::Request::EU_ISOS, '🇪🇺')
|
7
|
+
end
|
8
|
+
|
9
|
+
def europe_aggregate(europe_data)
|
10
|
+
aggregated_table(europe_data, 'Europe', Kovid::Request::EUROPE_ISOS, '🏰')
|
11
|
+
end
|
12
|
+
|
13
|
+
def africa_aggregate(africa_data)
|
14
|
+
aggregated_table(africa_data, 'Africa',
|
15
|
+
Kovid::Request::AFRICA_ISOS, '🌍')
|
16
|
+
end
|
17
|
+
|
18
|
+
def south_america_aggregate(south_america_data)
|
19
|
+
aggregated_table(south_america_data,
|
20
|
+
'South America',
|
21
|
+
Kovid::Request::SOUTH_AMERICA_ISOS, '🌎')
|
22
|
+
end
|
23
|
+
|
24
|
+
def asia_aggregate(asia_data)
|
25
|
+
aggregated_table(asia_data, 'Asia', Kovid::Request::ASIA_ISOS, '🌏')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/kovid/cache.rb
CHANGED
data/lib/kovid/cli.rb
CHANGED
@@ -5,37 +5,47 @@ require 'kovid'
|
|
5
5
|
|
6
6
|
module Kovid
|
7
7
|
class CLI < Thor
|
8
|
-
FULL_FLAG = %w[-f --full].freeze
|
9
|
-
|
10
8
|
def self.exit_on_failure?
|
11
9
|
true
|
12
10
|
end
|
13
11
|
|
14
|
-
desc 'province PROVINCE or province "PROVINCE NAME"',
|
12
|
+
desc 'province PROVINCE or province "PROVINCE NAME"',
|
13
|
+
'Returns reported data on provided province. ' \
|
14
|
+
'eg "kovid check "new brunswick".'
|
15
15
|
method_option :full, aliases: '-p'
|
16
16
|
def province(name)
|
17
17
|
puts Kovid.province(name)
|
18
18
|
data_source
|
19
19
|
end
|
20
20
|
|
21
|
-
desc 'provinces PROVINCE PROVINCE',
|
21
|
+
desc 'provinces PROVINCE PROVINCE',
|
22
|
+
'Returns full comparison table for the given provinces. ' \
|
23
|
+
'Accepts multiple provinces.'
|
22
24
|
def provinces(*names)
|
23
25
|
puts Kovid.provinces(names)
|
24
26
|
data_source
|
25
27
|
end
|
26
28
|
|
27
|
-
desc 'check COUNTRY or check "COUNTRY NAME"',
|
29
|
+
desc 'check COUNTRY or check "COUNTRY NAME"',
|
30
|
+
'Returns reported data on provided country. ' \
|
31
|
+
'eg: "kovid check "hong kong".'
|
28
32
|
method_option :full, aliases: '-f'
|
29
|
-
def check(name)
|
30
|
-
|
33
|
+
def check(*name)
|
34
|
+
if name.size == 1
|
35
|
+
fetch_country_stats(name.pop)
|
36
|
+
elsif options[:full]
|
37
|
+
puts Kovid.country_comparison_full(name)
|
38
|
+
else
|
39
|
+
puts Kovid.country_comparison(name)
|
40
|
+
end
|
31
41
|
data_source
|
32
42
|
end
|
43
|
+
map country: :check
|
33
44
|
|
34
|
-
desc '
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
data_source
|
45
|
+
desc 'compare COUNTRY COUNTRY', 'Deprecated. Will be removed in v7.0.0'
|
46
|
+
def compare(*_name)
|
47
|
+
Kovid.info_table("#compare is deprecated and will be removed in v7.0.0. \
|
48
|
+
\nPlease do `kovid check COUNTRY COUNTRY ...` instead.")
|
39
49
|
end
|
40
50
|
|
41
51
|
desc 'state STATE', 'Return reported data on provided state.'
|
@@ -44,29 +54,18 @@ module Kovid
|
|
44
54
|
data_source
|
45
55
|
end
|
46
56
|
|
47
|
-
desc '
|
48
|
-
|
49
|
-
|
50
|
-
|
57
|
+
desc 'states STATE STATE or states --all',
|
58
|
+
'Returns full comparison table for the given states. ' \
|
59
|
+
'Accepts multiple states.'
|
60
|
+
method_option :all, aliases: '-a'
|
61
|
+
def states(*states)
|
62
|
+
if options[:all]
|
63
|
+
puts Kovid.all_us_states
|
51
64
|
else
|
52
|
-
|
65
|
+
downcased_states = states.map(&:downcase)
|
66
|
+
puts Kovid.states(downcased_states)
|
53
67
|
end
|
54
|
-
data_source
|
55
|
-
end
|
56
|
-
|
57
|
-
desc 'states STATE STATE', 'Returns full comparison table for the given states. Accepts multiple states.'
|
58
|
-
def states(*states)
|
59
|
-
# This ensures this command is case insensitive.
|
60
|
-
downcased_states = states.map(&:downcase)
|
61
68
|
|
62
|
-
puts Kovid.states(downcased_states)
|
63
|
-
data_source
|
64
|
-
end
|
65
|
-
|
66
|
-
desc 'states -a', 'Returns full comparison table for all US states'
|
67
|
-
method_option :all, aliases: '-a'
|
68
|
-
def states
|
69
|
-
puts Kovid.all_us_states
|
70
69
|
data_source
|
71
70
|
end
|
72
71
|
|
@@ -76,7 +75,8 @@ module Kovid
|
|
76
75
|
data_source
|
77
76
|
end
|
78
77
|
|
79
|
-
desc 'history COUNTRY or history COUNTRY N',
|
78
|
+
desc 'history COUNTRY or history COUNTRY N',
|
79
|
+
'Return history of incidents of COUNTRY (in the last N days)'
|
80
80
|
def history(*params)
|
81
81
|
if params.size == 2
|
82
82
|
puts Kovid.history(params.first, params.last)
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kovid
|
4
|
+
module Constants
|
5
|
+
CASES_DEATHS_RECOVERED = [
|
6
|
+
'Cases'.paint_white,
|
7
|
+
'Deaths'.paint_red,
|
8
|
+
'Recovered'.paint_green
|
9
|
+
].freeze
|
10
|
+
|
11
|
+
CASES_DEATHS_RECOVERED_CTODAY_DTODAY = [
|
12
|
+
'Cases'.paint_white,
|
13
|
+
'Cases Today'.paint_white,
|
14
|
+
'Deaths'.paint_red,
|
15
|
+
'Deaths Today'.paint_red,
|
16
|
+
'Recovered'.paint_green
|
17
|
+
].freeze
|
18
|
+
|
19
|
+
DATE_CASES_DEATHS_RECOVERED = [
|
20
|
+
'Date'.paint_white,
|
21
|
+
'Cases'.paint_white,
|
22
|
+
'Deaths'.paint_red,
|
23
|
+
'Recovered'.paint_green
|
24
|
+
].freeze
|
25
|
+
|
26
|
+
CONTINENTAL_AGGREGATE_HEADINGS = [
|
27
|
+
'Cases'.paint_white,
|
28
|
+
'Cases Today'.paint_white,
|
29
|
+
'Deaths'.paint_red,
|
30
|
+
'Deaths Today'.paint_red,
|
31
|
+
'Recovered'.paint_green,
|
32
|
+
'Active'.paint_yellow,
|
33
|
+
'Critical'.paint_red
|
34
|
+
].freeze
|
35
|
+
|
36
|
+
COMPARE_COUNTRY_TABLE_FULL = [
|
37
|
+
'Country'.paint_white,
|
38
|
+
'Cases'.paint_white,
|
39
|
+
'Deaths'.paint_red,
|
40
|
+
'Recovered'.paint_green,
|
41
|
+
'Cases Today'.paint_white,
|
42
|
+
'Deaths Today'.paint_red,
|
43
|
+
'Critical'.paint_yellow,
|
44
|
+
'Cases/Million'.paint_white
|
45
|
+
].freeze
|
46
|
+
|
47
|
+
COMPARE_COUNTRIES_TABLE_HEADINGS = [
|
48
|
+
'Country'.paint_white,
|
49
|
+
'Cases'.paint_white,
|
50
|
+
'Cases Today'.paint_white,
|
51
|
+
'Deaths'.paint_red,
|
52
|
+
'Deaths Today'.paint_red,
|
53
|
+
'Recovered'.paint_green
|
54
|
+
].freeze
|
55
|
+
|
56
|
+
FULL_COUNTRY_TABLE_HEADINGS = [
|
57
|
+
'Cases'.paint_white,
|
58
|
+
'Deaths'.paint_red,
|
59
|
+
'Recovered'.paint_green,
|
60
|
+
'Cases Today'.paint_white,
|
61
|
+
'Deaths Today'.paint_red,
|
62
|
+
'Critical'.paint_yellow,
|
63
|
+
'Cases/Million'.paint_white
|
64
|
+
].freeze
|
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
|
+
|
80
|
+
COMPARE_STATES_HEADINGS = [
|
81
|
+
'State'.paint_white,
|
82
|
+
'Cases'.paint_white,
|
83
|
+
'Cases Today'.paint_white,
|
84
|
+
'Deaths'.paint_red,
|
85
|
+
'Deaths Today'.paint_red,
|
86
|
+
'Active'.paint_yellow
|
87
|
+
].freeze
|
88
|
+
|
89
|
+
COMPARE_PROVINCES_HEADINGS = [
|
90
|
+
'Province'.paint_white,
|
91
|
+
'Confirmed'.paint_white,
|
92
|
+
'Deaths'.paint_red,
|
93
|
+
'Recovered'.paint_green
|
94
|
+
].freeze
|
95
|
+
|
96
|
+
FOOTER_LINE = [
|
97
|
+
'------------',
|
98
|
+
'------------',
|
99
|
+
'------------',
|
100
|
+
'------------'
|
101
|
+
].freeze
|
102
|
+
|
103
|
+
COUNTRY_LETTERS = 'A'.upto('Z').with_index(127_462).to_h.freeze
|
104
|
+
|
105
|
+
RIGHT_ALIGN_COLUMNS = {
|
106
|
+
compare_country_table_full: [1, 2, 3, 4, 5, 6, 7],
|
107
|
+
compare_country_table: [1, 2, 3, 4, 5],
|
108
|
+
compare_us_states: [1, 2, 3, 4, 5],
|
109
|
+
compare_provinces: [1, 2, 3]
|
110
|
+
}.freeze
|
111
|
+
end
|
112
|
+
end
|