zold 0.13.46 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/.rultor.yml +2 -2
  4. data/.simplecov +1 -1
  5. data/.travis.yml +3 -1
  6. data/INSTALL.md +4 -1
  7. data/README.md +98 -3
  8. data/Rakefile +1 -0
  9. data/bin/zold +10 -1
  10. data/fixtures/merge/into-no-wallet/assert.rb +23 -0
  11. data/fixtures/merge/{random-expenses/0123456789abcdef → into-no-wallet/copies/0123456789abcdef/1.z} +0 -0
  12. data/fixtures/merge/into-no-wallet/copies/0123456789abcdef/scores.z +1 -0
  13. data/fixtures/merge/random-expenses/{0000000000000000 → 0000000000000000.z} +0 -0
  14. data/fixtures/merge/{simple-case/copies/0123456789abcdef/1 → random-expenses/0123456789abcdef.z} +0 -0
  15. data/fixtures/merge/random-expenses/copies/0123456789abcdef/{1 → 1.z} +0 -0
  16. data/fixtures/merge/random-expenses/copies/0123456789abcdef/{2 → 2.z} +0 -0
  17. data/fixtures/merge/random-expenses/copies/0123456789abcdef/{3 → 3.z} +0 -0
  18. data/fixtures/merge/random-expenses/copies/0123456789abcdef/{4 → 4.z} +0 -0
  19. data/fixtures/merge/random-expenses/copies/0123456789abcdef/{5 → 5.z} +0 -0
  20. data/fixtures/merge/random-expenses/copies/0123456789abcdef/scores.z +5 -0
  21. data/fixtures/merge/simple-case/{0000000000000000 → 0000000000000000.z} +0 -0
  22. data/fixtures/merge/simple-case/{0123456789abcdef → 0123456789abcdef.z} +0 -1
  23. data/fixtures/merge/simple-case/copies/0123456789abcdef/1.z +6 -0
  24. data/fixtures/merge/simple-case/copies/0123456789abcdef/scores.z +1 -0
  25. data/fixtures/scripts/push-and-pull.sh +1 -0
  26. data/lib/zold/atomic_file.rb +7 -6
  27. data/lib/zold/commands/alias.rb +37 -0
  28. data/lib/zold/commands/calculate.rb +5 -2
  29. data/lib/zold/commands/diff.rb +2 -2
  30. data/lib/zold/commands/fetch.rb +23 -3
  31. data/lib/zold/commands/merge.rb +12 -7
  32. data/lib/zold/commands/node.rb +5 -2
  33. data/lib/zold/commands/pay.rb +11 -0
  34. data/lib/zold/commands/push.rb +1 -1
  35. data/lib/zold/commands/remote.rb +28 -2
  36. data/lib/zold/commands/taxes.rb +14 -2
  37. data/lib/zold/copies.rb +9 -8
  38. data/lib/zold/hungry_wallets.rb +12 -0
  39. data/lib/zold/log.rb +17 -2
  40. data/lib/zold/node/async_entrance.rb +48 -9
  41. data/lib/zold/node/entrance.rb +1 -1
  42. data/lib/zold/node/front.rb +28 -3
  43. data/lib/zold/node/safe_entrance.rb +3 -3
  44. data/lib/zold/node/spread_entrance.rb +1 -1
  45. data/lib/zold/patch.rb +8 -4
  46. data/lib/zold/remotes.rb +7 -0
  47. data/lib/zold/score.rb +2 -2
  48. data/lib/zold/tax.rb +0 -1
  49. data/lib/zold/upgrades.rb +57 -0
  50. data/lib/zold/version.rb +2 -1
  51. data/lib/zold/version_file.rb +39 -0
  52. data/lib/zold/wallet.rb +17 -4
  53. data/lib/zold/wallets.rb +9 -6
  54. data/test/commands/routines/test_spread.rb +1 -0
  55. data/test/commands/test_alias.rb +7 -0
  56. data/test/commands/test_create.rb +2 -2
  57. data/test/commands/test_fetch.rb +2 -1
  58. data/test/commands/test_merge.rb +2 -0
  59. data/test/commands/test_node.rb +1 -0
  60. data/test/commands/test_pay.rb +24 -0
  61. data/test/commands/test_remote.rb +28 -0
  62. data/test/node/test_async_entrance.rb +6 -13
  63. data/test/node/test_front.rb +2 -1
  64. data/test/test__helper.rb +3 -2
  65. data/test/test_atomic_file.rb +0 -5
  66. data/test/test_copies.rb +14 -2
  67. data/test/test_remotes.rb +12 -0
  68. data/test/test_score.rb +14 -0
  69. data/test/test_tax.rb +5 -0
  70. data/test/test_upgrades.rb +97 -0
  71. data/test/test_version.rb +13 -0
  72. data/test/test_wallet.rb +21 -1
  73. data/test/test_wallets.rb +8 -0
  74. data/upgrades/2.rb +20 -0
  75. data/zold.gemspec +3 -3
  76. metadata +38 -23
  77. data/fixtures/merge/random-expenses/copies/0123456789abcdef/scores +0 -5
  78. data/fixtures/merge/simple-case/copies/0123456789abcdef/scores +0 -1
