zold 0.14.39 → 0.14.40

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 13cff3999d82e0c3230da3fe717537fdef3337e4
4
- data.tar.gz: 307f20cb6d1cf11c963f94cae910540dac9f473a
3
+ metadata.gz: d7b45f4c26031db16e0648325a3bb697fd815f30
4
+ data.tar.gz: 4ef739093a92027005789d04be4b70e2607eed47
5
5
  SHA512:
6
- metadata.gz: bdcbe7adf732ea4aea112322a56420a1197aad5640dcd5f330ce3b0315be4021832aac1d5ed4e2d07642f141748b6e08ac7e52b1ad5085da2f5b12fabd7b0e56
7
- data.tar.gz: 379b7ec0f166019354cd3ea276edbd455baff582ea8ca3f024eb0b307d3a6e5485021a7cc3beea3eb6a59d13a0aa62bb6a4fd22e084bb654758f8bb1759b05fc
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 --quiet
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'
@@ -104,10 +104,11 @@ Available options:"
104
104
  @log.debug("#{r} ignored because of --ignore-node")
105
105
  return 0
106
106
  end
107
- res = r.http("/wallet/#{id}").get
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)
@@ -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']
@@ -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
- response = r.http("/wallet/#{id}#{opts['sync'] ? '?sync=true' : ''}").put(content)
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)
@@ -183,9 +183,10 @@ Available options:"
183
183
  def elect(opts)
184
184
  scores = []
185
185
  @remotes.iterate(@log, farm: @farm) do |r|
186
- res = r.http('/').get
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
- res = r.http('/remotes').get
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)
@@ -139,9 +139,10 @@ Available options:"
139
139
  def top_scores
140
140
  best = []
141
141
  @remotes.iterate(@log) do |r|
142
- res = r.http.get
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
- uri = URI(API_VERSION + 'versions/zold/latest.json')
39
- http = Net::HTTP.new(BASE_URI)
40
- path = uri.path
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
@@ -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
@@ -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
- }.to_json
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
- }.to_json
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, Object
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
- @mutex.synchronize do
118
- list = load
119
- max_score = list.map { |r| r[:score] }.max || 0
120
- max_score = 1 if max_score.zero?
121
- max_errors = list.map { |r| r[:errors] }.max || 0
122
- max_errors = 1 if max_errors.zero?
123
- list.sort_by do |r|
124
- (1 - r[:errors] / max_errors) * 5 + (r[:score] / max_score)
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(@file))
136
+ FileUtils.mkdir_p(File.dirname(file))
135
137
  FileUtils.copy(
136
138
  File.join(File.dirname(__FILE__), '../../resources/remotes'),
137
- @file
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: @network
194
+ network: network
193
195
  )
194
196
  idx += 1
195
- raise 'Took too long to execute' if (Time.now - start).round > @timeout
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
- @mutex.synchronize do
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?(@file)
243
- raw = CSV.read(@file).map do |r|
248
+ reset unless File.exist?(file)
249
+ raw = CSV.read(file).map do |row|
244
250
  {
245
- host: r[0],
246
- port: r[1].to_i,
247
- score: r[2].to_i,
248
- errors: r[3].to_i
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(@file).write(
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
@@ -22,7 +22,6 @@
22
22
 
23
23
  require 'openssl'
24
24
  require 'time'
25
- require_relative 'remotes'
26
25
  require_relative 'type'
27
26
 
28
27
  # The score.
data/lib/zold/version.rb CHANGED
@@ -25,6 +25,6 @@
25
25
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Zold
28
- VERSION = '0.14.39'
28
+ VERSION = '0.14.40'
29
29
  PROTOCOL = 2
30
30
  end
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, 'http://rubygems.org/api/v1/versions/zold/latest.json').to_return(
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, 'http://rubygems.org/api/v1/versions/zold/latest.json').to_return(
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, 'http://rubygems.org/api/v1/versions/zold/latest.json').to_return(
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, 'http://rubygems.org/api/v1/versions/zold/latest.json').to_return(
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
  )
@@ -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, 'http://rubygems.org/api/v1/versions/zold/latest.json').to_return(
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, gem.last_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
- remotes = Zold::Remotes::Empty.new(file: '/tmp/empty')
206
- assert(remotes.is_a?(Zold::Remotes))
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.39
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-09-18 00:00:00.000000000 Z
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.6.8
609
+ rubygems_version: 2.5.2
610
610
  signing_key:
611
611
  specification_version: 2
612
612
  summary: A fast cryptocurrency for micro payments