zold 0.14.39 → 0.14.40
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/.rultor.yml +4 -2
- data/bin/zold +2 -0
- data/lib/zold/commands/fetch.rb +3 -2
- data/lib/zold/commands/pay.rb +2 -2
- data/lib/zold/commands/push.rb +3 -2
- data/lib/zold/commands/remote.rb +6 -4
- data/lib/zold/commands/taxes.rb +3 -2
- data/lib/zold/gem.rb +5 -10
- data/lib/zold/http.rb +6 -1
- data/lib/zold/json_page.rb +4 -3
- data/lib/zold/node/front.rb +6 -5
- data/lib/zold/remotes.rb +38 -32
- data/lib/zold/score.rb +0 -1
- data/lib/zold/version.rb +1 -1
- data/resources/remotes +0 -0
- data/test/commands/test_remote.rb +4 -4
- data/test/node/test_front.rb +5 -0
- data/test/test_gem.rb +7 -3
- data/test/test_remotes.rb +39 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7b45f4c26031db16e0648325a3bb697fd815f30
|
4
|
+
data.tar.gz: 4ef739093a92027005789d04be4b70e2607eed47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aee52e4cd446e7c235f3edf8fbd4a0116772c02e0983e33f010424f286daa7fe6cfeae243d7d7d8cbef471c7a734bfb58464e9dc1a1a1d60196279885e891056
|
7
|
+
data.tar.gz: ad64f721708ac64e46ab64c3e3276cce4e429f6d98cf52b6d9d213f30f916060af9af49f85ffb000ec8c91797c34d731f4e78d8f29c23461c2ae7ba102ed3b6d
|
data/.rultor.yml
CHANGED
@@ -3,6 +3,8 @@ assets:
|
|
3
3
|
id_rsa: zerocracy/home#assets/heroku-key
|
4
4
|
id_rsa.pub: zerocracy/home#assets/heroku-key.pub
|
5
5
|
install: |
|
6
|
+
export GEM_HOME=~/.ruby
|
7
|
+
export GEM_PATH=$GEM_HOME:$GEM_PATH
|
6
8
|
sudo apt-get -y update
|
7
9
|
sudo gem install pdd
|
8
10
|
release:
|
@@ -11,8 +13,8 @@ release:
|
|
11
13
|
[[ "${tag}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || exit -1
|
12
14
|
rm -rf *.gem
|
13
15
|
sed -i "s/0\.0\.0/${tag}/g" lib/zold/version.rb
|
14
|
-
bundle install
|
15
|
-
rake
|
16
|
+
bundle install --no-color
|
17
|
+
rake
|
16
18
|
git add lib/zold/version.rb
|
17
19
|
git commit -m "version set to ${tag}"
|
18
20
|
gem build zold.gemspec
|
data/bin/zold
CHANGED
@@ -176,6 +176,8 @@ Available options:"
|
|
176
176
|
remotes = Zold::Remotes.new(file: File.join(zoldata, 'remotes'), network: opts['network'])
|
177
177
|
copies = File.join(zoldata, 'copies')
|
178
178
|
|
179
|
+
log.debug("Network: #{opts['network']}")
|
180
|
+
|
179
181
|
case command
|
180
182
|
when 'node'
|
181
183
|
require_relative '../lib/zold/commands/node'
|
data/lib/zold/commands/fetch.rb
CHANGED
@@ -104,10 +104,11 @@ Available options:"
|
|
104
104
|
@log.debug("#{r} ignored because of --ignore-node")
|
105
105
|
return 0
|
106
106
|
end
|
107
|
-
|
107
|
+
uri = "/wallet/#{id}"
|
108
|
+
res = r.http(uri).get
|
108
109
|
raise "Wallet #{id} not found" if res.code == '404'
|
109
110
|
r.assert_code(200, res)
|
110
|
-
json = JsonPage.new(res.body).to_hash
|
111
|
+
json = JsonPage.new(res.body, uri).to_hash
|
111
112
|
score = Score.parse_json(json['score'])
|
112
113
|
r.assert_valid_score(score)
|
113
114
|
r.assert_score_ownership(score)
|
data/lib/zold/commands/pay.rb
CHANGED
@@ -78,7 +78,7 @@ Available options:"
|
|
78
78
|
raise 'Amount is required (in ZLD) as the third argument' if mine[2].nil?
|
79
79
|
amount = Amount.new(zld: mine[2].to_f)
|
80
80
|
details = mine[3] || '-'
|
81
|
-
taxes(id)
|
81
|
+
taxes(id, opts)
|
82
82
|
@wallets.find(id) do |from|
|
83
83
|
pay(from, invoice, amount, details, opts)
|
84
84
|
end
|
@@ -89,7 +89,7 @@ Available options:"
|
|
89
89
|
|
90
90
|
private
|
91
91
|
|
92
|
-
def taxes(id)
|
92
|
+
def taxes(id, opts)
|
93
93
|
debt = @wallets.find(id) do |wallet|
|
94
94
|
raise "Wallet #{id} doesn't exist, do 'zold pull' first" unless wallet.exists?
|
95
95
|
Tax.new(wallet).in_debt? && !opts['dont-pay-taxes']
|
data/lib/zold/commands/push.rb
CHANGED
@@ -91,7 +91,8 @@ total score for #{id} is #{total}")
|
|
91
91
|
raise "The wallet #{id} is absent" unless wallet.exists?
|
92
92
|
AtomicFile.new(wallet.path).read
|
93
93
|
end
|
94
|
-
|
94
|
+
uri = "/wallet/#{id}"
|
95
|
+
response = r.http(uri).put(content)
|
95
96
|
@wallets.find(id) do |wallet|
|
96
97
|
if response.code == '304'
|
97
98
|
@log.info("#{r}: same version #{content.length}b/#{wallet.txns.count}t \
|
@@ -99,7 +100,7 @@ of #{wallet.id} there, in #{(Time.now - start).round(2)}s")
|
|
99
100
|
return 0
|
100
101
|
end
|
101
102
|
r.assert_code(200, response)
|
102
|
-
json = JsonPage.new(response.body).to_hash
|
103
|
+
json = JsonPage.new(response.body, uri).to_hash
|
103
104
|
score = Score.parse_json(json['score'])
|
104
105
|
r.assert_valid_score(score)
|
105
106
|
r.assert_score_ownership(score)
|
data/lib/zold/commands/remote.rb
CHANGED
@@ -183,9 +183,10 @@ Available options:"
|
|
183
183
|
def elect(opts)
|
184
184
|
scores = []
|
185
185
|
@remotes.iterate(@log, farm: @farm) do |r|
|
186
|
-
|
186
|
+
uri = '/'
|
187
|
+
res = r.http(uri).get
|
187
188
|
r.assert_code(200, res)
|
188
|
-
json = JsonPage.new(res.body).to_hash
|
189
|
+
json = JsonPage.new(res.body, uri).to_hash
|
189
190
|
score = Score.parse_json(json['score'])
|
190
191
|
r.assert_valid_score(score)
|
191
192
|
r.assert_score_ownership(score)
|
@@ -216,9 +217,10 @@ Available options:"
|
|
216
217
|
capacity = []
|
217
218
|
@remotes.iterate(@log, farm: @farm) do |r|
|
218
219
|
start = Time.now
|
219
|
-
|
220
|
+
uri = '/remotes'
|
221
|
+
res = r.http(uri).get
|
220
222
|
r.assert_code(200, res)
|
221
|
-
json = JsonPage.new(res.body).to_hash
|
223
|
+
json = JsonPage.new(res.body, uri).to_hash
|
222
224
|
score = Score.parse_json(json['score'])
|
223
225
|
r.assert_valid_score(score)
|
224
226
|
r.assert_score_ownership(score)
|
data/lib/zold/commands/taxes.rb
CHANGED
@@ -139,9 +139,10 @@ Available options:"
|
|
139
139
|
def top_scores
|
140
140
|
best = []
|
141
141
|
@remotes.iterate(@log) do |r|
|
142
|
-
|
142
|
+
uri = '/'
|
143
|
+
res = r.http(uri).get
|
143
144
|
r.assert_code(200, res)
|
144
|
-
json = JsonPage.new(res.body).to_hash
|
145
|
+
json = JsonPage.new(res.body, uri).to_hash
|
145
146
|
score = Score.parse_json(json['score'])
|
146
147
|
r.assert_valid_score(score)
|
147
148
|
r.assert_score_strength(score)
|
data/lib/zold/gem.rb
CHANGED
@@ -21,8 +21,9 @@
|
|
21
21
|
# SOFTWARE.
|
22
22
|
|
23
23
|
require 'uri'
|
24
|
-
require 'net/http'
|
25
24
|
require_relative 'json_page'
|
25
|
+
require_relative 'http'
|
26
|
+
require_relative 'score'
|
26
27
|
|
27
28
|
# Class representing the Zold gem on Rubygems
|
28
29
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
@@ -31,16 +32,10 @@ require_relative 'json_page'
|
|
31
32
|
module Zold
|
32
33
|
# Gem
|
33
34
|
class Gem
|
34
|
-
BASE_URI = 'rubygems.org'
|
35
|
-
API_VERSION = '/api/v1/'
|
36
|
-
|
37
35
|
def last_version
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
path += '?' + uri.query if uri.query
|
42
|
-
res = http.request_get(path)
|
43
|
-
JsonPage.new(res.body).to_hash['version']
|
36
|
+
JsonPage.new(
|
37
|
+
Http.new(uri: 'https://rubygems.org/api/v1/versions/zold/latest.json', score: Score::ZERO).get.body
|
38
|
+
).to_hash['version']
|
44
39
|
end
|
45
40
|
end
|
46
41
|
end
|
data/lib/zold/http.rb
CHANGED
@@ -25,7 +25,6 @@ require 'uri'
|
|
25
25
|
require 'net/http'
|
26
26
|
require_relative 'backtrace'
|
27
27
|
require_relative 'version'
|
28
|
-
require_relative 'score'
|
29
28
|
require_relative 'type'
|
30
29
|
|
31
30
|
# HTTP page.
|
@@ -72,6 +71,7 @@ module Zold
|
|
72
71
|
|
73
72
|
def get
|
74
73
|
http = Net::HTTP.new(uri.host, uri.port)
|
74
|
+
http.use_ssl = uri.scheme == 'https'
|
75
75
|
http.read_timeout = Http::READ_TIMEOUT
|
76
76
|
http.open_timeout = Http::CONNECT_TIMEOUT
|
77
77
|
path = uri.path
|
@@ -83,6 +83,7 @@ module Zold
|
|
83
83
|
|
84
84
|
def put(body)
|
85
85
|
http = Net::HTTP.new(uri.host, uri.port)
|
86
|
+
http.use_ssl = uri.scheme == 'https'
|
86
87
|
http.read_timeout = Http::READ_TIMEOUT
|
87
88
|
http.open_timeout = Http::CONNECT_TIMEOUT
|
88
89
|
path = uri.path
|
@@ -106,6 +107,10 @@ module Zold
|
|
106
107
|
@ex = ex
|
107
108
|
end
|
108
109
|
|
110
|
+
def to_s
|
111
|
+
"#{code}: #{message}\n#{body}"
|
112
|
+
end
|
113
|
+
|
109
114
|
def body
|
110
115
|
Backtrace.new(@ex).to_s
|
111
116
|
end
|
data/lib/zold/json_page.rb
CHANGED
@@ -29,17 +29,18 @@ require 'json'
|
|
29
29
|
module Zold
|
30
30
|
# JSON page
|
31
31
|
class JsonPage
|
32
|
-
def initialize(text)
|
32
|
+
def initialize(text, uri = '')
|
33
33
|
raise 'JSON text can\'t be nil' if text.nil?
|
34
34
|
raise 'JSON must be of type String' unless text.is_a?(String)
|
35
35
|
@text = text
|
36
|
+
@uri = uri
|
36
37
|
end
|
37
38
|
|
38
39
|
def to_hash
|
39
|
-
raise 'JSON is empty, can\'t parse' if @text.empty?
|
40
|
+
raise 'JSON is empty, can\'t parse' + (@uri.empty? ? '' : " at #{@uri}") if @text.empty?
|
40
41
|
JSON.parse(@text)
|
41
42
|
rescue JSON::ParserError => e
|
42
|
-
raise "Failed to parse JSON (#{e.message}): #{@text}"
|
43
|
+
raise "Failed to parse JSON #{@uri.empty? ? '' : "at #{@uri}"} (#{e.message}): #{@text}"
|
43
44
|
end
|
44
45
|
end
|
45
46
|
end
|
data/lib/zold/node/front.rb
CHANGED
@@ -193,7 +193,7 @@ while #{settings.address} is in '#{settings.network}'"
|
|
193
193
|
settings.wallets.find(id) do |wallet|
|
194
194
|
error 404 unless wallet.exists?
|
195
195
|
content_type 'application/json'
|
196
|
-
|
196
|
+
JSON.pretty_generate(
|
197
197
|
version: settings.version,
|
198
198
|
alias: settings.node_alias,
|
199
199
|
protocol: settings.protocol,
|
@@ -206,7 +206,7 @@ while #{settings.address} is in '#{settings.network}'"
|
|
206
206
|
copies: Copies.new(File.join(settings.copies, id)).all.count,
|
207
207
|
balance: wallet.balance.to_i,
|
208
208
|
body: AtomicFile.new(wallet.path).read
|
209
|
-
|
209
|
+
)
|
210
210
|
end
|
211
211
|
end
|
212
212
|
|
@@ -215,7 +215,7 @@ while #{settings.address} is in '#{settings.network}'"
|
|
215
215
|
settings.wallets.find(id) do |wallet|
|
216
216
|
error 404 unless wallet.exists?
|
217
217
|
content_type 'application/json'
|
218
|
-
|
218
|
+
JSON.pretty_generate(
|
219
219
|
version: settings.version,
|
220
220
|
alias: settings.node_alias,
|
221
221
|
protocol: settings.protocol,
|
@@ -227,7 +227,7 @@ while #{settings.address} is in '#{settings.network}'"
|
|
227
227
|
digest: wallet.digest,
|
228
228
|
balance: wallet.balance.to_i,
|
229
229
|
txns: wallet.txns.count
|
230
|
-
|
230
|
+
)
|
231
231
|
end
|
232
232
|
end
|
233
233
|
|
@@ -350,7 +350,8 @@ while #{settings.address} is in '#{settings.network}'"
|
|
350
350
|
version: settings.version,
|
351
351
|
alias: settings.node_alias,
|
352
352
|
score: score.to_h,
|
353
|
-
all: settings.remotes.all
|
353
|
+
all: settings.remotes.all,
|
354
|
+
mtime: settings.remotes.mtime.utc.iso8601
|
354
355
|
)
|
355
356
|
end
|
356
357
|
|
data/lib/zold/remotes.rb
CHANGED
@@ -39,7 +39,7 @@ require_relative 'type'
|
|
39
39
|
# License:: MIT
|
40
40
|
module Zold
|
41
41
|
# All remotes
|
42
|
-
class Remotes
|
42
|
+
class Remotes < Dry::Struct
|
43
43
|
# The default TCP port all nodes are supposed to use.
|
44
44
|
PORT = 4096
|
45
45
|
|
@@ -49,6 +49,13 @@ module Zold
|
|
49
49
|
# Default number of nodes to fetch.
|
50
50
|
MAX_NODES = 16
|
51
51
|
|
52
|
+
# Mutex object
|
53
|
+
MUTEX = Mutex.new
|
54
|
+
|
55
|
+
attribute :file, Types::Strict::String
|
56
|
+
attribute :network, Types::Strict::String.optional.default('test')
|
57
|
+
attribute :timeout, Types::Strict::Integer.optional.default(16)
|
58
|
+
|
52
59
|
# Empty, for standalone mode
|
53
60
|
class Empty < Remotes
|
54
61
|
def all
|
@@ -58,13 +65,17 @@ module Zold
|
|
58
65
|
def iterate(_)
|
59
66
|
# Nothing to do here
|
60
67
|
end
|
68
|
+
|
69
|
+
def mtime
|
70
|
+
Time.now
|
71
|
+
end
|
61
72
|
end
|
62
73
|
|
63
74
|
# One remote.
|
64
75
|
class Remote < Dry::Struct
|
65
76
|
attribute :host, Types::Strict::String
|
66
77
|
attribute :port, Types::Strict::Integer.constrained(gteq: 0, lt: 65_535)
|
67
|
-
attribute :score,
|
78
|
+
attribute :score, Score
|
68
79
|
attribute :idx, Types::Strict::Integer
|
69
80
|
attribute :network, Types::Strict::String.optional.default('test')
|
70
81
|
attribute :log, (Types::Class.constructor do |value|
|
@@ -106,24 +117,15 @@ module Zold
|
|
106
117
|
end
|
107
118
|
end
|
108
119
|
|
109
|
-
def initialize(file:, network: 'test', mutex: Mutex.new, timeout: 16)
|
110
|
-
@file = file
|
111
|
-
@network = network
|
112
|
-
@mutex = mutex
|
113
|
-
@timeout = timeout
|
114
|
-
end
|
115
|
-
|
116
120
|
def all
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
end.reverse
|
126
|
-
end
|
121
|
+
list = load
|
122
|
+
max_score = list.map { |r| r[:score] }.max || 0
|
123
|
+
max_score = 1 if max_score.zero?
|
124
|
+
max_errors = list.map { |r| r[:errors] }.max || 0
|
125
|
+
max_errors = 1 if max_errors.zero?
|
126
|
+
list.sort_by do |r|
|
127
|
+
(1 - r[:errors] / max_errors) * 5 + (r[:score] / max_score)
|
128
|
+
end.reverse
|
127
129
|
end
|
128
130
|
|
129
131
|
def clean
|
@@ -131,10 +133,10 @@ module Zold
|
|
131
133
|
end
|
132
134
|
|
133
135
|
def reset
|
134
|
-
FileUtils.mkdir_p(File.dirname(
|
136
|
+
FileUtils.mkdir_p(File.dirname(file))
|
135
137
|
FileUtils.copy(
|
136
138
|
File.join(File.dirname(__FILE__), '../../resources/remotes'),
|
137
|
-
|
139
|
+
file
|
138
140
|
)
|
139
141
|
end
|
140
142
|
|
@@ -154,7 +156,7 @@ module Zold
|
|
154
156
|
raise 'Port can\'t be negative' if port.negative?
|
155
157
|
raise 'Port can\'t be over 65536' if port > 0xffff
|
156
158
|
modify do |list|
|
157
|
-
list + [{ host: host.downcase, port: port, score: 0 }]
|
159
|
+
list + [{ host: host.downcase, port: port, score: 0, errors: 0 }]
|
158
160
|
end
|
159
161
|
end
|
160
162
|
|
@@ -189,10 +191,10 @@ module Zold
|
|
189
191
|
score: score,
|
190
192
|
idx: idx,
|
191
193
|
log: log,
|
192
|
-
network:
|
194
|
+
network: network
|
193
195
|
)
|
194
196
|
idx += 1
|
195
|
-
raise 'Took too long to execute' if (Time.now - start).round >
|
197
|
+
raise 'Took too long to execute' if (Time.now - start).round > timeout
|
196
198
|
rescue StandardError => e
|
197
199
|
error(r[:host], r[:port])
|
198
200
|
log.info("#{Rainbow("#{r[:host]}:#{r[:port]}").red}: #{e.message} \
|
@@ -221,10 +223,14 @@ in #{(Time.now - start).round}s")
|
|
221
223
|
if_present(host, port) { |r| r[:score] = score }
|
222
224
|
end
|
223
225
|
|
226
|
+
def mtime
|
227
|
+
File.mtime(file)
|
228
|
+
end
|
229
|
+
|
224
230
|
private
|
225
231
|
|
226
232
|
def modify
|
227
|
-
|
233
|
+
Remotes::MUTEX.synchronize do
|
228
234
|
save(yield(load))
|
229
235
|
end
|
230
236
|
end
|
@@ -239,13 +245,13 @@ in #{(Time.now - start).round}s")
|
|
239
245
|
end
|
240
246
|
|
241
247
|
def load
|
242
|
-
reset unless File.exist?(
|
243
|
-
raw = CSV.read(
|
248
|
+
reset unless File.exist?(file)
|
249
|
+
raw = CSV.read(file).map do |row|
|
244
250
|
{
|
245
|
-
host:
|
246
|
-
port:
|
247
|
-
score:
|
248
|
-
errors:
|
251
|
+
host: row[0],
|
252
|
+
port: row[1].to_i,
|
253
|
+
score: row[2].to_i,
|
254
|
+
errors: row[3].to_i
|
249
255
|
}
|
250
256
|
end
|
251
257
|
raw.reject { |r| !r[:host] || r[:port].zero? }.map do |r|
|
@@ -255,7 +261,7 @@ in #{(Time.now - start).round}s")
|
|
255
261
|
end
|
256
262
|
|
257
263
|
def save(list)
|
258
|
-
AtomicFile.new(
|
264
|
+
AtomicFile.new(file).write(
|
259
265
|
list.uniq { |r| "#{r[:host]}:#{r[:port]}" }.map do |r|
|
260
266
|
[
|
261
267
|
r[:host],
|
data/lib/zold/score.rb
CHANGED
data/lib/zold/version.rb
CHANGED
data/resources/remotes
CHANGED
File without changes
|
@@ -61,7 +61,7 @@ class TestRemote < Minitest::Test
|
|
61
61
|
stub_request(:get, 'http://localhost:999/remotes').to_return(
|
62
62
|
status: 404
|
63
63
|
)
|
64
|
-
stub_request(:get, '
|
64
|
+
stub_request(:get, 'https://rubygems.org/api/v1/versions/zold/latest.json').to_return(
|
65
65
|
status: 200,
|
66
66
|
body: '{"version": "0.0.0"}'
|
67
67
|
)
|
@@ -90,7 +90,7 @@ class TestRemote < Minitest::Test
|
|
90
90
|
]
|
91
91
|
}.to_json
|
92
92
|
)
|
93
|
-
stub_request(:get, '
|
93
|
+
stub_request(:get, 'https://rubygems.org/api/v1/versions/zold/latest.json').to_return(
|
94
94
|
status: 200,
|
95
95
|
body: '{"version": "9.9.9"}'
|
96
96
|
)
|
@@ -101,7 +101,7 @@ class TestRemote < Minitest::Test
|
|
101
101
|
cmd.run(['remote', 'update', '--ignore-score-weakness', '--skip-ping', '--reboot'])
|
102
102
|
assert(log.msg.to_s.include?(', reboot!'))
|
103
103
|
log.msg = []
|
104
|
-
stub_request(:get, '
|
104
|
+
stub_request(:get, 'https://rubygems.org/api/v1/versions/zold/latest.json').to_return(
|
105
105
|
status: 200,
|
106
106
|
body: "{\"version\": \"#{Zold::VERSION}\"}"
|
107
107
|
)
|
@@ -149,7 +149,7 @@ class TestRemote < Minitest::Test
|
|
149
149
|
]
|
150
150
|
}.to_json
|
151
151
|
)
|
152
|
-
stub_request(:get, '
|
152
|
+
stub_request(:get, 'https://rubygems.org/api/v1/versions/zold/latest.json').to_return(
|
153
153
|
status: 200,
|
154
154
|
body: '{"version": "0.0.0"}'
|
155
155
|
)
|
data/test/node/test_front.rb
CHANGED
@@ -87,6 +87,11 @@ class FrontTest < Minitest::Test
|
|
87
87
|
response = Zold::Http.new(uri: "http://localhost:#{port}/remotes", score: score).get
|
88
88
|
assert_equal('200', response.code, response.body)
|
89
89
|
assert_equal(1, Zold::JsonPage.new(response.body).to_hash['all'].count, response.body)
|
90
|
+
assert_match(
|
91
|
+
/(\d{4})-(\d{2})-(\d{2})T(\d{2})\:(\d{2})\:(\d{2})Z/,
|
92
|
+
Zold::JsonPage.new(response.body).to_hash['mtime'].to_s,
|
93
|
+
response.body
|
94
|
+
)
|
90
95
|
end
|
91
96
|
end
|
92
97
|
|
data/test/test_gem.rb
CHANGED
@@ -6,12 +6,16 @@ require 'minitest/autorun'
|
|
6
6
|
|
7
7
|
class TestGem < Minitest::Test
|
8
8
|
def test_last_version
|
9
|
-
gem = Zold::Gem.new
|
10
9
|
version = (1..3).map { rand(9).to_s } .join('.')
|
11
|
-
stub_request(:get, '
|
10
|
+
stub_request(:get, 'https://rubygems.org/api/v1/versions/zold/latest.json').to_return(
|
12
11
|
status: 200,
|
13
12
|
body: "{\"version\": \"#{version}\"}"
|
14
13
|
)
|
15
|
-
assert_equal(version,
|
14
|
+
assert_equal(version, Zold::Gem.new.last_version)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_last_version_live
|
18
|
+
WebMock.allow_net_connect!
|
19
|
+
assert(!Zold::Gem.new.last_version.nil?)
|
16
20
|
end
|
17
21
|
end
|
data/test/test_remotes.rb
CHANGED
@@ -173,6 +173,27 @@ class TestRemotes < Minitest::Test
|
|
173
173
|
end
|
174
174
|
end
|
175
175
|
|
176
|
+
def test_mtime
|
177
|
+
Dir.mktmpdir 'test' do |dir|
|
178
|
+
file = File.join(dir, 'remotes')
|
179
|
+
FileUtils.touch(file)
|
180
|
+
File.stub :mtime, Time.mktime(2018, 1, 1) do
|
181
|
+
remotes = Zold::Remotes.new(file: file)
|
182
|
+
remotes.add('127.0.0.1')
|
183
|
+
assert_equal(Time.mktime(2018, 1, 1), remotes.mtime)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_read_mtime_from_file
|
189
|
+
Dir.mktmpdir 'test' do |dir|
|
190
|
+
file = File.join(dir, 'remotes')
|
191
|
+
remotes = Zold::Remotes.new(file: file)
|
192
|
+
remotes.all
|
193
|
+
assert_equal(File.mtime(file).to_i, remotes.mtime.to_i)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
176
197
|
def test_adds_from_many_threads
|
177
198
|
Dir.mktmpdir do |dir|
|
178
199
|
remotes = Zold::Remotes.new(file: File.join(dir, 'xx.csv'))
|
@@ -202,8 +223,11 @@ class TestRemotes < Minitest::Test
|
|
202
223
|
end
|
203
224
|
|
204
225
|
def test_empty_remotes
|
205
|
-
|
206
|
-
|
226
|
+
Time.stub :now, Time.mktime(2018, 1, 1) do
|
227
|
+
remotes = Zold::Remotes::Empty.new(file: '/tmp/empty')
|
228
|
+
assert_equal(Time.mktime(2018, 1, 1), remotes.mtime)
|
229
|
+
assert(remotes.is_a?(Zold::Remotes))
|
230
|
+
end
|
207
231
|
end
|
208
232
|
|
209
233
|
def test_reports_zold_error_header
|
@@ -222,4 +246,17 @@ class TestRemotes < Minitest::Test
|
|
222
246
|
end
|
223
247
|
end
|
224
248
|
end
|
249
|
+
|
250
|
+
def test_manifests_correct_network_name
|
251
|
+
Dir.mktmpdir do |dir|
|
252
|
+
remotes = Zold::Remotes.new(file: File.join(dir, 'uu-083.csv'), network: 'x13')
|
253
|
+
remotes.clean
|
254
|
+
remotes.add('r5-example.org', 8080)
|
255
|
+
stub_request(:get, 'http://r5-example.org:8080/').to_return(status: 200)
|
256
|
+
remotes.iterate(test_log) do |r|
|
257
|
+
r.http.get
|
258
|
+
end
|
259
|
+
assert_requested(:get, 'http://r5-example.org:8080/', headers: { 'X-Zold-Network' => 'x13' })
|
260
|
+
end
|
261
|
+
end
|
225
262
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.14.
|
4
|
+
version: 0.14.40
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cachy
|
@@ -606,7 +606,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
606
606
|
version: '0'
|
607
607
|
requirements: []
|
608
608
|
rubyforge_project:
|
609
|
-
rubygems_version: 2.
|
609
|
+
rubygems_version: 2.5.2
|
610
610
|
signing_key:
|
611
611
|
specification_version: 2
|
612
612
|
summary: A fast cryptocurrency for micro payments
|