data/lib/zold/wallets.rb CHANGED
@@ -17,7 +17,7 @@
17
17
  # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
19
  # SOFTWARE.
20
-
20
+ require 'pathname'
21
21
  require_relative 'id'
22
22
  require_relative 'wallet'
23
23
 
@@ -35,8 +35,10 @@ module Zold
35
35
  # @todo #70:30min Let's make it smarter. Instead of returning
36
36
  # the full path let's substract the prefix from it if it's equal
37
37
  # to the current directory in Dir.pwd.
38
- def to_s
39
- path
38
+ def to_s(curr_dir = Dir.pwd)
39
+ curr_path = Pathname.new(path)
40
+ dir_path = Pathname.new(curr_dir)
41
+ curr_path.relative_path_from(dir_path).to_s
40
42
  end
41
43
 
42
44
  def path
@@ -48,11 +50,12 @@ module Zold
48
50
  def all
49
51
  Dir.new(path).select do |f|
50
52
  file = File.join(@dir, f)
53
+ basename = File.basename(f, Wallet::EXTENSION)
51
54
  File.file?(file) &&
52
55
  !File.directory?(file) &&
53
- f =~ /^[0-9a-fA-F]{16}$/ &&
54
- Id.new(f).to_s == f
55
- end
56
+ basename =~ /^[0-9a-fA-F]{16}$/ &&
57
+ Id.new(basename).to_s == basename
58
+ end.map { |w| File.basename(w, Wallet::EXTENSION) }
56
59
  end
57
60
 
58
61
  def find(id)
@@ -24,6 +24,7 @@ require_relative '../../test__helper'
24
24
  require_relative '../../fake_home'
25
25
  require_relative '../../node/fake_node'
26
26
  require_relative '../../../lib/zold/commands/routines/spread.rb'
27
+ require_relative '../../../lib/zold/node/entrance.rb'
27
28
 
28
29
  # Spread test.
29
30
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -0,0 +1,7 @@
1
+ require 'minitest/autorun'
2
+
3
+ # @todo #279:30min Write unit tests for the alias command.
4
+ # It should test all the subcommands (set, remove and show)
5
+ # and any options.
6
+ class TestAlias < Minitest::Test
7
+ end
@@ -37,8 +37,8 @@ class TestCreate < Minitest::Test
37
37
  )
38
38
  assert wallet.balance.zero?
39
39
  assert(
40
- File.exist?(File.join(dir, wallet.id.to_s)),
41
- "Wallet file not found: #{wallet.id}"
40
+ File.exist?(File.join(dir, "#{wallet.id}#{Zold::Wallet::EXTENSION}")),
41
+ "Wallet file not found: #{wallet.id}#{Zold::Wallet::EXTENSION}"
42
42
  )
43
43
  end
44
44
  end
@@ -46,7 +46,8 @@ class TestFetch < Minitest::Test
46
46
  status: 200,
47
47
  body: {
48
48
  'score': Zold::Score::ZERO.to_h,
49
- 'body': File.read(wallet.path)
49
+ 'body': File.read(wallet.path),
50
+ 'mtime': Time.now.utc.iso8601
50
51
  }.to_json
