zold 0.15.0 → 0.16.0

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.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/bin/zold +9 -6
  4. data/features/gem_package.feature +1 -1
  5. data/features/step_definitions/steps.rb +2 -2
  6. data/fixtures/merge/into-no-wallet/assert.rb +1 -1
  7. data/fixtures/merge/random-expenses/assert.rb +1 -1
  8. data/fixtures/merge/simple-case/assert.rb +1 -1
  9. data/lib/zold/age.rb +16 -8
  10. data/lib/zold/amount.rb +4 -2
  11. data/lib/zold/cached_wallets.rb +5 -6
  12. data/lib/zold/commands/clean.rb +15 -8
  13. data/lib/zold/commands/diff.rb +3 -3
  14. data/lib/zold/commands/fetch.rb +4 -4
  15. data/lib/zold/commands/list.rb +5 -4
  16. data/lib/zold/commands/merge.rb +2 -1
  17. data/lib/zold/commands/node.rb +14 -12
  18. data/lib/zold/commands/propagate.rb +2 -2
  19. data/lib/zold/commands/push.rb +3 -3
  20. data/lib/zold/commands/remove.rb +4 -1
  21. data/lib/zold/commands/routines/reconnect.rb +1 -0
  22. data/lib/zold/copies.rb +13 -14
  23. data/lib/zold/dir_items.rb +44 -0
  24. data/lib/zold/head.rb +1 -1
  25. data/lib/zold/key.rb +2 -2
  26. data/lib/zold/log.rb +2 -0
  27. data/lib/zold/node/async_entrance.rb +38 -28
  28. data/lib/zold/node/entrance.rb +4 -11
  29. data/lib/zold/node/farm.rb +9 -9
  30. data/lib/zold/node/front.rb +40 -25
  31. data/lib/zold/node/nodup_entrance.rb +4 -4
  32. data/lib/zold/node/safe_entrance.rb +2 -2
  33. data/lib/zold/node/spread_entrance.rb +5 -9
  34. data/lib/zold/node/sync_entrance.rb +2 -23
  35. data/lib/zold/patch.rb +2 -2
  36. data/lib/zold/remotes.rb +10 -6
  37. data/lib/zold/sync_wallets.rb +3 -22
  38. data/lib/zold/tree_wallets.rb +11 -6
  39. data/lib/zold/txns.rb +1 -1
  40. data/lib/zold/version.rb +1 -1
  41. data/lib/zold/wallet.rb +14 -5
  42. data/lib/zold/wallets.rb +5 -4
  43. data/test/commands/routines/test_spread.rb +1 -1
  44. data/test/commands/test_alias.rb +4 -4
  45. data/test/commands/test_clean.rb +14 -1
  46. data/test/commands/test_create.rb +2 -2
  47. data/test/commands/test_diff.rb +5 -5
  48. data/test/commands/test_fetch.rb +2 -2
  49. data/test/commands/test_merge.rb +19 -19
  50. data/test/commands/test_node.rb +1 -1
  51. data/test/commands/test_pay.rb +7 -6
  52. data/test/commands/test_propagate.rb +2 -1
  53. data/test/commands/test_pull.rb +1 -1
  54. data/test/commands/test_push.rb +1 -1
  55. data/test/commands/test_remove.rb +57 -0
  56. data/test/commands/test_taxes.rb +1 -1
  57. data/test/fake_home.rb +11 -8
  58. data/test/node/fake_node.rb +2 -2
  59. data/test/node/test_async_entrance.rb +24 -8
  60. data/test/node/test_emission.rb +2 -2
  61. data/test/node/test_entrance.rb +8 -6
  62. data/test/node/test_farm.rb +1 -1
  63. data/test/node/test_front.rb +42 -33
  64. data/test/node/test_nodup_entrance.rb +2 -2
  65. data/test/node/test_safe_entrance.rb +5 -5
  66. data/test/node/test_spread_entrance.rb +3 -3
  67. data/test/node/test_sync_entrance.rb +1 -1
  68. data/test/test__helper.rb +3 -29
  69. data/test/test_cached_wallets.rb +1 -1
  70. data/test/test_copies.rb +4 -2
  71. data/test/test_dir_items.rb +88 -0
  72. data/test/test_key.rb +2 -2
  73. data/test/test_log.rb +38 -0
  74. data/test/test_patch.rb +11 -11
  75. data/test/test_prefixes.rb +1 -1
  76. data/test/test_remotes.rb +12 -6
  77. data/test/test_sync_wallets.rb +6 -6
  78. data/test/test_tax.rb +4 -4
  79. data/test/test_tree_wallets.rb +16 -2
  80. data/test/test_wallet.rb +26 -26
  81. data/test/test_wallets.rb +5 -2
  82. data/test/test_zold.rb +2 -2
  83. data/test/upgrades/test_protocol_up.rb +1 -1
  84. data/upgrades/move_wallets_into_tree.rb +1 -1
  85. data/upgrades/protocol_up.rb +3 -3
  86. data/upgrades/rename_foreign_wallets.rb +1 -1
  87. data/zold.gemspec +27 -25
  88. metadata +91 -56
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e42d8de2d004ce5a9bfe7eaee7728dc0988a08482e5cc7d138de0c7bf8552fd4
4
- data.tar.gz: 2e82e4cc5f59db84b8647396c902dbd6b86ec3769a4eb6cfd0ca922e6020c3d5
3
+ metadata.gz: a80f542fc3561bcd48d5f02f31630a14ca52ff17beda6ec8bda6460ca85fd54a
4
+ data.tar.gz: 258cf2d603a886678b3947e28a23bee64d6d57cc6e41cea9a1a9c21f7b18c054
5
5
  SHA512:
