kovid 0.2.6 β 0.3.2
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.lock +4 -4
- data/README.md +22 -24
- data/kovid.gemspec +23 -23
- data/lib/kovid/cli.rb +16 -6
- data/lib/kovid/painter.rb +5 -5
- data/lib/kovid/request.rb +6 -9
- data/lib/kovid/tablelize.rb +42 -14
- data/lib/kovid/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4205df6f2e487214f535dda994a132264a9966b6c7527dec22f908f7aad76ed
|
4
|
+
data.tar.gz: 24b98f27cddcff29ed2a75d02be4af8d81fb2078d138890d75c9fb3541207bdf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c5e2f6b14c57dc707d81f5711ea6d2004300d253f8ba7afb0d453d14bd2f73210de62d73d2457caf7ed221ad8d27b192db2e511e749903bb25cd31bbfe3be02
|
7
|
+
data.tar.gz: 7fc35f3888744cbadcfe131e080ef56a3d9b0055f8437316f5286f364ab71391a6322df951c86c707ab43d3669b839aaed58fa3108913c36d6d252ce3759dca5
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
kovid (0.
|
5
|
-
|
4
|
+
kovid (0.3.1)
|
5
|
+
rainbow (~> 3.0)
|
6
6
|
terminal-table (~> 1.8)
|
7
7
|
thor (~> 1.0)
|
8
8
|
typhoeus (~> 1.3)
|
@@ -21,7 +21,6 @@ GEM
|
|
21
21
|
builder (3.2.4)
|
22
22
|
childprocess (3.0.0)
|
23
23
|
coderay (1.1.2)
|
24
|
-
colorize (0.8.1)
|
25
24
|
contracts (0.16.0)
|
26
25
|
cucumber (3.1.2)
|
27
26
|
builder (>= 2.1.2)
|
@@ -51,6 +50,7 @@ GEM
|
|
51
50
|
pry (0.12.2)
|
52
51
|
coderay (~> 1.1.0)
|
53
52
|
method_source (~> 0.9.0)
|
53
|
+
rainbow (3.0.0)
|
54
54
|
rake (12.3.3)
|
55
55
|
rspec (3.9.0)
|
56
56
|
rspec-core (~> 3.9.0)
|
@@ -89,4 +89,4 @@ DEPENDENCIES
|
|
89
89
|
simplecov
|
90
90
|
|
91
91
|
BUNDLED WITH
|
92
|
-
2.1.
|
92
|
+
2.1.4
|
data/README.md
CHANGED
@@ -1,57 +1,55 @@
|
|
1
1
|
# π¦ Kovid
|
2
2
|
|
3
|
-
[
|
4
|
-
|
5
|
-
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 and since I work mostly in the terminal, like some of you, I thought I'd build this to put the data right at our fingertips.
|
3
|
+
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.
|
6
4
|
|
7
5
|
Code contribution and ideas welcome.
|
8
6
|
|
9
7
|
|
10
8
|
## βοΈ Installation
|
11
9
|
|
12
|
-
|
13
|
-
|
14
|
-
βοΈ Wash your hands with soap and water for at least 20 seconds.
|
10
|
+
To install:
|
15
11
|
|
16
|
-
|
12
|
+
* οΈ Wash your hands with soap and water for at least 20 seconds.
|
17
13
|
|
14
|
+
* Run `gem install kovid`.
|
18
15
|
|
16
|
+
It's recommended you update often with `gem update kovid`.
|
19
17
|
|
20
18
|
## βοΈ Usage
|
21
19
|
|
22
20
|
You can run `kovid --help` to see the full list of available commands.
|
23
21
|
|
24
|
-
**NOTE:** If you find it irritating to have to type `kovid state STATE`, `covid state STATE` works as well.
|
25
|
-
|
26
22
|
#### Commands Overview
|
27
23
|
π· **Fetching**
|
28
|
-
* `kovid check COUNTRY`
|
29
|
-
* `kovid check COUNTRY -f` OR `kovid check COUNTRY --full
|
24
|
+
* `kovid check COUNTRY` OR `kovid country COUNTRY`.
|
25
|
+
* `kovid check COUNTRY -f` OR `kovid check COUNTRY --full`.
|
26
|
+
|
27
|
+
πΊπΈπΊπΈπΊπΈ
|
30
28
|
|
31
|
-
|
32
|
-
* `kovid state STATE` OR `kovid state "STATE
|
29
|
+
You can fetch US state-specific data:
|
30
|
+
* `kovid state STATE` OR `kovid state "STATE NAME"`.
|
33
31
|
|
34
32
|
π· **Comparing**
|
35
|
-
* `kovid compare
|
36
|
-
* `kovid compare
|
33
|
+
* `kovid compare FOO BAR` (sorts by cases DESC).
|
34
|
+
* `kovid compare FOO BAR -f` OR `kovid compare FOO BAR --full` (sorts by cases DESC).
|
37
35
|
|
38
|
-
|
36
|
+
Where `FOO` and `BAR` are different countries.
|
37
|
+
|
38
|
+
You can compare as many countries as you want; `kovid compare FOO BAR BAZ` OR `kovid compare FOO BAR BAZ -f`
|
39
39
|
|
40
40
|
π· **History**
|
41
|
-
* `kovid history COUNTRY` (full history)
|
42
|
-
* `kovid history COUNTRY N` (history in the last N days)
|
41
|
+
* `kovid history COUNTRY` (full history).
|
42
|
+
* `kovid history COUNTRY N` (history in the last N days).
|
43
43
|
|
44
44
|
π· **Total figures**
|
45
|
-
* `kovid cases`
|
46
|
-
|
45
|
+
* `kovid cases` (summary of reported incidents globally).
|
47
46
|
|
47
|
+
**NOTE:** If you find it irritating to have to type `kovid state STATE`, `covid state STATE` works as well.
|
48
48
|
|
49
49
|
#### Commands Details
|
50
50
|
To fetch basic data on a country run:
|
51
51
|
|
52
|
-
`kovid check ghana`
|
53
|
-
|
54
|
-
If the location contains spaces: `kovid check "Diamond Princess"`
|
52
|
+
`kovid check ghana`. If the location contains spaces: `kovid check "Diamond Princess"`
|
55
53
|
|
56
54
|

|
57
55
|
|
@@ -104,7 +102,7 @@ To install this gem onto your local machine, run `bundle exec rake install`.
|
|
104
102
|
|
105
103
|
## π€² Contributing
|
106
104
|
|
107
|
-
There are multiple areas in this repo that can be improved or use some refactoring(there's a lot to be
|
105
|
+
There are multiple areas in this repo that can be improved or use some refactoring(there's a lot to be refactored in fact!). For that reason, bug reports and pull requests are welcome! This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/siaw23/kovid/blob/master/CODE_OF_CONDUCT.md).
|
108
106
|
|
109
107
|
|
110
108
|
## π License
|
data/kovid.gemspec
CHANGED
@@ -14,6 +14,29 @@ Gem::Specification.new do |spec|
|
|
14
14
|
|
15
15
|
spec.metadata["allowed_push_host"] = "https://rubygems.org/"
|
16
16
|
|
17
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
18
|
+
spec.metadata["source_code_uri"] = "https://github.com/siaw23/kovid"
|
19
|
+
spec.metadata["changelog_uri"] = "https://github.com/siaw23/kovid"
|
20
|
+
|
21
|
+
spec.add_dependency "thor", "~> 1.0"
|
22
|
+
spec.add_dependency "terminal-table", "~> 1.8"
|
23
|
+
spec.add_dependency "typhoeus", "~> 1.3"
|
24
|
+
spec.add_dependency "rainbow", "~> 3.0"
|
25
|
+
|
26
|
+
spec.add_development_dependency "pry"
|
27
|
+
spec.add_development_dependency "cucumber"
|
28
|
+
spec.add_development_dependency "aruba"
|
29
|
+
spec.add_development_dependency "simplecov"
|
30
|
+
|
31
|
+
# 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.
|
33
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
34
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
35
|
+
end
|
36
|
+
spec.bindir = "exe"
|
37
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
38
|
+
spec.require_paths = ["lib"]
|
39
|
+
|
17
40
|
spec.post_install_message = %q{
|
18
41
|
============================================================================
|
19
42
|
COVID-19 has devasted the world. But while we're fighting
|
@@ -31,27 +54,4 @@ Gem::Specification.new do |spec|
|
|
31
54
|
Emmanuel Hayford.
|
32
55
|
============================================================================
|
33
56
|
}
|
34
|
-
|
35
|
-
spec.metadata["homepage_uri"] = spec.homepage
|
36
|
-
spec.metadata["source_code_uri"] = "https://github.com/siaw23/kovid"
|
37
|
-
spec.metadata["changelog_uri"] = "https://github.com/siaw23/kovid"
|
38
|
-
|
39
|
-
# Specify which files should be added to the gem when it is released.
|
40
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
41
|
-
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
42
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
43
|
-
end
|
44
|
-
spec.bindir = "exe"
|
45
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
46
|
-
spec.require_paths = ["lib"]
|
47
|
-
|
48
|
-
spec.add_dependency "thor", "~> 1.0"
|
49
|
-
spec.add_dependency "terminal-table", "~> 1.8"
|
50
|
-
spec.add_dependency "typhoeus", "~> 1.3"
|
51
|
-
spec.add_dependency "colorize", "~> 0.8"
|
52
|
-
|
53
|
-
spec.add_development_dependency "pry"
|
54
|
-
spec.add_development_dependency "cucumber"
|
55
|
-
spec.add_development_dependency "aruba"
|
56
|
-
spec.add_development_dependency "simplecov"
|
57
57
|
end
|
data/lib/kovid/cli.rb
CHANGED
@@ -15,14 +15,14 @@ module Kovid
|
|
15
15
|
desc 'check COUNTRY or check "COUNTRY NAME"', 'Returns reported data on provided country. eg: "kovid check "hong kong".'
|
16
16
|
method_option :full, aliases: '-f'
|
17
17
|
def check(name)
|
18
|
-
|
19
|
-
puts Kovid.country_full(name)
|
20
|
-
else
|
21
|
-
puts Kovid.country(name)
|
22
|
-
end
|
18
|
+
fetch_country_stats(name)
|
23
19
|
end
|
20
|
+
|
24
21
|
desc 'country COUNTRY or country "COUNTRY NAME"', 'Returns reported data on provided country. eg: "kovid country "hong kong".'
|
25
|
-
|
22
|
+
method_option :full, aliases: '-f'
|
23
|
+
def country(name)
|
24
|
+
fetch_country_stats(name)
|
25
|
+
end
|
26
26
|
|
27
27
|
desc 'state STATE', 'Return reported data on provided state.'
|
28
28
|
def state(state)
|
@@ -51,5 +51,15 @@ module Kovid
|
|
51
51
|
puts Kovid.history(params.first, nil)
|
52
52
|
end
|
53
53
|
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def fetch_country_stats(country)
|
58
|
+
if options[:full]
|
59
|
+
puts Kovid.country_full(country)
|
60
|
+
else
|
61
|
+
puts Kovid.country(country)
|
62
|
+
end
|
63
|
+
end
|
54
64
|
end
|
55
65
|
end
|
data/lib/kovid/painter.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'rainbow'
|
4
4
|
|
5
5
|
class String
|
6
6
|
def paint_white
|
7
|
-
|
7
|
+
Rainbow(self).white.bg(:black).bold
|
8
8
|
end
|
9
9
|
|
10
10
|
def paint_red
|
11
|
-
|
11
|
+
Rainbow(self).red.bg(:black).bold
|
12
12
|
end
|
13
13
|
|
14
14
|
def paint_green
|
15
|
-
|
15
|
+
Rainbow(self).green.bg(:black).bold
|
16
16
|
end
|
17
17
|
|
18
18
|
def paint_yellow
|
19
|
-
|
19
|
+
Rainbow(self).yellow.bg(:black).bold
|
20
20
|
end
|
21
21
|
end
|
data/lib/kovid/request.rb
CHANGED
@@ -8,6 +8,7 @@ require_relative 'uri_builder'
|
|
8
8
|
module Kovid
|
9
9
|
class Request
|
10
10
|
COUNTRIES_PATH = UriBuilder.new('/countries').url
|
11
|
+
STATES_URL = UriBuilder.new('/states').url
|
11
12
|
|
12
13
|
class << self
|
13
14
|
def by_country(country_name)
|
@@ -58,8 +59,8 @@ module Kovid
|
|
58
59
|
private
|
59
60
|
|
60
61
|
def no_case_in(country)
|
61
|
-
rows = [[
|
62
|
-
Terminal::Table.new
|
62
|
+
rows = [["Wrong spelling of location/API has no info on #{country.upcase} at the moment."]]
|
63
|
+
Terminal::Table.new title: "You checked: #{country.upcase}", rows: rows
|
63
64
|
end
|
64
65
|
|
65
66
|
def fetch_countries(list)
|
@@ -73,21 +74,17 @@ module Kovid
|
|
73
74
|
end
|
74
75
|
|
75
76
|
def fetch_country(country_name)
|
76
|
-
|
77
|
+
country_url = COUNTRIES_PATH + "/#{country_name}"
|
77
78
|
|
78
|
-
JSON.parse(Typhoeus.get(
|
79
|
+
JSON.parse(Typhoeus.get(country_url, cache_ttl: 900).response_body)
|
79
80
|
end
|
80
81
|
|
81
82
|
def fetch_state(state)
|
82
|
-
|
83
|
-
|
84
|
-
states_array = JSON.parse(Typhoeus.get(url, cache_ttl: 900).response_body)
|
83
|
+
states_array = JSON.parse(Typhoeus.get(STATES_URL, cache_ttl: 900).response_body)
|
85
84
|
|
86
85
|
states_array.select { |state_name| state_name['state'] == capitalize_words(state) }.first
|
87
86
|
end
|
88
87
|
|
89
|
-
private
|
90
|
-
|
91
88
|
def capitalize_words(string)
|
92
89
|
string.split.map(&:capitalize).join(' ')
|
93
90
|
end
|
data/lib/kovid/tablelize.rb
CHANGED
@@ -21,12 +21,19 @@ module Kovid
|
|
21
21
|
].freeze
|
22
22
|
|
23
23
|
FOOTER_LINE = ['------------', '------------', '------------', '------------'].freeze
|
24
|
+
COUNTRY_LETTERS = 'A'.upto('Z').with_index(127_462).to_h.freeze
|
24
25
|
|
25
26
|
def country_table(data)
|
26
27
|
headings = CASES_DEATHS_RECOVERED
|
27
28
|
rows = [[data['cases'], data['deaths'], data['recovered']]]
|
28
29
|
|
29
|
-
|
30
|
+
if iso = data['countryInfo']['iso2']
|
31
|
+
Terminal::Table.new(title: data['country'].upcase.to_s, headings: headings, rows: rows)
|
32
|
+
else
|
33
|
+
Terminal::Table.new(title: data['country'].upcase, headings: headings, rows: rows)
|
34
|
+
end
|
35
|
+
# TODO: Rafactor this
|
36
|
+
# TODO: Fix emoji
|
30
37
|
end
|
31
38
|
|
32
39
|
def full_country_table(data)
|
@@ -45,14 +52,22 @@ module Kovid
|
|
45
52
|
data['cases'],
|
46
53
|
data['deaths'],
|
47
54
|
data['recovered'],
|
48
|
-
data['todayCases'],
|
49
|
-
data['todayDeaths'],
|
55
|
+
check_if_positve(data['todayCases']),
|
56
|
+
check_if_positve(data['todayDeaths']),
|
50
57
|
data['critical'],
|
51
58
|
data['casesPerOneMillion']
|
52
59
|
]
|
60
|
+
|
61
|
+
# if iso = data['countryInfo']['iso2']
|
62
|
+
# Terminal::Table.new(title: "#{data['country'].upcase} #{country_emoji(iso)}",
|
63
|
+
# headings: headings,
|
64
|
+
# rows: rows)
|
65
|
+
# else
|
53
66
|
Terminal::Table.new(title: data['country'].upcase,
|
54
67
|
headings: headings,
|
55
68
|
rows: rows)
|
69
|
+
# end
|
70
|
+
# TODO: Rafactor this
|
56
71
|
end
|
57
72
|
|
58
73
|
def full_state_table(state)
|
@@ -61,12 +76,11 @@ module Kovid
|
|
61
76
|
'Cases Today'.paint_white,
|
62
77
|
'Deaths'.paint_red,
|
63
78
|
'Deaths Today'.paint_red,
|
64
|
-
'Recovered'.paint_green,
|
65
79
|
'Active'.paint_yellow
|
66
80
|
]
|
67
81
|
|
68
82
|
rows = []
|
69
|
-
rows << [state['cases'], state['todayCases'], state['deaths'], state['todayDeaths'], state['
|
83
|
+
rows << [state['cases'], check_if_positve(state['todayCases']), state['deaths'], check_if_positve(state['todayDeaths']), state['active']]
|
70
84
|
|
71
85
|
Terminal::Table.new(title: state['state'].upcase, headings: headings, rows: rows)
|
72
86
|
end
|
@@ -82,7 +96,7 @@ module Kovid
|
|
82
96
|
rows = []
|
83
97
|
|
84
98
|
data.each do |country|
|
85
|
-
rows << [country['country'].upcase, country['cases'], country['deaths'], country['recovered']]
|
99
|
+
rows << [country['country'].upcase, comma_delimit(country['cases']), comma_delimit(country['deaths']), comma_delimit(country['recovered'])]
|
86
100
|
end
|
87
101
|
|
88
102
|
Terminal::Table.new(headings: headings, rows: rows)
|
@@ -105,13 +119,13 @@ module Kovid
|
|
105
119
|
data.each do |country|
|
106
120
|
rows << [
|
107
121
|
country['country'],
|
108
|
-
country['cases'],
|
109
|
-
country['deaths'],
|
110
|
-
country['recovered'],
|
111
|
-
country['todayCases'],
|
112
|
-
country['todayDeaths'],
|
113
|
-
country['critical'],
|
114
|
-
country['casesPerOneMillion']
|
122
|
+
comma_delimit(country['cases']),
|
123
|
+
comma_delimit(country['deaths']),
|
124
|
+
comma_delimit(country['recovered']),
|
125
|
+
check_if_positve(country['todayCases']),
|
126
|
+
check_if_positve(country['todayDeaths']),
|
127
|
+
comma_delimit(country['critical']),
|
128
|
+
comma_delimit(country['casesPerOneMillion'])
|
115
129
|
]
|
116
130
|
end
|
117
131
|
|
@@ -120,7 +134,13 @@ module Kovid
|
|
120
134
|
|
121
135
|
def cases(cases)
|
122
136
|
headings = CASES_DEATHS_RECOVERED
|
123
|
-
rows = [
|
137
|
+
rows = [
|
138
|
+
[
|
139
|
+
comma_delimit(cases['cases']),
|
140
|
+
comma_delimit(cases['deaths']),
|
141
|
+
comma_delimit(cases['recovered'])
|
142
|
+
]
|
143
|
+
]
|
124
144
|
|
125
145
|
Terminal::Table.new(title: 'Total Number of Incidents Worldwide'.upcase, headings: headings, rows: rows)
|
126
146
|
end
|
@@ -164,6 +184,14 @@ module Kovid
|
|
164
184
|
def comma_delimit(number)
|
165
185
|
number.to_s.chars.to_a.reverse.each_slice(3).map(&:join).join(',').reverse
|
166
186
|
end
|
187
|
+
|
188
|
+
def check_if_positve(num)
|
189
|
+
num.to_i.positive? ? "+#{comma_delimit(num)}" : comma_delimit(num).to_s
|
190
|
+
end
|
191
|
+
|
192
|
+
def country_emoji(iso)
|
193
|
+
COUNTRY_LETTERS.values_at(*iso.chars).pack('U*')
|
194
|
+
end
|
167
195
|
end
|
168
196
|
end
|
169
197
|
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.2
|
4
|
+
version: 0.3.2
|
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-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -53,19 +53,19 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rainbow
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0
|
61
|
+
version: '3.0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0
|
68
|
+
version: '3.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: pry
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|