51
52
  )
52
53
  stub_request(:get, "http://localhost:81/wallet/#{wallet.id}").to_return(
@@ -140,6 +140,8 @@ class TestMerge < Minitest::Test
140
140
  Dir.new(base).select { |f| File.directory?(File.join(base, f)) && !f.start_with?('.') }.each do |f|
141
141
  Dir.mktmpdir 'test' do |dir|
142
142
  FileUtils.cp_r(File.join('fixtures/merge', "#{f}/."), dir)
143
+ scores = File.join(dir, 'copies/0123456789abcdef/scores.z')
144
+ File.write(scores, File.read(scores).gsub(/NOW/, Time.now.utc.iso8601))
143
145
  FileUtils.cp('fixtures/merge/asserts.rb', dir)
144
146
  wallets = Zold::Wallets.new(dir)
145
147
  copies = File.join(dir, 'copies')
@@ -48,6 +48,7 @@ class TestNode < Minitest::Test
48
48
  ['push', '--ignore-score-weakness']
49
49
  )
50
50
  copies = home.copies(wallet)
51
+ sleep 2
51
52
  Zold::Fetch.new(
52
53
  wallets: wallets, copies: copies.root,
53
54
  remotes: remotes, log: test_log
@@ -82,4 +82,28 @@ class TestPay < Minitest::Test
82
82
  assert_equal(Zold::Amount::ZERO, source.balance)
83
83
  end
84
84
  end
85
+
86
+ def test_notifies_about_tax_status
87
+ FakeHome.new.run do |home|
88
+ source = home.create_wallet
89
+ target = home.create_wallet
90
+ amount = Zold::Amount.new(zld: 14.95)
91
+ accumulating_log = test_log.dup
92
+ class << accumulating_log
93
+ attr_accessor :info_messages
94
+
95
+ def info(message)
96
+ (@info_messages ||= []) << message
97
+ end
98
+ end
99
+ Zold::Pay.new(wallets: home.wallets, remotes: home.remotes, log: accumulating_log).run(
100
+ [
101
+ 'pay', '--force', '--private-key=fixtures/id_rsa',
102
+ source.id.to_s, target.id.to_s, amount.to_zld, 'For the car'
103
+ ]
104
+ )
105
+ assert_equal accumulating_log.info_messages.grep(/^The tax debt/).size, 1,
106
+ 'No info_messages notified user of tax debt'
107
+ end
108
+ end
85
109
  end
@@ -88,4 +88,32 @@ class TestRemote < Minitest::Test
88
88
  assert_equal(1, winners.count)
89
89
  end
90
90
  end
91
+
92
+ def test_remote_trim_with_tolerate
93
+ Dir.mktmpdir 'test' do |dir|
94
+ remotes = Zold::Remotes.new(File.join(dir, 'remotes.txt'))
95
+ zero = Zold::Score::ZERO
96
+ stub_request(:get, "http://#{zero.host}:#{zero.port}/remotes").to_return(
97
+ status: 200,
98
+ body: {
99
+ version: Zold::VERSION,
100
+ score: zero.to_h,
101
+ all: [
102
+ { host: 'localhost', port: 888 }
103
+ ]
104
+ }.to_json
105
+ )
106
+ stub_request(:get, 'http://localhost:888/remotes').to_return(
107
+ status: 404
108
+ )
109
+ cmd = Zold::Remote.new(remotes: remotes, log: test_log)
110
+ cmd.run(%w[remote clean])
111
+ assert(remotes.all.empty?)
112
+ cmd.run(['remote', 'add', zero.host, zero.port.to_s, '--skip-ping'])
113
+ cmd.run(%w[remote add localhost 888 --skip-ping])
114
+ cmd.run(['remote', 'update', '--ignore-score-weakness'])
115
+ cmd.run(['remote', 'trim', '--tolerate=0'])
116
+ assert_equal(1, remotes.all.count)
117
+ end
118
+ end
91
119
  end
@@ -31,8 +31,8 @@ require_relative 'fake_entrance'
31
31
  # License:: MIT
32
32
  class TestAsyncEntrance < Minitest::Test
33
33
  def test_renders_json
34
- FakeHome.new.run do
35
- Zold::AsyncEntrance.new(FakeEntrance.new, log: test_log).start do |e|
34
+ FakeHome.new.run do |home|
35
+ Zold::AsyncEntrance.new(FakeEntrance.new, home.dir, log: test_log).start do |e|
36
36
  assert_equal(true, e.to_json[:'pool.running'])
37
37
  end
38
38
  end
@@ -45,13 +45,10 @@ class TestAsyncEntrance < Minitest::Test
45
45
  key = Zold::Key.new(file: 'fixtures/id_rsa')
46
46
  wallet.sub(amount, "NOPREFIX@#{Zold::Id.new}", key)
47
47
  basic = CountingEntrance.new
48
- Zold::AsyncEntrance.new(basic, log: test_log).start do |e|
48
+ Zold::AsyncEntrance.new(basic, File.join(home.dir, 'a/b/c'), log: test_log).start do |e|
49
49
  5.times { e.push(wallet.id, File.read(wallet.path)) }
50
- sleep 0.1 until e.to_json[:'pool.completed_task_count'] == 5
51
- assert_equal(5, basic.count)
52
- assert_equal(0, e.to_json[:'pool.queue_length'])
53
- assert_equal(5, e.to_json[:'pool.length'])
54
- assert_equal(5, e.to_json[:'pool.largest_length'])
50
+ sleep 0.1 while basic.count.zero?
51
+ assert(!basic.count.zero?)
55
52
  end
56
53
  end
57
54
  end
@@ -59,12 +56,8 @@ class TestAsyncEntrance < Minitest::Test
59
56
  def test_handles_broken_entrance_gracefully
60
57
  FakeHome.new.run do |home|
61
58
  wallet = home.create_wallet
62
- Zold::AsyncEntrance.new(BrokenEntrance.new, log: test_log).start do |e|
59
+ Zold::AsyncEntrance.new(BrokenEntrance.new, home.dir, log: test_log).start do |e|
63
60
  e.push(wallet.id, File.read(wallet.path))
64
- sleep 0.1 while e.to_json[:'pool.length'].zero?
65
- assert_equal(0, e.to_json[:'pool.queue_length'])
66
- assert_equal(1, e.to_json[:'pool.length'])
67
- assert_equal(1, e.to_json[:'pool.largest_length'])
68
61
  end
69
62
  end
70
63
  end
@@ -84,7 +84,8 @@ class FrontTest < Minitest::Test
84
84
  "/wallet/#{wallet.id}",
85
85
  "/wallet/#{wallet.id}.txt",
86
86
  "/wallet/#{wallet.id}/balance",
87
- "/wallet/#{wallet.id}/key"
87
+ "/wallet/#{wallet.id}/key",
88
+ "/wallet/#{wallet.id}/mtime"
88
89
  ].each do |u|