6
- metadata.gz: 4f194dab4b5c826ce407effcc2374e77ba82c969adb3ff0780796702addb3db807b9f6d1bbf6ec15bd10f48a274561774414d913847429053980039f30d0dc3c
7
- data.tar.gz: 255583b83271342d7895cff40965bb71bc13bc8608755a279c65e437a55858958b00e06d1bd88f46470f353fe06846f270e89a77018bc91acfd5f6efff43958e
6
+ metadata.gz: e64a730a188c183fd1a477900907f54fc0c3acb52db6f9c4c0dc88d70a700f762866fbc130e92cd6b782e6cfea04eb6f9e8f01f97ce1e7a0ba2e09212590bdae
7
+ data.tar.gz: f70009e27da61954ee250f107e3ddff12977f572e27dd4bf37c28ea20877b1adf36c5162bd0a5ba5169097a33e56712f13e04db6d14973fc219942e0fd85c39c
data/.gitignore CHANGED
@@ -8,3 +8,4 @@ rdoc/
8
8
  .zoldata
9
9
  farm
10
10
  zold.log
11
+ farm.lock
data/bin/zold CHANGED
@@ -57,7 +57,7 @@ args = []
57
57
  unless ENV['RACK_ENV'] == 'test' || ARGV.find { |a| a == '--ignore-global-config' }
58
58
  config = File.expand_path('~/.zold')
59
59
  if File.exist?(config)
60
- body = File.read(config)
60
+ body = IO.read(config)
61
61
  extra = body.split(/[\r\n]+/).map(&:strip)
62
62
  args += extra
63
63
  log.debug("Found #{body.split(/\n/).length} lines in #{config}")
@@ -144,10 +144,11 @@ Available options:"
144
144
  args << '--help' if opts.help?
145
145
  args << "--network=#{opts['network']}"
146
146
 
147
- FileUtils.mkdir_p(opts[:home])
148
- Dir.chdir(opts[:home])
147
+ home = File.expand_path(opts[:home])
148
+ FileUtils.mkdir_p(home)
149
+ Dir.chdir(home)
149
150
 
