zold 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
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