89
90
  res = Zold::Http.new(u).get
90
91
  assert_equal('200', res.code, res.body)
data/test/test__helper.rb CHANGED
@@ -37,8 +37,9 @@ module Minitest
37
37
  class Test
38
38
  def test_log
39
39
  require_relative '../lib/zold/log'
40
- # @test_log = Zold::Log::Quiet.new
41
- @test_log ||= Zold::Log::Verbose.new
40
+ @test_log = Zold::Log::Verbose.new
41
+ @test_log = Zold::Log::Quiet.new if ENV['TEST_QUIET_LOG']
42
+ @test_log
42
43
  end
43
44
  end
44
45
  end
@@ -42,12 +42,7 @@ class TestAtomicFile < Minitest::Test
42
42
  end
43
43
  end
44
44
 
45
- # @todo #262:30min This test is skipped because it doesn't work. I can't
46
- # understand why. It seems that File.open() creates an empty file first
47
- # which is then being read by File.read() in another thread. Let's find
48
- # out and make AtomicFile truly thread-safe.
49
45
  def test_writes_from_many_threads
50
- skip
51
46
  Dir.mktmpdir 'test' do |dir|
52
47
  file = Zold::AtomicFile.new(File.join(dir, 'a.txt'))
53
48
  threads = 10
data/test/test_copies.rb CHANGED
@@ -22,6 +22,7 @@ require 'minitest/autorun'
22
22
  require 'tmpdir'