150
- zoldata = File.expand_path(File.join(Dir.pwd, '.zoldata'))
151
+ zoldata = File.join(home, '.zoldata')
151
152
 
152
153
  unless opts['skip-upgrades']
153
154
  Zold::Upgrades.new(Zold::VersionFile.new(File.join(zoldata, 'version')), 'upgrades').run
@@ -170,9 +171,11 @@ Available options:"
170
171
  Zold::CachedWallets.new(
171
172
  command == 'node' ? Zold::TreeWallets.new('.') : Zold::Wallets.new('.')
172
173
  ),
173
- File.join(zoldata, 'locks'), log: log
174
+ log: log
174
175
  )
175
- remotes = Zold::Remotes.new(file: File.join(zoldata, 'remotes'), network: opts['network'])
176
+ fremotes = File.join(zoldata, 'remotes')
177
+ remotes = Zold::Remotes.new(file: fremotes, network: opts['network'])
178
+ remotes.defaults unless File.exist?(fremotes)
176
179
  copies = File.join(zoldata, 'copies')
177
180
 
178
181
  log.debug("Network: #{opts['network']}")
@@ -10,7 +10,7 @@ Feature: Gem Package
10
10
  require 'rubygems'
11
11
  spec = Gem::Specification::load('./spec.rb')
12
12
  if spec.executables.empty?
13
- fail 'no executables: ' + File.read('./spec.rb')
13
+ fail 'no executables: ' + IO.read('./spec.rb')
14
14
  end
