unipept 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/README.md +4 -4
- data/VERSION +1 -1
- data/lib/commands/unipept/api_runner.rb +64 -70
- data/lib/commands/unipept/pept2lca.rb +1 -1
- data/lib/commands/unipept/pept2prot.rb +1 -1
- data/lib/commands/unipept/pept2taxa.rb +1 -1
- data/lib/commands/unipept/taxa2lca.rb +1 -1
- data/lib/commands/unipept/taxonomy.rb +1 -1
- data/lib/commands/unipept.rb +6 -2
- data/lib/formatters.rb +91 -86
- data/lib/output_writer.rb +13 -0
- data/lib/server_message.rb +45 -0
- data/test/commands/unipept/test_api_runner.rb +28 -122
- data/test/commands/unipept/test_pept2lca.rb +52 -2
- data/test/commands/unipept/test_pept2prot.rb +40 -3
- data/test/commands/unipept/test_pept2taxa.rb +40 -3
- data/test/commands/unipept/test_taxa2lca.rb +26 -2
- data/test/commands/unipept/test_taxonomy.rb +39 -2
- data/test/test_formatters.rb +83 -13
- data/test/test_output_writer.rb +29 -0
- data/test/test_server_message.rb +92 -0
- data/unipept.gemspec +7 -4
- metadata +6 -3
- data/test/test_base.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b610ddbb209024a30cd8d1c8a6846a26953869f
|
4
|
+
data.tar.gz: d0d6b1577ca3e5ddc30d334ef0f5cc1500a1b482
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c364689109c0f29928078371edc4fd4ba7a9b60999b14537563d63784b7289322af0b2b94d8d6710bfd19508cad49bedde989a1f662ddf94ebc62b81cdc86f6
|
7
|
+
data.tar.gz: 244d132a18e970ba7d13811c0429ece4cc97bc39719336d460bac3664fe7c59dc0d361d8fadbd5cd8b5ed57cad41b62492b019b7250ec070c77e3bad4111bdd3
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -14,7 +14,7 @@ To use the Unipept CLI, Ruby version 1.9.3 or higher needs to be installed. You
|
|
14
14
|
|
15
15
|
```
|
16
16
|
$ ruby -v
|
17
|
-
ruby 2.1.
|
17
|
+
ruby 2.1.6p336 (2015-04-13 revision 50298) [x86_64-darwin14.0]
|
18
18
|
```
|
19
19
|
|
20
20
|
More information on installing Ruby can be found at https://www.ruby-lang.org/en/installation/
|
@@ -23,8 +23,8 @@ The Unipept CLI is available as a *gem*. This means it can easily be installed w
|
|
23
23
|
|
24
24
|
```bash
|
25
25
|
$ gem install unipept
|
26
|
-
Successfully installed unipept-0.
|
27
|
-
Parsing documentation for unipept-0.
|
26
|
+
Successfully installed unipept-0.9.0
|
27
|
+
Parsing documentation for unipept-0.9.0
|
28
28
|
Done installing documentation for unipept after 0 seconds
|
29
29
|
1 gem installed
|
30
30
|
```
|
@@ -33,7 +33,7 @@ After successful installation, the unipept command should be available:
|
|
33
33
|
|
34
34
|
```bash
|
35
35
|
$ unipept -v
|
36
|
-
0.
|
36
|
+
0.9.0
|
37
37
|
```
|
38
38
|
|
39
39
|
The help can be accessed by running `unipept -h`.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.9.0
|
@@ -4,25 +4,15 @@ module Unipept
|
|
4
4
|
|
5
5
|
attr_reader :url
|
6
6
|
|
7
|
-
attr_reader :message_url
|
8
|
-
|
9
7
|
attr_reader :user_agent
|
10
8
|
|
11
9
|
def initialize(args, opts, cmd)
|
12
10
|
super
|
13
11
|
@configuration = Unipept::Configuration.new
|
14
|
-
set_configuration
|
15
|
-
|
16
|
-
@url = "#{@host}/api/v1/#{cmd.name}.json"
|
17
|
-
@message_url = "#{@host}/api/v1/messages.json"
|
18
|
-
end
|
19
12
|
|
20
|
-
# Sets the configurable options of the command line app:
|
21
|
-
# - the host
|
22
|
-
# - the user agent
|
23
|
-
def set_configuration
|
24
13
|
@host = host
|
25
14
|
@user_agent = 'Unipept CLI - unipept ' + Unipept::VERSION
|
15
|
+
@url = "#{@host}/api/v1/#{cmd.name}.json"
|
26
16
|
end
|
27
17
|
|
28
18
|
# Returns the host. If a value is defined by both an option and the config
|
@@ -54,20 +44,39 @@ module Unipept
|
|
54
44
|
$stdin.each_line
|
55
45
|
end
|
56
46
|
|
57
|
-
|
47
|
+
def output_writer
|
48
|
+
@output_writer ||= OutputWriter.new(options[:output])
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns the default default_batch_size of a command.
|
52
|
+
def default_batch_size
|
53
|
+
fail NotImplementedError, 'This must be implemented in a subclass.'
|
54
|
+
end
|
55
|
+
|
56
|
+
# returns the effective batch_size of a command
|
58
57
|
def batch_size
|
59
|
-
|
58
|
+
if options[:batch]
|
59
|
+
options[:batch].to_i
|
60
|
+
else
|
61
|
+
default_batch_size
|
62
|
+
end
|
60
63
|
end
|
61
64
|
|
62
|
-
#
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
65
|
+
# Returns a new batch_iterator based on the batch_size
|
66
|
+
def batch_iterator
|
67
|
+
Unipept::BatchIterator.new(batch_size)
|
68
|
+
end
|
69
|
+
|
70
|
+
def concurrent_requests
|
71
|
+
if options[:parallel]
|
72
|
+
options[:parallel].to_i
|
73
|
+
else
|
74
|
+
10
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def queue_size
|
79
|
+
concurrent_requests * 20
|
71
80
|
end
|
72
81
|
|
73
82
|
# Returns an array of regular expressions containing all the selected fields
|
@@ -80,43 +89,27 @@ module Unipept
|
|
80
89
|
@formatter ||= Unipept::Formatter.new_for_format(options[:format])
|
81
90
|
end
|
82
91
|
|
83
|
-
#
|
84
|
-
#
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
resp = fetch_server_message
|
93
|
-
puts resp unless resp.empty?
|
94
|
-
end
|
95
|
-
|
96
|
-
# Fetches a message from the server and returns it
|
97
|
-
def fetch_server_message
|
98
|
-
Typhoeus.get(@message_url, params: { version: Unipept::VERSION }).body.chomp
|
99
|
-
end
|
100
|
-
|
101
|
-
# Returns true if the last check for a server message was less than a day
|
102
|
-
# ago.
|
103
|
-
def recently_fetched?
|
104
|
-
last_fetched = @configuration['last_fetch_date']
|
105
|
-
!last_fetched.nil? && (last_fetched + 60 * 60 * 24) > Time.now
|
106
|
-
end
|
107
|
-
|
108
|
-
# Returns a new batch_iterator based on the batch_size
|
109
|
-
def batch_iterator
|
110
|
-
Unipept::BatchIterator.new(batch_size)
|
92
|
+
# Constructs a request body (a Hash) for set of input strings, using the
|
93
|
+
# options supplied by the user.
|
94
|
+
def construct_request_body(input)
|
95
|
+
names = selected_fields.empty? || selected_fields.any? { |f| f.to_s.include? 'name' }
|
96
|
+
{ input: input,
|
97
|
+
equate_il: options[:equate] == true,
|
98
|
+
extra: options[:all] == true,
|
99
|
+
names: options[:all] == true && names
|
100
|
+
}
|
111
101
|
end
|
112
102
|
|
113
103
|
# Runs the command
|
114
104
|
def run
|
115
|
-
|
116
|
-
hydra = Typhoeus::Hydra.new(max_concurrency:
|
105
|
+
ServerMessage.new(@host).print unless options[:quiet]
|
106
|
+
hydra = Typhoeus::Hydra.new(max_concurrency: concurrent_requests)
|
117
107
|
batch_order = Unipept::BatchOrder.new
|
108
|
+
last_id = 0
|
118
109
|
|
119
110
|
batch_iterator.iterate(input_iterator) do |input_slice, batch_id, fasta_mapper|
|
111
|
+
last_id = batch_id
|
112
|
+
|
120
113
|
request = Typhoeus::Request.new(
|
121
114
|
@url,
|
122
115
|
method: :post,
|
@@ -131,10 +124,11 @@ module Unipept
|
|
131
124
|
end
|
132
125
|
|
133
126
|
hydra.queue request
|
134
|
-
hydra.run if batch_id %
|
127
|
+
hydra.run if batch_id % queue_size == 0
|
135
128
|
end
|
136
129
|
|
137
130
|
hydra.run
|
131
|
+
batch_order.wait(last_id + 1) { output_writer.write_line formatter.footer }
|
138
132
|
end
|
139
133
|
|
140
134
|
# Saves an error to a new file in the .unipept directory in the users home
|
@@ -146,16 +140,6 @@ module Unipept
|
|
146
140
|
$stderr.puts "API request failed! log can be found in #{path}"
|
147
141
|
end
|
148
142
|
|
149
|
-
# Write a string to the output defined by the command. If a file is given,
|
150
|
-
# write it to the file. If not, write to stdout
|
151
|
-
def write_to_output(string)
|
152
|
-
if options[:output]
|
153
|
-
File.open(options[:output], 'a') { |f| f.write string }
|
154
|
-
else
|
155
|
-
puts string
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
143
|
private
|
160
144
|
|
161
145
|
def error_file_path
|
@@ -166,15 +150,25 @@ module Unipept
|
|
166
150
|
# Returns a block to execute.
|
167
151
|
def handle_response(response, batch_id, fasta_mapper)
|
168
152
|
if response.success?
|
169
|
-
|
153
|
+
handle_success_response(response, batch_id, fasta_mapper)
|
154
|
+
else
|
155
|
+
handle_failed_response(response)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def handle_success_response(response, batch_id, fasta_mapper)
|
160
|
+
result = filter_result(response.response_body)
|
170
161
|
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
end
|
162
|
+
lambda do
|
163
|
+
unless result.empty?
|
164
|
+
output_writer.write_line formatter.header(result, fasta_mapper) if batch_id == 0
|
165
|
+
output_writer.write_line formatter.format(result, fasta_mapper, batch_id == 0)
|
176
166
|
end
|
177
|
-
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def handle_failed_response(response)
|
171
|
+
if response.timed_out?
|
178
172
|
-> { save_error('request timed out, continuing anyway, but results might be incomplete') }
|
179
173
|
elsif response.code == 0
|
180
174
|
-> { save_error('could not get an http response, continuing anyway, but results might be incomplete' + response.return_message) }
|
data/lib/commands/unipept.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'typhoeus'
|
2
2
|
|
3
|
-
require_relative '../formatters'
|
4
|
-
require_relative '../configuration'
|
5
3
|
require_relative '../batch_order'
|
6
4
|
require_relative '../batch_iterator'
|
5
|
+
require_relative '../configuration'
|
6
|
+
require_relative '../formatters'
|
7
|
+
require_relative '../output_writer'
|
8
|
+
require_relative '../server_message'
|
7
9
|
require_relative '../version'
|
8
10
|
|
9
11
|
require_relative 'unipept/config'
|
@@ -50,6 +52,8 @@ module Unipept
|
|
50
52
|
flag :v, :version, 'displays the version'
|
51
53
|
flag :q, :quiet, 'disable service messages'
|
52
54
|
option :i, :input, 'read input from file', argument: :required
|
55
|
+
option nil, :batch, 'specify the batch size', argument: :required, hidden: true
|
56
|
+
option nil, :parallel, 'specify the number of parallel requests', argument: :required, hidden: true
|
53
57
|
option :o, :output, 'write output to file', argument: :required
|
54
58
|
option :f, :format, "define the output format (available: #{Unipept::Formatter.available.join ', ' }) (default: #{Unipept::Formatter.default})", argument: :required
|
55
59
|
|
data/lib/formatters.rb
CHANGED
@@ -42,7 +42,7 @@ module Unipept
|
|
42
42
|
|
43
43
|
# @return [String] The type of the current formatter
|
44
44
|
def type
|
45
|
-
''
|
45
|
+
fail NotImplementedError, 'This must be implemented in a subclass.'
|
46
46
|
end
|
47
47
|
|
48
48
|
# Returns the header row for the given sample_data and fasta_mapper. This
|
@@ -58,7 +58,15 @@ module Unipept
|
|
58
58
|
#
|
59
59
|
# @return [String] The header row
|
60
60
|
def header(_sample_data, _fasta_mapper = nil)
|
61
|
-
''
|
61
|
+
fail NotImplementedError, 'This must be implemented in a subclass.'
|
62
|
+
end
|
63
|
+
|
64
|
+
# Returns the footer row. This row is output only once at the end of the
|
65
|
+
# output
|
66
|
+
#
|
67
|
+
# @return [String] The footer row
|
68
|
+
def footer
|
69
|
+
fail NotImplementedError, 'This must be implemented in a subclass.'
|
62
70
|
end
|
63
71
|
|
64
72
|
# Converts the given input data and corresponding fasta headers to another
|
@@ -66,14 +74,55 @@ module Unipept
|
|
66
74
|
#
|
67
75
|
# @param [Array] data The data we wish to convert
|
68
76
|
#
|
69
|
-
# @param [Array<Array<String>>]
|
77
|
+
# @param [Array<Array<String>>] fasta_mapper Optional mapping between input
|
70
78
|
# data and corresponding fasta header. The data is represented as a list
|
71
79
|
# containing tuples where the first element is the fasta header and second
|
72
80
|
# element is the input data
|
73
81
|
#
|
82
|
+
# @param [Boolean] Is this the first output batch?
|
83
|
+
#
|
74
84
|
# @return [String] The converted input data
|
75
|
-
def format(data,
|
76
|
-
data
|
85
|
+
def format(data, fasta_mapper = nil, first)
|
86
|
+
data = integrate_fasta_headers(data, fasta_mapper) if fasta_mapper
|
87
|
+
convert(data, first)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Converts the given input data to another format.
|
91
|
+
#
|
92
|
+
# @param [Array] data The data we wish to convert
|
93
|
+
#
|
94
|
+
# @param [Boolean] Is this the first output batch?
|
95
|
+
#
|
96
|
+
# @return [String] The converted input data
|
97
|
+
def convert(_data, _first)
|
98
|
+
fail NotImplementedError, 'This must be implemented in a subclass.'
|
99
|
+
end
|
100
|
+
|
101
|
+
# Integrates the fasta headers into the data object
|
102
|
+
def integrate_fasta_headers(data, fasta_mapper)
|
103
|
+
data_dict = group_by_first_key(data)
|
104
|
+
data = fasta_mapper.map do |header, key|
|
105
|
+
result = data_dict[key]
|
106
|
+
unless result.nil?
|
107
|
+
result = result.map do |row|
|
108
|
+
copy = { fasta_header: header }
|
109
|
+
copy.merge(row)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
result
|
113
|
+
end
|
114
|
+
data.compact.flatten(1)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Groups the data by the first key of each element, for example
|
118
|
+
# [{key1: v1, key2: v2},{key1: v1, key2: v3},{key1: v4, key2: v2}]
|
119
|
+
# to {v1 => [{key1: v1, key2: v2},{key1: v1, key2: v3}], v4 => [{key1: v4, key2: v2}]}
|
120
|
+
#
|
121
|
+
# @param [Array<Hash>] data The data we wish to group
|
122
|
+
#
|
123
|
+
# @return [Hash] The input data grouped by the first key
|
124
|
+
def group_by_first_key(data)
|
125
|
+
data.group_by { |el| el.values.first.to_s }
|
77
126
|
end
|
78
127
|
end
|
79
128
|
|
@@ -86,20 +135,24 @@ module Unipept
|
|
86
135
|
'json'
|
87
136
|
end
|
88
137
|
|
89
|
-
|
90
|
-
|
138
|
+
def header(_data, _fasta_mapper = nil)
|
139
|
+
'['
|
140
|
+
end
|
141
|
+
|
142
|
+
def footer
|
143
|
+
"]\n"
|
144
|
+
end
|
145
|
+
|
146
|
+
# Converts the given input data to the JSON format.
|
91
147
|
#
|
92
148
|
# @param [Array] data The data we wish to convert
|
93
149
|
#
|
94
|
-
# @param [
|
95
|
-
# data and corresponding fasta header. The data is represented as a list
|
96
|
-
# containing tuples where the first element is the fasta header and second
|
97
|
-
# element is the input data
|
150
|
+
# @param [Boolean] Is this the first output batch?
|
98
151
|
#
|
99
|
-
# @return [String] The input data
|
100
|
-
def
|
101
|
-
|
102
|
-
|
152
|
+
# @return [String] The converted input data in the JSON format
|
153
|
+
def convert(data, first)
|
154
|
+
output = data.map(&:to_json).join(',')
|
155
|
+
first ? output : ',' + output
|
103
156
|
end
|
104
157
|
end
|
105
158
|
|
@@ -133,75 +186,24 @@ module Unipept
|
|
133
186
|
end
|
134
187
|
end
|
135
188
|
|
136
|
-
|
137
|
-
|
138
|
-
#
|
139
|
-
# @param [Array] data The data we wish to convert
|
140
|
-
#
|
141
|
-
# @param [Array<Array<String>>] fasta_mapper Optional mapping between input
|
142
|
-
# data and corresponding fasta header. The data is represented as a list
|
143
|
-
# containing tuples where the first element is the fasta header and second
|
144
|
-
# element is the input data
|
145
|
-
#
|
146
|
-
# @return [String] The converted input data into the csv format
|
147
|
-
def format(data, fasta_mapper = nil)
|
148
|
-
CSV.generate do |csv|
|
149
|
-
if fasta_mapper
|
150
|
-
format_fasta(csv, data, fasta_mapper)
|
151
|
-
else
|
152
|
-
format_normal(csv, data)
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
# Converts the given input data and corresponding fasta headers to the csv
|
158
|
-
# format
|
159
|
-
#
|
160
|
-
# @param [CSV] csv object we write the csv output to
|
161
|
-
#
|
162
|
-
# @param [Array] data The data we wish to convert
|
163
|
-
#
|
164
|
-
# @return [String] The converted input data into the csv format
|
165
|
-
def format_normal(csv, data)
|
166
|
-
data.each do |o|
|
167
|
-
csv << o.values.map { |v| v == '' ? nil : v }
|
168
|
-
end
|
189
|
+
def footer
|
190
|
+
''
|
169
191
|
end
|
170
192
|
|
171
|
-
# Converts the given input data
|
172
|
-
# format
|
173
|
-
#
|
174
|
-
# @param [CSV] csv object we write the csv output to
|
193
|
+
# Converts the given input data to the CSV format.
|
175
194
|
#
|
176
195
|
# @param [Array] data The data we wish to convert
|
177
196
|
#
|
178
|
-
# @param [
|
179
|
-
# data and corresponding fasta header. The data is represented as a list
|
180
|
-
# containing tuples where the first element is the fasta header and second
|
181
|
-
# element is the input data
|
197
|
+
# @param [Boolean] Is this the first output batch?
|
182
198
|
#
|
183
|
-
# @return [String] The converted input data
|
184
|
-
def
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
data_dict[key].each do |r|
|
190
|
-
csv << ([fasta_header] + r.values).map { |v| v == '' ? nil : v }
|
199
|
+
# @return [String] The converted input data in the CSV format
|
200
|
+
def convert(data, _first)
|
201
|
+
CSV.generate do |csv|
|
202
|
+
data.each do |o|
|
203
|
+
csv << o.values.map { |v| v == '' ? nil : v }
|
191
204
|
end
|
192
205
|
end
|
193
206
|
end
|
194
|
-
|
195
|
-
# Groups the data by the first key of each element, for example
|
196
|
-
# [{key1: v1, key2: v2},{key1: v1, key2: v3},{key1: v4, key2: v2}]
|
197
|
-
# to {v1 => [{key1: v1, key2: v2},{key1: v1, key2: v3}], v4 => [{key1: v4, key2: v2}]]
|
198
|
-
#
|
199
|
-
# @param [Array<Hash>] data The data we wish to Groups
|
200
|
-
#
|
201
|
-
# @return [Hash] The input data grouped by the first key
|
202
|
-
def group_by_first_key(data)
|
203
|
-
data.group_by { |el| el.values.first.to_s }
|
204
|
-
end
|
205
207
|
end
|
206
208
|
|
207
209
|
class XMLFormatter < Formatter
|
@@ -215,7 +217,7 @@ module Unipept
|
|
215
217
|
|
216
218
|
class ::Array
|
217
219
|
def to_xml(array_name = :array, _item_name = :item)
|
218
|
-
%(<#{array_name}
|
220
|
+
%(<#{array_name}>) + map { |n|n.to_xml(:item) }.join + "</#{array_name}>"
|
219
221
|
end
|
220
222
|
end
|
221
223
|
|
@@ -233,20 +235,23 @@ module Unipept
|
|
233
235
|
'xml'
|
234
236
|
end
|
235
237
|
|
236
|
-
|
237
|
-
|
238
|
+
def header(_data, _fasta_mapper = nil)
|
239
|
+
'<results>'
|
240
|
+
end
|
241
|
+
|
242
|
+
def footer
|
243
|
+
"</results>\n"
|
244
|
+
end
|
245
|
+
|
246
|
+
# Converts the given input data to the XML format.
|
238
247
|
#
|
239
248
|
# @param [Array] data The data we wish to convert
|
240
249
|
#
|
241
|
-
# @param [
|
242
|
-
# data and corresponding fasta header. The data is represented as a list
|
243
|
-
# containing tuples where the first element is the fasta header and second
|
244
|
-
# element is the input data
|
250
|
+
# @param [Boolean] Is this the first output batch?
|
245
251
|
#
|
246
|
-
# @return [String] The input data
|
247
|
-
def
|
248
|
-
|
249
|
-
data.to_xml
|
252
|
+
# @return [String] The converted input data in the XML format
|
253
|
+
def convert(data, _first)
|
254
|
+
data.map { |row| '<result>' + row.to_xml + '</result>' }.join('')
|
250
255
|
end
|
251
256
|
end
|
252
257
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'typhoeus'
|
2
|
+
|
3
|
+
require_relative 'configuration'
|
4
|
+
|
5
|
+
module Unipept
|
6
|
+
class ServerMessage
|
7
|
+
attr_reader :message_url
|
8
|
+
|
9
|
+
attr_reader :configuration
|
10
|
+
|
11
|
+
def initialize(host)
|
12
|
+
@message_url = "#{host}/api/v1/messages.json"
|
13
|
+
@configuration = Unipept::Configuration.new
|
14
|
+
end
|
15
|
+
|
16
|
+
# Checks if the server has a message and prints it if not empty.
|
17
|
+
# We will only check this once a day and won't print anything if the quiet
|
18
|
+
# option is set or if we output to a file.
|
19
|
+
def print
|
20
|
+
return unless $stdout.tty?
|
21
|
+
return if recently_fetched?
|
22
|
+
resp = fetch_server_message
|
23
|
+
update_fetched
|
24
|
+
puts resp unless resp.empty?
|
25
|
+
end
|
26
|
+
|
27
|
+
# Fetches a message from the server and returns it
|
28
|
+
def fetch_server_message
|
29
|
+
Typhoeus.get(@message_url, params: { version: Unipept::VERSION }).body.chomp
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns true if the last check for a server message was less than a day
|
33
|
+
# ago.
|
34
|
+
def recently_fetched?
|
35
|
+
last_fetched = @configuration['last_fetch_date']
|
36
|
+
!last_fetched.nil? && (last_fetched + 60 * 60 * 24) > Time.now
|
37
|
+
end
|
38
|
+
|
39
|
+
# Updates the last checked timestamp
|
40
|
+
def update_fetched
|
41
|
+
@configuration['last_fetch_date'] = Time.now
|
42
|
+
@configuration.save
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|