23
23
  require 'time'
24
24
  require_relative '../lib/zold/copies'
25
+ require_relative '../lib/zold/wallet'
25
26
 
26
27
  # Copies test.
27
28
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -66,10 +67,10 @@ class TestCopies < Minitest::Test
66
67
  copies = Zold::Copies.new(dir)
67
68
  copies.add('h1', 'zold.io', 50, 80, Time.now - 25 * 60 * 60)
68
69
  copies.add('h1', 'zold.io', 33, 80, Time.now - 26 * 60 * 60)
69
- assert(File.exist?(File.join(dir, '1')))
70
+ assert(File.exist?(File.join(dir, "1#{Zold::Wallet::EXTENSION}")))
70
71
  copies.clean
71
72
  assert(copies.all.empty?, "#{copies.all.count} is not empty")
72
- assert(!File.exist?(File.join(dir, '1')))
73
+ assert(!File.exist?(File.join(dir, "1#{Zold::Wallet::EXTENSION}")))
73
74
  end
74
75
  end
75
76
 
@@ -82,6 +83,17 @@ class TestCopies < Minitest::Test
82
83
  end
83
84
  end
84
85
 
86
+ def test_sorts_them_by_score
87
+ Dir.mktmpdir 'test' do |dir|
88
+ copies = Zold::Copies.new(dir)
89
+ copies.add('content-1', '1.zold.io', 80, 1)
90
+ copies.add('content-2', '2.zold.io', 80, 2)
91
+ copies.add('content-3', '3.zold.io', 80, 50)
92
+ copies.add('content-4', '4.zold.io', 80, 3)
93
+ assert_equal('50 3 2 1', copies.all.map { |c| c[:score] }.join(' '))
94
+ end
95
+ end
96
+
85
97
  def test_ignores_too_old_scores
86
98
  Dir.mktmpdir 'test' do |dir|
87
99
  copies = Zold::Copies.new(dir)
data/test/test_remotes.rb CHANGED
@@ -91,6 +91,18 @@ class TestRemotes < Minitest::Test
91
91
  end
92
92
  end
93
93
 
94
+ def test_log_msg_of_iterates_when_take_too_long
95
+ Dir.mktmpdir 'test' do |dir|
96
+ file = File.join(dir, 'remotes')
97
+ FileUtils.touch(file)
98
+ remotes = Zold::Remotes.new(file)
99
+ remotes.add('127.0.0.1')
100
+ log = TestLogger.new
101
+ remotes.iterate(log) { sleep(17) }
102
+ assert(log.msg.include?('Took too long to execute'))
103
+ end
104
+ end
105
+
94
106
  def test_removes_remotes
95
107
  Dir.mktmpdir 'test' do |dir|
96
108
  file = File.join(dir, 'remotes')
data/test/test_score.rb CHANGED
@@ -21,6 +21,7 @@
21
21
  require 'minitest/autorun'
22
22
  require 'tmpdir'
23
23
  require 'time'
24
+ require_relative 'test__helper'
24
25
  require_relative '../lib/zold/score'
25
26
 
26
27
  # Score test.
@@ -142,4 +143,17 @@ class TestScore < Minitest::Test
142
143
  ).next
143
144
  assert(score.hash.end_with?('000'))
144
145
  end
146
+
147
+ def test_generates_hash_correctly
148
+ score = Zold::Score.new(
149
+ Time.parse('2018-06-27T06:22:41Z'), 'b2.zold.io', 4096,
150
+ 'THdonv1E@abcdabcdabcdabcd', ['3a934b']
151
+ )
152
+ assert_equal('c9c72efbf6beeea13408c5e720ec42aec017c11c3db335e05595c03755000000', score.hash)
153
+ score = Zold::Score.new(
154
+ Time.parse('2018-06-27T06:22:41Z'), 'b2.zold.io', 4096,
155
+ 'THdonv1E@abcdabcdabcdabcd', %w[3a934b 1421217]
156
+ )
157
+ assert_equal('e04ab4e69f86aa17be1316a52148e7bc3187c6d3df581d885a862d8850000000', score.hash)
158
+ end
145
159
  end