15
15
  """
16
16
  When I run bash with:
@@ -40,14 +40,14 @@ After do
40
40
  end
41
41
 
42
42
  When(%r{^I run ([a-z/-]+) with "([^"]*)"$}) do |cmd, args|
43
- home = File.join(File.dirname(__FILE__), '../..')
43
+ home = File.expand_path(File.join(File.dirname(__FILE__), '../..'))
44
44
  @stdout = `ruby -I#{home}/lib #{home}/#{cmd} #{args} 2>&1`
45
45
  @exitstatus = $CHILD_STATUS.exitstatus
46
46
  end
47
47
 
48
48
  When(/^I run bash with:$/) do |text|
49
49
  FileUtils.copy_entry(@cwd, File.join(@dir, 'zold'))
50
- File.write('run.sh', text)
50
+ IO.write('run.sh', text)
51
51
  @stdout = `/bin/bash run.sh 2>&1`
52
52
  @exitstatus = $CHILD_STATUS.exitstatus
53
53
  end
@@ -21,5 +21,5 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  require_relative 'asserts'
24
- wallet = Zold::Wallet.new(Zold::Id.new('0123456789abcdef'))
24
+ wallet = Zold::Wallet.new('0123456789abcdef.z')
25
25
  assert_equal(Zold::Amount.new(zld: 512.0), wallet.balance)
@@ -21,5 +21,5 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  require_relative 'asserts.rb'
24
- wallet = Zold::Wallet.new(Zold::Id.new('0123456789abcdef'))
24
+ wallet = Zold::Wallet.new('0123456789abcdef.z')
25
25
  assert_equal(Zold::Amount.new(zld: 388.0), wallet.balance)
@@ -21,5 +21,5 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  require_relative 'asserts'
24
- wallet = Zold::Wallet.new(Zold::Id.new('0123456789abcdef'))
24
+ wallet = Zold::Wallet.new('0123456789abcdef.z')
25
25
  assert_equal(Zold::Amount.new(zld: 512.0), wallet.balance)
data/lib/zold/age.rb CHANGED
@@ -21,6 +21,7 @@
21
21
  # SOFTWARE.
22
22
 
23
23
  require 'time'
24
+ require 'rainbow'
24
25
 
25
26
  # Age in seconds.
26
27
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -29,22 +30,29 @@ require 'time'
29
30
  module Zold
30
31
  # Age
31
32
  class Age
32
- def initialize(time)
33
+ def initialize(time, limit: nil)
33
34
  @time = time.nil? || time.is_a?(Time) ? time : Time.parse(time)
35
+ @limit = limit
34
36
  end
35
37
 
36
38
  def to_s
37
39
  return '?' if @time.nil?
38
40
  sec = Time.now - @time
39
- if sec < 1
40
- "#{(sec * 1000).round}ms"
41
- elsif sec < 60
42
- "#{sec.round(2)}s"
43
- elsif sec < 60 * 60
44
- "#{(sec / 60).round}m"
41
+ txt = text(sec)
42
+ if !@limit.nil? && sec > @limit
43
+ Rainbow(txt).red
45
44
  else
46
- "#{(sec / 3600).round}h"
45
+ txt
47
46
  end
48
47
  end
48
+
49
+ private
50
+
51
+ def text(sec)
52
+ return "#{(sec * 1000).round}ms" if sec < 1
53
+ return "#{sec.round(2)}s" if sec < 60
54
+ return "#{(sec / 60).round}m" if sec < 60 * 60
55
+ "#{(sec / 3600).round}h"
56
+ end
49
57
  end
50
58
  end
data/lib/zold/amount.rb CHANGED
@@ -61,10 +61,12 @@ module Zold
61
61
 
62
62
  def to_s
63
63
  text = "#{to_zld}ZLD"
64
- if negative?
64
+ if positive?
65
+ Rainbow(text).green
66
+ elsif negative?
65
67
  Rainbow(text).red
66
68
  else
67
- Rainbow(text).green
69
+ text
68
70
  end
69
71
  end
70
72
 
@@ -50,12 +50,11 @@ module Zold
50
50
 
51
51
  def find(id)
52
52
  @wallets.find(id) do |wallet|
53
- yield(
54
- @mutex.synchronize do
55
- @cache[id] = wallet unless @cache[id]
56
- @cache[id]
57
- end
58
- )
53
+ w = @mutex.synchronize do
54
+ @cache[id] = wallet unless @cache[id]
55
+ @cache[id]
56
+ end
57
+ yield w
59
58
  end
60
59
  end
61
60
  end
@@ -23,6 +23,7 @@
23
23
  require 'uri'
24
24
  require 'json'
25
25
  require 'time'
26
+ require 'futex'
26
27
  require 'slop'
27
28
  require 'rainbow'
28
29
  require_relative 'args'
@@ -54,17 +55,23 @@ Available options:"
54
55
  end
55
56
  mine = Args.new(opts, @log).take || return
56
57
  (mine.empty? ? @wallets.all : mine.map { |i| Id.new(i) }).each do |id|
57
- clean(Copies.new(File.join(@copies, id), log: @log), opts)
58
+ clean(id, Copies.new(File.join(@copies, id), log: @log), opts)
58
59
  end
59
60
  end
60
61
 
61
- def clean(cps, _)
62
- deleted = cps.clean
63
- @log.debug("#{deleted} expired local copies removed for #{cps}, #{cps.all.count} left:")
64
- cps.all.each do |c|
65
- wallet = Wallet.new(c[:path])
66
- @log.debug(" #{c[:name]}: #{c[:score]} #{wallet.balance}/#{wallet.txns.count}t/\
67
- #{wallet.digest[0, 6]}/#{Size.new(File.size(c[:path]))}/#{Age.new(File.mtime(c[:path]))}")
62
+ def clean(id, cps, _)
63
+ Futex.new(File.join(@copies, "#{id}-clean"), log: @log).open do
64
+ start = Time.now
65
+ deleted = cps.clean
66
+ @log.debug(
67
+ "#{deleted} expired local copies removed for #{cps} \
68
+ in #{Age.new(start, limit: 0.01)}, #{cps.all.count} left:\n" +
69
+ cps.all.map do |c|
70
+ wallet = Wallet.new(c[:path])
71
+ " #{c[:name]}: #{c[:score]} #{wallet.balance}/#{wallet.txns.count}t/\
72
+ #{wallet.digest[0, 6]}/#{Size.new(File.size(c[:path]))}/#{Age.new(File.mtime(c[:path]))}"
73
+ end.join("\n")
74
+ )
68
75
  end
69
76
  end
70
77
  end
@@ -67,12 +67,12 @@ Available options:"
67
67
  patch.join(Wallet.new(c[:path]))
68
68
  end
69
69
  before = @wallets.find(id) do |wallet|
70
- File.read(wallet.path)
70
+ IO.read(wallet.path)
71
71
  end
72
72
  after = ''
73
- Tempfile.open(['', Wallet::EXTENSION]) do |f|
73
+ Tempfile.open(['', Wallet::EXT]) do |f|
74
74
  patch.save(f.path, overwrite: true)
75
- after = File.read(f)
75
+ after = IO.read(f)
76
76
  end
77
77
  diff = Diffy::Diff.new(before, after, context: 0).to_s(:color)
78
78
  @log.info(diff)
@@ -113,9 +113,9 @@ Available options:"
113
113
  r.assert_valid_score(score)
114
114
  r.assert_score_ownership(score)
115
115
  r.assert_score_strength(score) unless opts['ignore-score-weakness']
116
- Tempfile.open(['', Wallet::EXTENSION]) do |f|
116
+ Tempfile.open(['', Wallet::EXT]) do |f|
117
117
  body = json['body']
118
- File.write(f, body)
118
+ IO.write(f, body)
119
119
  wallet = Wallet.new(f.path)
120
120
  wallet.refurbish
121
121
  if wallet.protocol != Zold::PROTOCOL
@@ -127,10 +127,10 @@ Available options:"
127
127
  if wallet.balance.negative? && !wallet.root?
128
128
  raise "The balance of #{id} is #{wallet.balance} and it's not a root wallet"
129
129
  end
130
- copy = cps.add(File.read(f), score.host, score.port, score.value)
130
+ copy = cps.add(IO.read(f), score.host, score.port, score.value)
131
131
  @log.info("#{r} returned #{Size.new(body.length)}/#{wallet.balance}/#{wallet.txns.count}t/\
132
132
  #{digest(json)}/#{Age.new(json['mtime'])}/#{json['copies']}c \
133
- as copy #{copy} of #{id} in #{Age.new(start)}: #{Rainbow(score.value).green} (#{json['version']})")
133
+ as copy #{copy} of #{id} in #{Age.new(start, limit: 4)}: #{Rainbow(score.value).green} (#{json['version']})")
134
134
  end
135
135
  score.value
136
136
  end
@@ -37,10 +37,11 @@ module Zold
37
37
 
38
38
  def run(_ = [])
39
39
  @wallets.all.each do |id|
40
- wallet = Wallet.new(File.join(@wallets.path, id))
41
- msg = "#{id}: #{wallet.balance}/#{wallet.txns.count}t"
42
- msg += " (net:#{wallet.network})" if wallet.network != Wallet::MAIN_NETWORK
43
- @log.info(msg)
40
+ @wallets.find(id) do |wallet|
41
+ msg = "#{id}: #{wallet.balance}/#{wallet.txns.count}t"
42
+ msg += " (net:#{wallet.network})" if wallet.network != Wallet::MAIN_NETWORK
43
+ @log.info(msg)
44
+ end
44
45
  end
45
46
  end
46
47
  end
@@ -85,9 +85,10 @@ Available options:"
85
85
  @log.debug("Local copy of #{id} is absent, nothing to merge")
86
86
  end
87
87
  modified = patch.save(wallet.path, overwrite: true)
88
+ wallet.flush
88
89
  if modified
89
90
  @log.info("#{cps.count} copies with the total score of #{score} successfully merged \
90
- into #{wallet.id}/#{wallet.balance}/#{wallet.txns.count}t in #{Age.new(start)}")
91
+ into #{wallet.id}/#{wallet.balance}/#{wallet.txns.count}t in #{Age.new(start, limit: 0.1 + cps.count * 0.01)}")
91
92
  else
92
93
  @log.info("Nothing changed in #{wallet.id} after merge of #{cps.count} copies")
93
94
  end
@@ -153,13 +153,14 @@ module Zold
153
153
  raise '--invoice is mandatory' unless opts['invoice']
154
154
  if opts['nohup']
155
155
  pid = nohup(opts)
156
- File.write(opts['save-pid'], pid) if opts['save-pid']
156
+ IO.write(opts['save-pid'], pid) if opts['save-pid']
157
157
  @log.debug("Process ID #{pid} saved into \"#{opts['save-pid']}\"")
158
158
  @log.info(pid)
159
159
  return
160
160
  end
161
161
  @log = Trace.new(@log, opts['trace-length'])
162
162
  Front.set(:log, @log)
163
+ Front.set(:logger, @log)
163
164
  Front.set(:trace, @log)
164
165
  Front.set(:nohup_log, opts['nohup-log']) if opts['nohup-log']
165
166
  Front.set(:version, opts['expose-version'])
@@ -168,9 +169,10 @@ module Zold
168
169
  Front.set(:halt, opts['halt-code'])
169
170
  Front.set(:disable_push, opts['disable-push'])
170
171
  Front.set(:disable_fetch, opts['disable-fetch'])
171
- Front.set(:home, opts['home'])
172
+ home = File.expand_path(opts['home'])
173
+ Front.set(:home, home)
172
174
  @log.info("Time: #{Time.now.utc.iso8601}")
173
- @log.info("Home directory: #{opts['home']}")
175
+ @log.info("Home directory: #{home}")
174
176
  @log.info("Ruby version: #{RUBY_VERSION}")
175
177
  @log.info("Zold gem version: #{Zold::VERSION}")
176
178
  @log.info("Zold protocol version: #{Zold::PROTOCOL}")
@@ -189,7 +191,7 @@ module Zold
189
191
  AccessLog: []
190
192
  )
191
193
  if opts['standalone']
192
- @remotes = Zold::Remotes::Empty.new(file: '/tmp/standalone')
194
+ @remotes = Zold::Remotes::Empty.new
193
195
  @log.info('Running in standalone mode! (will never talk to other remotes)')
194
196
  elsif @remotes.exists?(host, port)
195
197
  Zold::Remote.new(remotes: @remotes).run(['remote', 'remove', host, port.to_s])
@@ -201,7 +203,7 @@ module Zold
201
203
  Front.set(:remotes, @remotes)
202
204
  Front.set(:copies, @copies)
203
205
  Front.set(:address, address)
204
- Front.set(:root, opts['home'])
206
+ Front.set(:root, home)
205
207
  Front.set(:dump_errors, opts['dump-errors'])
206
208
  Front.set(:port, opts['bind-port'])
207
209
  Front.set(:reboot, !opts['never-reboot'])
@@ -227,21 +229,21 @@ module Zold
227
229
  @remotes, @copies, address,
228
230
  log: @log, network: opts['network']
229
231
  ),
230
- File.join(opts['home'], '.zoldata/entrance'),
232
+ File.join(home, '.zoldata/sync-entrance'),
231
233
  log: @log
232
234
  ),
233
235
  @wallets, @remotes, address,
234
236
  log: @log,
235
237
  ignore_score_weakeness: opts['ignore-score-weakness']
236
238
  ),
237
- File.join(opts['home'], '.zoldata/entrance'), log: @log
239
+ File.join(home, '.zoldata/async-entrance'), log: @log
238
240
  ),
239
241
  @wallets
240
242
  ),
241
243
  network: opts['network']
242
244
  ).start do |entrance|
243
245
  Front.set(:entrance, entrance)
244
- Farm.new(invoice, File.join(opts['home'], 'farm'), log: @log)
246
+ Farm.new(invoice, File.join(home, 'farm'), log: @log)
245
247
  .start(host, opts[:port], threads: opts[:threads], strength: opts[:strength]) do |farm|
246
248
  Front.set(:farm, farm)
247
249
  metronome(farm, opts).start do |metronome|
@@ -383,19 +385,19 @@ module Zold
383
385
  end
384
386
 
385
387
  def info(msg)
386
- @log.debug('WEBRICK ' + msg)
388
+ @log.debug("WEBRICK #{msg}")
387
389
  end
388
390
 
389
391
  def debug(msg)
390
392
  # nothing
391
393
  end
392
394
 
393
- def error(msg)
394
- @log.error('WEBRICK ' + msg)
395
+ def error(ex)
396
+ @log.error("WEBRICK #{Backtrace.new(ex)}")
395
397
  end
396
398
 
397
399
  def fatal(msg)
398
- @log.error('WEBRICK ' + msg)
400
+ @log.error("WEBRICK #{msg}")
399
401
  end
400
402
 
401
403
  def debug?
@@ -91,8 +91,8 @@ Available options:"
91
91
  end
92
92
  end
93
93
  modified.uniq!
94
- @log.debug("Wallet #{id} propagated successfully, #{total} txns in #{Age.new(start)}, \
95
- #{modified.count} wallets affected")
94
+ @log.debug("Wallet #{id} propagated successfully, #{total} txns \
95
+ in #{Age.new(start, limit: 20 + total * 0.005)}, #{modified.count} wallets affected")
96
96
  modified
97
97
  end
98
98
  end
@@ -89,14 +89,14 @@ total score for #{id} is #{total}")
89
89
  start = Time.now
90
90
  content = @wallets.find(id) do |wallet|
91
91
  raise "The wallet #{id} is absent" unless wallet.exists?
92
- File.read(wallet.path)
92
+ IO.read(wallet.path)
93
93
  end
94
94
  uri = "/wallet/#{id}"
95
95
  response = r.http(uri).put(content)
96
96
  @wallets.find(id) do |wallet|
97
97
  if response.code == '304'
98
98
  @log.info("#{r}: same version #{Size.new(content.length)}/#{wallet.txns.count}t \
99
- of #{wallet.id} there, in #{Age.new(start)}")
99
+ of #{wallet.id} there, in #{Age.new(start, limit: 0.5)}")
100
100
  return 0
101
101
  end
102
102
  r.assert_code(200, response)
@@ -106,7 +106,7 @@ of #{wallet.id} there, in #{Age.new(start)}")
106
106
  r.assert_score_ownership(score)
107
107
  r.assert_score_strength(score) unless opts['ignore-score-weakness']
108
108
  @log.info("#{r} accepted #{Size.new(content.length)}/#{wallet.digest[0, 6]}/#{wallet.txns.count}t \
109
- of #{wallet.id} in #{Age.new(start)}: #{Rainbow(score.value).green} (#{json['version']})")
109
+ of #{wallet.id} in #{Age.new(start, limit: 4)}: #{Rainbow(score.value).green} (#{json['version']})")
110
110
  score.value
111
111
  end
112
112
  end
@@ -50,7 +50,10 @@ Available options:"
50
50
  end
51
51
 
52
52
  def remove(id, _)
53
- @wallets.find(id) { |w| File.delete(w.path) }
53
+ @wallets.find(id) do |w|
54
+ raise "Wallet #{id} doesn't exist in #{w.path}" unless w.exists?
55
+ File.delete(w.path)
56
+ end
54
57
  @log.info("Wallet #{id} removed")
55
58
  end
56
59
  end