data/test/test_tax.rb CHANGED
@@ -20,6 +20,7 @@
20
20
 
21
21
  require 'minitest/autorun'
22
22
  require 'time'
23
+ require_relative 'test__helper'
23
24
  require_relative 'fake_home'
24
25
  require_relative '../lib/zold/id'
25
26
  require_relative '../lib/zold/txn'
@@ -35,6 +36,10 @@ require_relative '../lib/zold/score'
35
36
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
36
37
  # License:: MIT
37
38
  class TestTax < Minitest::Test
39
+ def test_print_fee
40
+ test_log.info("Fee in zents: #{Zold::Tax::FEE_TXN_HOUR.to_i}")
41
+ end
42
+
38
43
  def test_calculates_tax_for_one_year
39
44
  FakeHome.new.run do |home|
40
45
  wallet = home.create_wallet
@@ -0,0 +1,97 @@
1
+ # Copyright (c) 2018 Yegor Bugayenko
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the 'Software'), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in all
11
+ # copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ # SOFTWARE.
20
+
21
+ require 'minitest/autorun'
22
+ require_relative 'test__helper'
23
+ require_relative '../lib/zold/upgrades'
24
+ require_relative '../lib/zold/version_file'
25
+
26
+ # Upgrade test.
27
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
28
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
29
+ # License:: MIT
30
+ class TestUpgrades < Minitest::Test
31
+ # @todo #327:30min Uncomment, when you're ready to work on upgrade manager's
32
+ # test case of absent version file. Start with running the test first.
33
+ def test_no_version_file_is_ok
34
+ skip
35
+ Dir.mktmpdir do |dir|
36
+ script_version = '0.0.1'
37
+ create_upgrade_file(dir, script_version)
38
+ assert_output(/#{expected_upgrade_script_output(script_version)}/) do
39
+ run_upgrades(dir)
40
+ end
41
+ end
42
+ end
43
+
44
+ # @todo #327:30min Uncomment, when you're ready to work on upgrade manager's
45
+ # test case of running only pending upgrade scripts (i.e. the scripts with
46
+ # versions greater than those in the version file).
47
+ def test_pending_scripts_run
48
+ skip
49
+ Dir.mktmpdir do |dir|
50
+ %w[0.0.1 0.0.2].each do |script_version|
51
+ create_upgrade_file(dir, script_version)
52
+ end
53
+ create_version_file(dir, '0.0.1')
54
+ assert_output(/#{expected_upgrade_script_output('0.0.2')}/) do
55
+ run_upgrades(dir)
56
+ end
57
+ end
58
+ end
59
+
60
+ def test_already_ran_scripts_dont_run
61
+ Dir.mktmpdir do |dir|
62
+ %w[0.0.1 0.0.2].each do |script_version|
63
+ create_upgrade_file(dir, script_version)
64
+ end
65
+ create_version_file(dir, '0.0.1')
66
+ out, _err = capture_io do
67
+ run_upgrades(dir)
68
+ end
69
+ refute_match(/#{expected_upgrade_script_output('0.0.1')}/, out)
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def run_upgrades(dir)
76
+ Zold::Upgrades.new(version_file(dir), dir).run
77
+ end
78
+
79
+ def version_file(dir)
80
+ Zold::VersionFile.new(File.join(dir, 'version'))
81
+ end
82
+
83
+ def create_version_file(dir, version)
84
+ IO.write(File.join(dir, 'version'), version)
85
+ end
86
+
87
+ def create_upgrade_file(dir, version)
88
+ IO.write(
89
+ File.join(dir, "#{version}.rb"),
90
+ "puts \"#{expected_upgrade_script_output(version)}\""
91
+ )
92
+ end
93
+
94
+ def expected_upgrade_script_output(version)
95
+ "upgrading to #{version}"
96
+ end
97
+ end
@@ -0,0 +1,13 @@
1
+ require 'semantic'
2
+ require 'zold/version'
3
+ require 'minitest/autorun'
4
+
5
+ class TestVersion < Minitest::Test
6
+ def test_has_version
7
+ assert Semantic::Version.new(Zold::VERSION)
8
+ end
9
+
10
+ def test_has_protocol
11
+ assert Zold::PROTOCOL
12
+ end
13
+ end
data/test/test_wallet.rb CHANGED
@@ -44,7 +44,6 @@ class TestWallet < Minitest::Test
44
44
  wallet.balance == amount * -3,
45
45
  "#{wallet.balance} is not equal to #{amount * -3}"
46
46
  )
47
- assert_equal('1', wallet.version)
48
47
  end
49
48
  end
50
49
 
@@ -83,6 +82,27 @@ class TestWallet < Minitest::Test
83
82
  end
84
83
  end
85
84
 
85
+ def test_returns_modified_time
86
+ FakeHome.new.run do |home|
87
+ wallet = home.create_wallet
88
+ assert(wallet.mtime > Time.now - 60 * 60)
89
+ end
90
+ end
91
+
92
+ def test_returns_digest
93
+ FakeHome.new.run do |home|
94
+ wallet = home.create_wallet
95
+ assert_equal(64, wallet.digest.length)
96
+ end
97
+ end
98
+
99
+ def test_returns_protocol
100
+ FakeHome.new.run do |home|
101
+ wallet = home.create_wallet
102
+ assert_equal(Zold::PROTOCOL, wallet.protocol)
103
+ end
104
+ end
105
+
86
106
  def test_iterates_income_transactions
87
107
  FakeHome.new.run do |home|
88
108
  wallet = home.create_wallet
data/test/test_wallets.rb CHANGED
@@ -50,4 +50,12 @@ class TestWallets < Minitest::Test
50
50
  assert_equal(1, wallets.all.count)
51
51
  end
52
52
  end
53
+
54
+ def test_substracts_dir_path_from_full_path
55
+ FakeHome.new.run do |home|
56
+ wallets = home.wallets
57
+ path = wallets.path
58
+ assert_equal('.', wallets.to_s(path))
59
+ end
60
+ end
53
61
  end
data/upgrades/2.rb ADDED
@@ -0,0 +1,20 @@
1
+ # https://github.com/zold-io/zold/issues/358
2
+ # rename all wallets from their current names into *.z
3
+
4
+ module Zold
5
+ # Upgrade to version 2
6
+ class UpgradeTo2
7
+ def initialize(home, log)
8
+ @home = home
9
+ @log = log
10
+ end
11
+
12
+ def exec
13
+ Dir.new(@home).each do |path|
14
+ next unless path =~ /^[a-f0-9]{16}$/
15
+ File.rename(path, "#{path}.z")
16
+ @log.info("Renamed #{path} to #{path}.z")
17
+ end
18
+ end
19
+ end
20
+ end
data/zold.gemspec CHANGED
@@ -37,7 +37,7 @@ Gem::Specification.new do |s|
37
37
  their ability to become an alternative financial instrument in many
38
38
  different markets. Most of the technologies available at the moment are
39
39
  based on the principles of Blockchain architecture, including
40
- dominating currencies like Bitcoin and Etherium. Despite its
40
+ dominating currencies like Bitcoin and Ethereum. Despite its
41
41
  popularity, Blockchain is not the best possible solution for all scenarios.
42
42
  One such example is for fast micro-payments.
43
43
  Zold is an experimental alternative that enables distributed transactions between
@@ -59,8 +59,8 @@ and suggests a different architecture for digital wallet maintenance.'
59
59
  s.add_runtime_dependency 'openssl', '~>2.1'
60
60
  s.add_runtime_dependency 'rainbow', '~>3.0'
61
61
  s.add_runtime_dependency 'rake', '~>12.3' # has to stay here for Heroku
62
- s.add_runtime_dependency 'rubocop', '~>0.52' # has to stay here for Heroku
63
- s.add_runtime_dependency 'rubocop-rspec', '~>1.23' # has to stay here for Heroku
62
+ s.add_runtime_dependency 'rubocop', '0.58.1' # has to stay here for Heroku
63
+ s.add_runtime_dependency 'rubocop-rspec', '1.27.0' # has to stay here for Heroku
64
64
  s.add_runtime_dependency 'semantic', '~>1.6'
65
65
  s.add_runtime_dependency 'sigdump', '~>0.2'
66
66
  s.add_runtime_dependency 'sinatra', '~>2.0'